blob: ea29d576fbcb64e6928410058419efd821c58be8 [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 Vogtc9e10ab2016-10-12 13:58:15 +02005import datetime
Dirk Vogt36635692016-10-17 12:19:10 +02006import tempfile
Dirk Vogtf130c752016-08-23 14:45:01 +02007
8# Create your tests here.
Dirk Vogtf2a33422016-10-11 17:17:26 +02009
10
11class DeviceTestCase(APITestCase):
12
13 def setUp(self):
14 pass
15
16 def test(self):
Dirk Vogt8e656152017-05-04 23:12:13 +020017 request = self.client.post("/hiccup/api/v1/devices/register/", device_register_data)
Dirk Vogtf2a33422016-10-11 17:17:26 +020018 self.assertTrue("token" in request.data)
19 self.assertTrue("uuid" in request.data)
Dirk Vogt36635692016-10-17 12:19:10 +020020 self.assertEqual(request.status_code, status.HTTP_200_OK)
Dirk Vogtf2a33422016-10-11 17:17:26 +020021
22# Create your tests here.
23
Dirk Vogt8e656152017-05-04 23:12:13 +020024device_register_data = {
25 "board_date": str(datetime.datetime(year=2016, month=1, day=1)),
26 "chipset": "chipset"
Dirk Vogtf2a33422016-10-11 17:17:26 +020027
Dirk Vogt8e656152017-05-04 23:12:13 +020028}
Dirk Vogtf2a33422016-10-11 17:17:26 +020029class ListDevicesTestCase(APITestCase):
30
31 def setUp(self):
32 self.password = "test"
33 self.admin = User.objects.create_superuser(
34 'myuser', 'myemail@test.com', self.password)
Dirk Vogt8e656152017-05-04 23:12:13 +020035 self.client.post("/hiccup/api/v1/devices/register/", device_register_data)
36 request = self.client.post("/hiccup/api/v1/devices/register/", device_register_data)
Dirk Vogtf2a33422016-10-11 17:17:26 +020037 self.uuid_to_retrieve = request.data['uuid']
38 self.token_to_retrieve = request.data['token']
Dirk Vogt8e656152017-05-04 23:12:13 +020039 request = self.client.post("/hiccup/api/v1/devices/register/", device_register_data)
Dirk Vogtf2a33422016-10-11 17:17:26 +020040 self.uuid_to_delete = request.data['uuid']
41 self.token_to_delete = request.data['token']
42
43 def test_device_list(self):
44 client = APIClient()
45 client.login(username='myuser', password='test')
46 request = client.get("/hiccup/api/v1/devices/", {})
Dirk Vogt8e656152017-05-04 23:12:13 +020047 self.assertTrue(request.data['results'][1]['uuid'] is not '')
48 self.assertTrue(len(request.data['results']) >= 3)
Dirk Vogt36635692016-10-17 12:19:10 +020049 self.assertEqual(request.status_code, status.HTTP_200_OK)
Dirk Vogtf2a33422016-10-11 17:17:26 +020050 client.logout()
51
52 def test_device_list_unauth(self):
53 client = APIClient()
54 request = client.get("/hiccup/api/v1/devices/", {})
Dirk Vogt36635692016-10-17 12:19:10 +020055 self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
Dirk Vogtf2a33422016-10-11 17:17:26 +020056
57 def test_retrieve_device_auth(self):
58 client = APIClient()
59 client.login(username='myuser', password='test')
60 request = client.get(
61 "/hiccup/api/v1/devices/{}/".format(self.uuid_to_retrieve), {})
Dirk Vogt36635692016-10-17 12:19:10 +020062 self.assertEqual(request.status_code, status.HTTP_200_OK)
Dirk Vogtf2a33422016-10-11 17:17:26 +020063 self.assertEqual(request.data['uuid'], str(self.uuid_to_retrieve))
64 self.assertEqual(request.data['token'], self.token_to_retrieve)
65 client.logout()
66
67 def test_retrieve_device_unauth(self):
68 client = APIClient()
69 request = client.get(
70 "/hiccup/api/v1/devices/{}/".format(self.uuid_to_retrieve), {})
Dirk Vogt36635692016-10-17 12:19:10 +020071 self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
Dirk Vogtf2a33422016-10-11 17:17:26 +020072
73 def test_delete_device_auth(self):
74 client = APIClient()
75 client.login(username='myuser', password='test')
76 url = "/hiccup/api/v1/devices/{}/".format(self.uuid_to_delete)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020077 request = client.delete(
78 url.format(self.uuid_to_delete), {})
Dirk Vogt36635692016-10-17 12:19:10 +020079 self.assertEqual(request.status_code, status.HTTP_204_NO_CONTENT)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020080 request = client.delete(
81 url.format(self.uuid_to_delete), {})
Dirk Vogt36635692016-10-17 12:19:10 +020082 self.assertEqual(request.status_code, status.HTTP_404_NOT_FOUND)
Dirk Vogtf2a33422016-10-11 17:17:26 +020083 client.logout()
84
Dirk Vogtf2a33422016-10-11 17:17:26 +020085
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020086class HeartbeatListTestCase(APITestCase):
Dirk Vogtf2a33422016-10-11 17:17:26 +020087
88 def setUp(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +020089 self.setup_users()
90 self.data = self.create_dummy_data(self.uuid)
91 self.url = "/hiccup/api/v1/heartbeats/"
Dirk Vogte1784882016-10-13 16:09:38 +020092 self.url_by_uuid = "/hiccup/api/v1/devices/{}/heartbeats/"
Dirk Vogt67eb1482016-10-13 12:42:56 +020093
94 def setup_users(self):
Dirk Vogtf2a33422016-10-11 17:17:26 +020095 self.password = "test"
Dirk Vogt8e656152017-05-04 23:12:13 +020096 request = self.client.post("/hiccup/api/v1/devices/register/", device_register_data)
Dirk Vogtf2a33422016-10-11 17:17:26 +020097 self.uuid = request.data['uuid']
98 self.token = request.data['token']
Dirk Vogt8e656152017-05-04 23:12:13 +020099 request = self.client.post("/hiccup/api/v1/devices/register/", device_register_data)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200100 self.other_uuid = request.data['uuid']
101 self.other_token = request.data['token']
Dirk Vogt67eb1482016-10-13 12:42:56 +0200102 self.admin = User.objects.create_superuser(
103 'myuser', 'myemail@test.com', self.password)
104 self.admin = APIClient()
105 self.admin.login(username='myuser', password='test')
106 self.user = APIClient()
107 self.other_user = APIClient()
108 self.user.credentials(HTTP_AUTHORIZATION='Token ' + self.token)
109 self.other_user.credentials(HTTP_AUTHORIZATION='Token '
110 + self.other_token)
111 self.noauth_client = APIClient()
Dirk Vogtf2a33422016-10-11 17:17:26 +0200112
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200113 def create_dummy_data(self, uuid="not set"):
114 return {
115 'uuid': uuid,
116 'app_version': 2,
117 'uptime': "2 Hours",
118 'build_fingerprint': "models.CharField(max_length=200)",
Borjan Tchakaloff6f239a62018-02-19 09:05:50 +0100119 'radio_version': 'XXXX.X-FP2-X-XX',
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200120 'date': str(datetime.datetime(year=2016, month=1, day=1))
121 }
122
123 def test_create_no_auth(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200124 request = self.noauth_client.post(self.url, self.data)
Dirk Vogt36635692016-10-17 12:19:10 +0200125 self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200126
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200127 def test_create_as_admin(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200128 request = self.admin.post(self.url, self.data)
Dirk Vogt36635692016-10-17 12:19:10 +0200129 self.assertEqual(request.status_code, status.HTTP_201_CREATED)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200130 self.assertTrue(request.data['id'] > 0)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200131
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200132 def test_create_as_admin_not_existing_device(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200133 request = self.admin.post(self.url,
134 self.create_dummy_data())
Dirk Vogt36635692016-10-17 12:19:10 +0200135 self.assertEqual(request.status_code, status.HTTP_404_NOT_FOUND)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200136
137 def test_create_as_uuid_owner(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200138 request = self.user.post(self.url,
139 self.create_dummy_data(self.uuid))
Dirk Vogt36635692016-10-17 12:19:10 +0200140 self.assertEqual(request.status_code, status.HTTP_201_CREATED)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200141 self.assertTrue(request.data['id'] == -1)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200142
143 def test_create_as_uuid_not_owner(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200144 request = self.user.post(self.url,
145 self.create_dummy_data(self.other_uuid))
Dirk Vogt36635692016-10-17 12:19:10 +0200146 self.assertEqual(request.status_code, status.HTTP_403_FORBIDDEN)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200147
Dirk Vogt67eb1482016-10-13 12:42:56 +0200148 def post_multiple(self, client, data, count=5):
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200149 for i in range(count):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200150 client.post(self.url, data)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200151
152 def test_list(self):
153 count = 5
Dirk Vogt67eb1482016-10-13 12:42:56 +0200154 self.post_multiple(self.user, self.data, count)
155 request = self.admin.get(self.url)
Dirk Vogt36635692016-10-17 12:19:10 +0200156 self.assertEqual(request.status_code, status.HTTP_200_OK)
Dirk Vogt8e656152017-05-04 23:12:13 +0200157 self.assertTrue(len(request.data['results']) == count)
Dirk Vogte1784882016-10-13 16:09:38 +0200158
Dirk Vogt36635692016-10-17 12:19:10 +0200159 def test_retrieve_single(self, user=None,
160 expected_result=status.HTTP_200_OK):
Dirk Vogte1784882016-10-13 16:09:38 +0200161 count = 5
162 if user is None:
163 user = self.admin
164 self.post_multiple(self.user, self.data, count)
165 url = "{}1/".format(self.url)
166 request = user.get(url)
167 self.assertEqual(request.status_code, expected_result)
168
169 def test_retrieve_single_noauth(self):
Dirk Vogt36635692016-10-17 12:19:10 +0200170 self.test_retrieve_single(user=self.user,
171 expected_result=status.HTTP_403_FORBIDDEN)
Dirk Vogte1784882016-10-13 16:09:38 +0200172
173 def test_retrieve_single_device_owner(self):
Dirk Vogt36635692016-10-17 12:19:10 +0200174 self.test_retrieve_single(self.noauth_client,
175 status.HTTP_401_UNAUTHORIZED)
Dirk Vogte1784882016-10-13 16:09:38 +0200176
Dirk Vogt36635692016-10-17 12:19:10 +0200177 def test_retrieve_single_by_device(self, user=None,
178 expected_result=status.HTTP_200_OK):
Dirk Vogt0d9d5d22016-10-13 16:17:57 +0200179 count = 5
180 if user is None:
181 user = self.admin
182 self.post_multiple(self.user, self.data, count)
183 url = "{}1/".format(self.url_by_uuid.format(self.uuid))
Dirk Vogt0d9d5d22016-10-13 16:17:57 +0200184 request = user.get(url)
185 self.assertEqual(request.status_code, expected_result)
186
187 def test_retrieve_single_by_device_noauth(self):
Dirk Vogt36635692016-10-17 12:19:10 +0200188 self.test_retrieve_single_by_device(
189 user=self.user,
190 expected_result=status.HTTP_403_FORBIDDEN)
Dirk Vogt0d9d5d22016-10-13 16:17:57 +0200191
192 def test_retrieve_single_by_device_device_owner(self):
Dirk Vogt36635692016-10-17 12:19:10 +0200193 self.test_retrieve_single_by_device(
194 self.noauth_client, status.HTTP_401_UNAUTHORIZED)
Dirk Vogt0d9d5d22016-10-13 16:17:57 +0200195
Dirk Vogte1784882016-10-13 16:09:38 +0200196 def test_list_by_uuid(self):
197 count = 5
198 self.post_multiple(self.user, self.data, count)
199 self.post_multiple(self.admin, self.create_dummy_data(self.other_uuid),
200 count)
201 url = self.url_by_uuid.format(self.uuid)
202 request = self.admin.get(url)
Dirk Vogt36635692016-10-17 12:19:10 +0200203 self.assertEqual(request.status_code, status.HTTP_200_OK)
Dirk Vogt8e656152017-05-04 23:12:13 +0200204 self.assertTrue(len(request.data['results']) == count)
Dirk Vogte1784882016-10-13 16:09:38 +0200205
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200206 def test_list_noauth(self):
207 count = 5
Dirk Vogt67eb1482016-10-13 12:42:56 +0200208 self.post_multiple(self.user, self.data, count)
209 request = self.noauth_client.get(self.url)
Dirk Vogt36635692016-10-17 12:19:10 +0200210 self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200211
212 def test_list_device_owner(self):
213 count = 5
Dirk Vogt67eb1482016-10-13 12:42:56 +0200214 self.post_multiple(self.user, self.data, count)
215 request = self.user.get(self.url)
Dirk Vogt36635692016-10-17 12:19:10 +0200216 self.assertEqual(request.status_code, status.HTTP_403_FORBIDDEN)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200217
Borjan Tchakaloff869cf922018-02-19 11:01:16 +0100218 def test_no_radio_version(self):
219 data = self.data.copy()
220 data.pop('radio_version')
221 self.post_multiple(self.user, data, 1)
222 url = self.url_by_uuid.format(self.uuid)
223 request = self.admin.get(url)
224 self.assertEqual(request.status_code, status.HTTP_200_OK)
225 self.assertEqual(len(request.data['results']), 1)
226 self.assertIsNone(request.data['results'][0]['radio_version'])
227
228 def test_radio_version_field(self):
229 self.post_multiple(self.user, self.data, 1)
230 url = self.url_by_uuid.format(self.uuid)
231 request = self.admin.get(url)
232 self.assertEqual(request.status_code, status.HTTP_200_OK)
233 self.assertEqual(len(request.data['results']), 1)
234 self.assertEqual(request.data['results'][0]['radio_version'],
235 self.data['radio_version'])
236
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200237
Dirk Vogt67eb1482016-10-13 12:42:56 +0200238def create_crashreport(uuid="not set"):
239 return {
240 'uuid': uuid,
241 'is_fake_report': 0,
242 'app_version': 2,
243 'uptime': "2 Hours",
244 'build_fingerprint': "models.CharField(max_length=200)",
Borjan Tchakaloff6f239a62018-02-19 09:05:50 +0100245 'radio_version': 'XXXX.X-FP2-X-XX',
Dirk Vogt67eb1482016-10-13 12:42:56 +0200246 'boot_reason': "models.CharField(max_length=200)",
247 'power_on_reason': "models.CharField(max_length=200)",
248 'power_off_reason': "models.CharField(max_length=200)",
249 'date': str(datetime.datetime(year=2016, month=1, day=1))
250 }
251
252
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200253class CrashreportListTestCase(HeartbeatListTestCase):
254
255 def setUp(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200256 self.setup_users()
257 self.data = self.create_dummy_data(self.uuid)
258 self.url = "/hiccup/api/v1/crashreports/"
Dirk Vogte1784882016-10-13 16:09:38 +0200259 self.url_by_uuid = "/hiccup/api/v1/devices/{}/crashreports/"
Dirk Vogt67eb1482016-10-13 12:42:56 +0200260
261 def create_dummy_data(self, uuid="not set"):
262 return create_crashreport(uuid)
263
264
265class LogfileUploadTest(APITestCase):
266 def setUp(self):
267 self.setup_users()
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200268 # we need a device
Dirk Vogt67eb1482016-10-13 12:42:56 +0200269 self.user.post("/hiccup/api/v1/crashreports/",
270 create_crashreport(self.uuid))
271 self.user.post("/hiccup/api/v1/crashreports/",
272 create_crashreport(self.uuid))
273 self.user.post("/hiccup/api/v1/crashreports/",
274 create_crashreport(self.other_uuid))
275 self.user.post("/hiccup/api/v1/crashreports/",
276 create_crashreport(self.other_uuid))
277
278 def setup_users(self):
279 self.password = "test"
Dirk Vogt8e656152017-05-04 23:12:13 +0200280 request = self.client.post("/hiccup/api/v1/devices/register/", device_register_data)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200281 self.uuid = request.data['uuid']
282 self.token = request.data['token']
Dirk Vogt8e656152017-05-04 23:12:13 +0200283 request = self.client.post("/hiccup/api/v1/devices/register/", device_register_data)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200284 self.other_uuid = request.data['uuid']
285 self.other_token = request.data['token']
Dirk Vogt67eb1482016-10-13 12:42:56 +0200286 self.admin = User.objects.create_superuser(
287 'myuser', 'myemail@test.com', self.password)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200288 self.user = APIClient()
289 self.other_user = APIClient()
290 self.user.credentials(HTTP_AUTHORIZATION='Token ' + self.token)
291 self.other_user.credentials(HTTP_AUTHORIZATION='Token '
292 + self.other_token)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200293
Dirk Vogt36635692016-10-17 12:19:10 +0200294 def get_url(self, uuid, report_id, filename):
295 return ("/hiccup/api/v1/devices/{}/crashreports/{}/logfile_put/{}/".
296 format(uuid, report_id, "test.log"))
297
Dirk Vogt67eb1482016-10-13 12:42:56 +0200298 def test_Logfile_upload_as_admin(self):
Dirk Vogt36635692016-10-17 12:19:10 +0200299 self.client.force_authenticate(self.admin)
300 f = tempfile.NamedTemporaryFile('w+', suffix=".log", delete=True)
301 f.write(u"blihblahblub")
302 request = self.client.post(
303 self.get_url(self.uuid, 1, f.name),
304 {'file': f}, format="multipart")
305 self.assertEqual(status.HTTP_201_CREATED, request.status_code)