blob: bc4edea3b9fb8a63fcf81eea6d7b71c653195b27 [file] [log] [blame]
"""Tests for the devices REST API."""
from django.urls import reverse
from rest_framework import status
from crashreports.tests.utils import Dummy, HiccupCrashreportsAPITestCase
class DeviceTestCase(HiccupCrashreportsAPITestCase):
"""Test cases for registering devices."""
# pylint: disable=too-many-ancestors
def test_register(self):
"""Test registration of devices."""
response = self.client.post(
reverse(self.REGISTER_DEVICE_URL), Dummy.device_register_data()
)
self.assertTrue("token" in response.data)
self.assertTrue("uuid" in response.data)
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_create_missing_fields(self):
"""Test registration with missing fields."""
response = self.client.post(reverse(self.REGISTER_DEVICE_URL))
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_create_missing_board_date(self):
"""Test registration with missing board date."""
data = Dummy.device_register_data()
data.pop("board_date")
response = self.client.post(reverse(self.REGISTER_DEVICE_URL), data)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_create_missing_chipset(self):
"""Test registration with missing chipset."""
data = Dummy.device_register_data()
data.pop("chipset")
response = self.client.post(reverse(self.REGISTER_DEVICE_URL), data)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_create_invalid_board_date(self):
"""Test registration with invalid board date."""
data = Dummy.device_register_data()
data["board_date"] = "not_a_valid_date"
response = self.client.post(reverse(self.REGISTER_DEVICE_URL), data)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_create_non_existent_time_board_date(self):
"""Test registration with non existing time.
Test the resolution of a naive date-time in which the
Europe/Amsterdam daylight saving time transition moved the time
"forward". The server should not crash when receiving a naive
date-time which does not exist in the server timezone or locale.
"""
data = Dummy.device_register_data()
# In 2017, the Netherlands changed from CET to CEST on March,
# 26 at 02:00
data["board_date"] = "2017-03-26 02:34:56"
response = self.client.post(reverse(self.REGISTER_DEVICE_URL), data)
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_create_ambiguous_time_board_date(self):
"""Test registration with ambiguous time.
Test the resolution of a naive date-time in which the
Europe/Amsterdam daylight saving time transition moved the time
"backward". The server should not crash when receiving a naive
date-time that can belong to multiple timezones.
"""
data = Dummy.device_register_data()
# In 2017, the Netherlands changed from CEST to CET on October,
# 29 at 03:00
data["board_date"] = "2017-10-29 02:34:56"
response = self.client.post(reverse(self.REGISTER_DEVICE_URL), data)
self.assertEqual(response.status_code, status.HTTP_200_OK)
class ListDevicesTestCase(HiccupCrashreportsAPITestCase):
"""Test cases for listing and deleting devices."""
# pylint: disable=too-many-ancestors
LIST_CREATE_URL = "api_v1_list_devices"
RETRIEVE_URL = "api_v1_retrieve_device"
def test_device_list(self):
"""Test registration of 2 devices."""
number_of_devices = 2
uuids = [
str(self._register_device()[0]) for _ in range(number_of_devices)
]
response = self.fp_staff_client.get(reverse(self.LIST_CREATE_URL), {})
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data["results"]), number_of_devices)
for result in response.data["results"]:
self.assertIn(result["uuid"], uuids)
def test_device_list_unauth(self):
"""Test listing devices without authentication."""
response = self.client.get(reverse(self.LIST_CREATE_URL), {})
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
def test_retrieve_device_auth(self):
"""Test retrieval of devices as Fairphone staff user."""
uuid, _, token = self._register_device()
response = self.fp_staff_client.get(
reverse(self.RETRIEVE_URL, args=[uuid]), {}
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data["uuid"], str(uuid))
self.assertEqual(response.data["token"], token)
def test_retrieve_device_unauth(self):
"""Test retrieval of devices without authentication."""
uuid, _, _ = self._register_device()
response = self.client.get(reverse(self.RETRIEVE_URL, args=[uuid]), {})
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
def test_delete_device_auth(self):
"""Test deletion of devices as Fairphone staff user."""
uuid, _, _ = self._register_device()
url = reverse(self.RETRIEVE_URL, args=[uuid])
response = self.fp_staff_client.delete(url, {})
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
response = self.fp_staff_client.delete(url, {})
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)