blob: 7b954fbcd9818086973b14d7f307c063c1b5fc51 [file] [log] [blame]
Dirk Vogtc9e10ab2016-10-12 13:58:15 +02001from django.contrib.auth.models import User
Dirk Vogtf2a33422016-10-11 17:17:26 +02002from rest_framework.test import APITestCase
3from rest_framework.test import APIClient
Dirk Vogt36635692016-10-17 12:19:10 +02004from rest_framework import status
Dirk Vogt36635692016-10-17 12:19:10 +02005import tempfile
Dirk Vogtf130c752016-08-23 14:45:01 +02006
Borjan Tchakaloffec814a72018-02-28 11:16:53 +04007
8class Dummy(object):
9 DEFAULT_DUMMY_DEVICE_REGISTER_VALUES = {
10 'board_date': '2015-12-15T01:23:45Z',
11 'chipset': 'Qualcomm MSM8974PRO-AA',
12 }
13
14 DEFAULT_DUMMY_HEARTBEAT_VALUES = {
15 'uuid': None,
16 'app_version': 10100,
17 'uptime': (
18 'up time: 16 days, 21:49:56, idle time: 5 days, 20:55:04, '
19 'sleep time: 10 days, 20:46:27'),
20 'build_fingerprint': (
21 'Fairphone/FP2/FP2:6.0.1/FP2-gms-18.03.1/FP2-gms-18.03.1:user/'
22 'release-keys'),
23 'radio_version': '4437.1-FP2-0-08',
24 'date': '2018-03-19T09:58:30.386Z',
25 }
26
27 DEFAULT_DUMMY_CRASHREPORTS_VALUES = DEFAULT_DUMMY_HEARTBEAT_VALUES.copy()
28 DEFAULT_DUMMY_CRASHREPORTS_VALUES.update({
29 'is_fake_report': 0,
30 'boot_reason': 'why?',
31 'power_on_reason': 'it was powered on',
32 'power_off_reason': 'something happened and it went off',
33 })
34
35 @staticmethod
36 def _update_copy(original, update):
37 """Merge fields of update into a copy of original"""
38 data = original.copy()
39 data.update(update)
40 return data
41
42 @staticmethod
43 def device_register_data(**kwargs):
44 """
45 Return the data required to register a device.
46
47 Use the values passed as keyword arguments or default to
48 the ones from `Dummy.DEFAULT_DUMMY_DEVICE_REGISTER_VALUES`.
49 """
50 return Dummy._update_copy(
51 Dummy.DEFAULT_DUMMY_DEVICE_REGISTER_VALUES, kwargs)
52
53 @staticmethod
54 def heartbeat_data(**kwargs):
55 """
56 Return the data required to create a heartbeat.
57
58 Use the values passed as keyword arguments or default to
59 the ones from `Dummy.DEFAULT_DUMMY_HEARTBEAT_VALUES`.
60 """
61 return Dummy._update_copy(Dummy.DEFAULT_DUMMY_HEARTBEAT_VALUES, kwargs)
62
63 @staticmethod
64 def crashreport_data(**kwargs):
65 """
66 Return the data required to create a crashreport.
67
68 Use the values passed as keyword arguments or default to
69 the ones from `Dummy.DEFAULT_DUMMY_CRASHREPORTS_VALUES`.
70 """
71 return Dummy._update_copy(
72 Dummy.DEFAULT_DUMMY_CRASHREPORTS_VALUES, kwargs)
Dirk Vogtf2a33422016-10-11 17:17:26 +020073
74
75class DeviceTestCase(APITestCase):
76
77 def setUp(self):
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +010078 self.url = "/hiccup/api/v1/devices/register/"
Dirk Vogtf2a33422016-10-11 17:17:26 +020079
80 def test(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +040081 request = self.client.post(self.url, Dummy.device_register_data())
Dirk Vogtf2a33422016-10-11 17:17:26 +020082 self.assertTrue("token" in request.data)
83 self.assertTrue("uuid" in request.data)
Dirk Vogt36635692016-10-17 12:19:10 +020084 self.assertEqual(request.status_code, status.HTTP_200_OK)
Dirk Vogtf2a33422016-10-11 17:17:26 +020085
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +010086 def test_create_missing_fields(self):
87 request = self.client.post(self.url)
88 self.assertEqual(request.status_code, status.HTTP_400_BAD_REQUEST)
89
90 def test_create_missing_board_date(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +040091 data = Dummy.device_register_data()
92 data.pop('board_date')
93 request = self.client.post(self.url, data)
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +010094 self.assertEqual(request.status_code, status.HTTP_400_BAD_REQUEST)
95
96 def test_create_missing_chipset(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +040097 data = Dummy.device_register_data()
98 data.pop('chipset')
99 request = self.client.post(self.url, data)
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +0100100 self.assertEqual(request.status_code, status.HTTP_400_BAD_REQUEST)
101
102 def test_create_invalid_board_date(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400103 data = Dummy.device_register_data()
104 data['board_date'] = 'not_a_valid_date'
105 request = self.client.post(self.url, data)
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +0100106 self.assertEqual(request.status_code, status.HTTP_400_BAD_REQUEST)
107
Borjan Tchakaloff866f75e2018-03-01 12:04:00 +0400108 def test_create_non_existent_time_board_date(self):
109 """
110 Test the resolution of a naive date-time in which the Europe/Amsterdam daylight saving
111 time transition moved the time "forward".
112 """
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400113 data = Dummy.device_register_data()
Borjan Tchakaloff866f75e2018-03-01 12:04:00 +0400114 # In 2017, the Netherlands changed from CET to CEST on March, 26 at 02:00
115 data['board_date'] = '2017-03-26 02:34:56'
116 request = self.client.post(self.url, data)
117 self.assertEqual(request.status_code, status.HTTP_200_OK)
118
119 def test_create_ambiguous_time_board_date(self):
120 """
121 Test the resolution of a naive date-time in which the Europe/Amsterdam daylight saving
122 time transition moved the time "backward".
123 """
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400124 data = Dummy.device_register_data()
Borjan Tchakaloff866f75e2018-03-01 12:04:00 +0400125 # In 2017, the Netherlands changed from CEST to CET on October, 29 at 03:00
126 data['board_date'] = '2017-10-29 02:34:56'
127 request = self.client.post(self.url, data)
128 self.assertEqual(request.status_code, status.HTTP_200_OK)
129
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +0100130
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400131class DeviceRegisterAPITestCase(APITestCase):
132 """Base class that offers device registration as well as base users
Dirk Vogtf2a33422016-10-11 17:17:26 +0200133
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400134 Attributes:
135 number_of_devices_created (int): The number of devices created in the
136 database.
137 """
Dirk Vogtf2a33422016-10-11 17:17:26 +0200138
139 def setUp(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400140 self.number_of_devices_created = 0
141
142 _, response_data = self._register_device()
143 self.uuid = response_data['uuid']
144 self.token = response_data['token']
145 self.user = APIClient()
146 self.user.credentials(HTTP_AUTHORIZATION='Token ' + self.token)
147
148 _, response_data = self._register_device()
149 self.other_uuid = response_data['uuid']
150 self.other_token = response_data['token']
151 self.other_user = APIClient()
152 self.other_user.credentials(
153 HTTP_AUTHORIZATION='Token ' + self.other_token)
154
155 self.noauth_client = APIClient()
156
157 self.admin_user = User.objects.create_superuser(
158 'somebody', 'somebody@example.com', 'thepassword')
159 self.admin = APIClient()
160 self.admin.force_authenticate(self.admin_user)
161
162 def _register_device(self, **kwargs):
163 """Register a new device
164
165 Arguments:
166 **kwargs: The data to pass the dummy data creation
167 method `Dummy.device_register_data`.
168 Returns:
169 (dict(str, str), dict(str, str)): The tuple composed of the device
170 data that was used for the registration and the data returned by
171 the server in return.
172 """
173 data = Dummy.device_register_data(**kwargs)
174 response = self.client.post("/hiccup/api/v1/devices/register/", data)
175 self.assertEqual(response.status_code, status.HTTP_200_OK)
176 self.number_of_devices_created += 1
177
178 return (data, response.data)
179
180
181class ListDevicesTestCase(DeviceRegisterAPITestCase):
Dirk Vogtf2a33422016-10-11 17:17:26 +0200182
183 def test_device_list(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400184 request = self.admin.get("/hiccup/api/v1/devices/", {})
185 self.assertIsNot(request.data['results'][1]['uuid'], '')
186 self.assertEqual(
187 len(request.data['results']), self.number_of_devices_created)
Dirk Vogt36635692016-10-17 12:19:10 +0200188 self.assertEqual(request.status_code, status.HTTP_200_OK)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200189
190 def test_device_list_unauth(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400191 request = self.client.get("/hiccup/api/v1/devices/", {})
Dirk Vogt36635692016-10-17 12:19:10 +0200192 self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200193
194 def test_retrieve_device_auth(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400195 request = self.admin.get(
196 "/hiccup/api/v1/devices/{}/".format(self.uuid), {})
Dirk Vogt36635692016-10-17 12:19:10 +0200197 self.assertEqual(request.status_code, status.HTTP_200_OK)
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400198 self.assertEqual(request.data['uuid'], str(self.uuid))
199 self.assertEqual(request.data['token'], self.token)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200200
201 def test_retrieve_device_unauth(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400202 request = self.client.get(
203 "/hiccup/api/v1/devices/{}/".format(self.uuid), {})
Dirk Vogt36635692016-10-17 12:19:10 +0200204 self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200205
206 def test_delete_device_auth(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400207 url = "/hiccup/api/v1/devices/{}/".format(self.other_uuid)
208 request = self.admin.delete(url, {})
Dirk Vogt36635692016-10-17 12:19:10 +0200209 self.assertEqual(request.status_code, status.HTTP_204_NO_CONTENT)
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400210 request = self.admin.delete(url, {})
Dirk Vogt36635692016-10-17 12:19:10 +0200211 self.assertEqual(request.status_code, status.HTTP_404_NOT_FOUND)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200212
Dirk Vogtf2a33422016-10-11 17:17:26 +0200213
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400214class HeartbeatListTestCase(DeviceRegisterAPITestCase):
215
216 @staticmethod
217 def _create_dummy_data(**kwargs):
218 return Dummy.heartbeat_data(**kwargs)
219
220 def _post_multiple(self, client, data, count):
221 return [client.post(self.url, data) for _ in range(count)]
222
223 def _retrieve_single(self, user):
224 count = 5
Borjan Tchakaloff3340e482018-03-19 15:16:25 +0400225 requests = self._post_multiple(self.admin, self.data, count)
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400226 self.assertEqual(len(requests), count)
227 self.assertEqual(requests[0].status_code, status.HTTP_201_CREATED)
Borjan Tchakaloff3340e482018-03-19 15:16:25 +0400228 url = "{url}{id}/".format(url=self.url, id=requests[0].data['id'])
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400229 request = user.get(url)
230 return request.status_code
231
232 def _retrieve_single_by_device(self, user):
233 count = 5
234 requests = self._post_multiple(self.user, self.data, count)
235 self.assertEqual(len(requests), count)
236 self.assertEqual(requests[0].status_code, status.HTTP_201_CREATED)
Borjan Tchakaloff3340e482018-03-19 15:16:25 +0400237 url = "{url}{id}/".format(
238 url=self.url_by_uuid.format(self.uuid),
239 id=requests[0].data['device_local_id'])
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400240 request = user.get(url)
241 return request.status_code
Dirk Vogtf2a33422016-10-11 17:17:26 +0200242
243 def setUp(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400244 super(HeartbeatListTestCase, self).setUp()
245 self.data = self._create_dummy_data(uuid=self.uuid)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200246 self.url = "/hiccup/api/v1/heartbeats/"
Dirk Vogte1784882016-10-13 16:09:38 +0200247 self.url_by_uuid = "/hiccup/api/v1/devices/{}/heartbeats/"
Dirk Vogt67eb1482016-10-13 12:42:56 +0200248
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200249 def test_create_no_auth(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200250 request = self.noauth_client.post(self.url, self.data)
Dirk Vogt36635692016-10-17 12:19:10 +0200251 self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200252
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200253 def test_create_as_admin(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200254 request = self.admin.post(self.url, self.data)
Dirk Vogt36635692016-10-17 12:19:10 +0200255 self.assertEqual(request.status_code, status.HTTP_201_CREATED)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200256 self.assertTrue(request.data['id'] > 0)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200257
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200258 def test_create_as_admin_not_existing_device(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400259 request = self.admin.post(self.url, self._create_dummy_data())
Dirk Vogt36635692016-10-17 12:19:10 +0200260 self.assertEqual(request.status_code, status.HTTP_404_NOT_FOUND)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200261
262 def test_create_as_uuid_owner(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400263 request = self.user.post(
264 self.url, self._create_dummy_data(uuid=self.uuid))
Dirk Vogt36635692016-10-17 12:19:10 +0200265 self.assertEqual(request.status_code, status.HTTP_201_CREATED)
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400266 self.assertEqual(request.data['id'], -1)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200267
268 def test_create_as_uuid_not_owner(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400269 request = self.user.post(
270 self.url, self._create_dummy_data(uuid=self.other_uuid))
Dirk Vogt36635692016-10-17 12:19:10 +0200271 self.assertEqual(request.status_code, status.HTTP_403_FORBIDDEN)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200272
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200273 def test_list(self):
274 count = 5
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400275 self._post_multiple(self.user, self.data, count)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200276 request = self.admin.get(self.url)
Dirk Vogt36635692016-10-17 12:19:10 +0200277 self.assertEqual(request.status_code, status.HTTP_200_OK)
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400278 self.assertEqual(len(request.data['results']), count)
Franz-Xaver Geigerd612fd22018-02-28 10:33:08 +0100279
280 def test_retrieve_single_admin(self):
281 self.assertEqual(
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400282 self._retrieve_single(self.admin), status.HTTP_200_OK)
Dirk Vogte1784882016-10-13 16:09:38 +0200283
284 def test_retrieve_single_device_owner(self):
Franz-Xaver Geigerd612fd22018-02-28 10:33:08 +0100285 self.assertEqual(
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400286 self._retrieve_single(self.user), status.HTTP_403_FORBIDDEN)
287
288 def test_retrieve_single_noauth(self):
289 self.assertEqual(
290 self._retrieve_single(self.noauth_client),
Franz-Xaver Geigerd612fd22018-02-28 10:33:08 +0100291 status.HTTP_401_UNAUTHORIZED)
Dirk Vogte1784882016-10-13 16:09:38 +0200292
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400293 def test_retrieve_single_by_device_admin(self):
Franz-Xaver Geigerd612fd22018-02-28 10:33:08 +0100294 self.assertEqual(
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400295 self._retrieve_single_by_device(self.admin), status.HTTP_200_OK)
Dirk Vogt0d9d5d22016-10-13 16:17:57 +0200296
297 def test_retrieve_single_by_device_device_owner(self):
Franz-Xaver Geigerd612fd22018-02-28 10:33:08 +0100298 self.assertEqual(
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400299 self._retrieve_single_by_device(self.user),
300 status.HTTP_403_FORBIDDEN)
301
302 def test_retrieve_single_by_device_noauth(self):
303 self.assertEqual(
304 self._retrieve_single_by_device(self.noauth_client),
Franz-Xaver Geigerd612fd22018-02-28 10:33:08 +0100305 status.HTTP_401_UNAUTHORIZED)
Dirk Vogt0d9d5d22016-10-13 16:17:57 +0200306
Dirk Vogte1784882016-10-13 16:09:38 +0200307 def test_list_by_uuid(self):
308 count = 5
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400309 self._post_multiple(self.user, self.data, count)
310 self._post_multiple(
311 self.admin, self._create_dummy_data(uuid=self.other_uuid), count)
Dirk Vogte1784882016-10-13 16:09:38 +0200312 url = self.url_by_uuid.format(self.uuid)
313 request = self.admin.get(url)
Dirk Vogt36635692016-10-17 12:19:10 +0200314 self.assertEqual(request.status_code, status.HTTP_200_OK)
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400315 self.assertEqual(len(request.data['results']), count)
Dirk Vogte1784882016-10-13 16:09:38 +0200316
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200317 def test_list_noauth(self):
318 count = 5
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400319 self._post_multiple(self.user, self.data, count)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200320 request = self.noauth_client.get(self.url)
Dirk Vogt36635692016-10-17 12:19:10 +0200321 self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200322
323 def test_list_device_owner(self):
324 count = 5
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400325 self._post_multiple(self.user, self.data, count)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200326 request = self.user.get(self.url)
Dirk Vogt36635692016-10-17 12:19:10 +0200327 self.assertEqual(request.status_code, status.HTTP_403_FORBIDDEN)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200328
Borjan Tchakaloff869cf922018-02-19 11:01:16 +0100329 def test_no_radio_version(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400330 data = self._create_dummy_data(uuid=self.uuid)
Borjan Tchakaloff869cf922018-02-19 11:01:16 +0100331 data.pop('radio_version')
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400332 request = self.user.post(self.url, data)
333 self.assertEqual(request.status_code, status.HTTP_201_CREATED)
Borjan Tchakaloff869cf922018-02-19 11:01:16 +0100334 url = self.url_by_uuid.format(self.uuid)
335 request = self.admin.get(url)
336 self.assertEqual(request.status_code, status.HTTP_200_OK)
337 self.assertEqual(len(request.data['results']), 1)
338 self.assertIsNone(request.data['results'][0]['radio_version'])
339
340 def test_radio_version_field(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400341 request = self.user.post(self.url, self.data)
342 self.assertEqual(request.status_code, status.HTTP_201_CREATED)
Borjan Tchakaloff869cf922018-02-19 11:01:16 +0100343 url = self.url_by_uuid.format(self.uuid)
344 request = self.admin.get(url)
345 self.assertEqual(request.status_code, status.HTTP_200_OK)
346 self.assertEqual(len(request.data['results']), 1)
347 self.assertEqual(request.data['results'][0]['radio_version'],
348 self.data['radio_version'])
349
Borjan Tchakaloff866f75e2018-03-01 12:04:00 +0400350 def test_send_non_existent_time(self):
351 """
352 Test the resolution of a naive date-time in which the Europe/Amsterdam daylight saving
353 time transition moved the time "forward".
354 """
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400355 data = self._create_dummy_data(uuid=self.uuid)
Borjan Tchakaloff866f75e2018-03-01 12:04:00 +0400356 # In 2017, the Netherlands changed from CET to CEST on March, 26 at 02:00
357 data['date'] = '2017-03-26 02:34:56'
358 request = self.user.post(self.url, data)
359 self.assertEqual(request.status_code, status.HTTP_201_CREATED)
360
361 def test_send_ambiguous_time(self):
362 """
363 Test the resolution of a naive date-time in which the Europe/Amsterdam daylight saving
364 time transition moved the time "backward".
365 """
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400366 data = self._create_dummy_data(uuid=self.uuid)
Borjan Tchakaloff866f75e2018-03-01 12:04:00 +0400367 # In 2017, the Netherlands changed from CEST to CET on October, 29 at 03:00
368 data['date'] = '2017-10-29 02:34:56'
369 request = self.user.post(self.url, data)
370 self.assertEqual(request.status_code, status.HTTP_201_CREATED)
371
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200372
373class CrashreportListTestCase(HeartbeatListTestCase):
374
375 def setUp(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400376 super(CrashreportListTestCase, self).setUp()
Dirk Vogt67eb1482016-10-13 12:42:56 +0200377 self.url = "/hiccup/api/v1/crashreports/"
Dirk Vogte1784882016-10-13 16:09:38 +0200378 self.url_by_uuid = "/hiccup/api/v1/devices/{}/crashreports/"
Dirk Vogt67eb1482016-10-13 12:42:56 +0200379
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400380 @staticmethod
381 def _create_dummy_data(**kwargs):
382 return Dummy.crashreport_data(**kwargs)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200383
384
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400385class LogfileUploadTest(DeviceRegisterAPITestCase):
386
Dirk Vogt67eb1482016-10-13 12:42:56 +0200387 def setUp(self):
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400388 super(LogfileUploadTest, self).setUp()
Dirk Vogt67eb1482016-10-13 12:42:56 +0200389
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400390 for uuid in [self.uuid, self.other_uuid]:
391 data = Dummy.crashreport_data(uuid=uuid)
392 for _ in range(2):
393 self.user.post("/hiccup/api/v1/crashreports/", data)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200394
Dirk Vogt36635692016-10-17 12:19:10 +0200395 def get_url(self, uuid, report_id, filename):
396 return ("/hiccup/api/v1/devices/{}/crashreports/{}/logfile_put/{}/".
397 format(uuid, report_id, "test.log"))
398
Dirk Vogt67eb1482016-10-13 12:42:56 +0200399 def test_Logfile_upload_as_admin(self):
Dirk Vogt36635692016-10-17 12:19:10 +0200400 f = tempfile.NamedTemporaryFile('w+', suffix=".log", delete=True)
401 f.write(u"blihblahblub")
Borjan Tchakaloffec814a72018-02-28 11:16:53 +0400402 request = self.admin.post(
Dirk Vogt36635692016-10-17 12:19:10 +0200403 self.get_url(self.uuid, 1, f.name),
404 {'file': f}, format="multipart")
405 self.assertEqual(status.HTTP_201_CREATED, request.status_code)