blob: c18e482b4815cb9af0494f5596a5426b0b39c345 [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):
17 request = self.client.post("/hiccup/api/v1/devices/register/", {})
18 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
24
25class ListDevicesTestCase(APITestCase):
26
27 def setUp(self):
28 self.password = "test"
29 self.admin = User.objects.create_superuser(
30 'myuser', 'myemail@test.com', self.password)
31 self.client.post("/hiccup/api/v1/devices/register/", {})
32 request = self.client.post("/hiccup/api/v1/devices/register/", {})
33 self.uuid_to_retrieve = request.data['uuid']
34 self.token_to_retrieve = request.data['token']
35 request = self.client.post("/hiccup/api/v1/devices/register/", {})
36 self.uuid_to_delete = request.data['uuid']
37 self.token_to_delete = request.data['token']
38
39 def test_device_list(self):
40 client = APIClient()
41 client.login(username='myuser', password='test')
42 request = client.get("/hiccup/api/v1/devices/", {})
43 self.assertTrue("uuid" in request.data[1])
44 self.assertTrue(len(request.data) >= 3)
Dirk Vogt36635692016-10-17 12:19:10 +020045 self.assertEqual(request.status_code, status.HTTP_200_OK)
Dirk Vogtf2a33422016-10-11 17:17:26 +020046 client.logout()
47
48 def test_device_list_unauth(self):
49 client = APIClient()
50 request = client.get("/hiccup/api/v1/devices/", {})
Dirk Vogt36635692016-10-17 12:19:10 +020051 self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
Dirk Vogtf2a33422016-10-11 17:17:26 +020052
53 def test_retrieve_device_auth(self):
54 client = APIClient()
55 client.login(username='myuser', password='test')
56 request = client.get(
57 "/hiccup/api/v1/devices/{}/".format(self.uuid_to_retrieve), {})
Dirk Vogt36635692016-10-17 12:19:10 +020058 self.assertEqual(request.status_code, status.HTTP_200_OK)
Dirk Vogtf2a33422016-10-11 17:17:26 +020059 self.assertEqual(request.data['uuid'], str(self.uuid_to_retrieve))
60 self.assertEqual(request.data['token'], self.token_to_retrieve)
61 client.logout()
62
63 def test_retrieve_device_unauth(self):
64 client = APIClient()
65 request = client.get(
66 "/hiccup/api/v1/devices/{}/".format(self.uuid_to_retrieve), {})
Dirk Vogt36635692016-10-17 12:19:10 +020067 self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
Dirk Vogtf2a33422016-10-11 17:17:26 +020068
69 def test_delete_device_auth(self):
70 client = APIClient()
71 client.login(username='myuser', password='test')
72 url = "/hiccup/api/v1/devices/{}/".format(self.uuid_to_delete)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020073 request = client.delete(
74 url.format(self.uuid_to_delete), {})
Dirk Vogt36635692016-10-17 12:19:10 +020075 self.assertEqual(request.status_code, status.HTTP_204_NO_CONTENT)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020076 request = client.delete(
77 url.format(self.uuid_to_delete), {})
Dirk Vogt36635692016-10-17 12:19:10 +020078 self.assertEqual(request.status_code, status.HTTP_404_NOT_FOUND)
Dirk Vogtf2a33422016-10-11 17:17:26 +020079 client.logout()
80
Dirk Vogtf2a33422016-10-11 17:17:26 +020081
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020082class HeartbeatListTestCase(APITestCase):
Dirk Vogtf2a33422016-10-11 17:17:26 +020083
84 def setUp(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +020085 self.setup_users()
86 self.data = self.create_dummy_data(self.uuid)
87 self.url = "/hiccup/api/v1/heartbeats/"
Dirk Vogte1784882016-10-13 16:09:38 +020088 self.url_by_uuid = "/hiccup/api/v1/devices/{}/heartbeats/"
Dirk Vogt67eb1482016-10-13 12:42:56 +020089
90 def setup_users(self):
Dirk Vogtf2a33422016-10-11 17:17:26 +020091 self.password = "test"
Dirk Vogtf2a33422016-10-11 17:17:26 +020092 request = self.client.post("/hiccup/api/v1/devices/register/", {})
93 self.uuid = request.data['uuid']
94 self.token = request.data['token']
95 request = self.client.post("/hiccup/api/v1/devices/register/", {})
96 self.other_uuid = request.data['uuid']
97 self.other_token = request.data['token']
Dirk Vogt67eb1482016-10-13 12:42:56 +020098 self.admin = User.objects.create_superuser(
99 'myuser', 'myemail@test.com', self.password)
100 self.admin = APIClient()
101 self.admin.login(username='myuser', password='test')
102 self.user = APIClient()
103 self.other_user = APIClient()
104 self.user.credentials(HTTP_AUTHORIZATION='Token ' + self.token)
105 self.other_user.credentials(HTTP_AUTHORIZATION='Token '
106 + self.other_token)
107 self.noauth_client = APIClient()
Dirk Vogtf2a33422016-10-11 17:17:26 +0200108
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200109 def create_dummy_data(self, uuid="not set"):
110 return {
111 'uuid': uuid,
112 'app_version': 2,
113 'uptime': "2 Hours",
114 'build_fingerprint': "models.CharField(max_length=200)",
115 'date': str(datetime.datetime(year=2016, month=1, day=1))
116 }
117
118 def test_create_no_auth(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200119 request = self.noauth_client.post(self.url, self.data)
Dirk Vogt36635692016-10-17 12:19:10 +0200120 self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200121
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200122 def test_create_as_admin(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200123 request = self.admin.post(self.url, self.data)
Dirk Vogt36635692016-10-17 12:19:10 +0200124 self.assertEqual(request.status_code, status.HTTP_201_CREATED)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200125 self.assertTrue(request.data['id'] > 0)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200126
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200127 def test_create_as_admin_not_existing_device(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200128 request = self.admin.post(self.url,
129 self.create_dummy_data())
Dirk Vogt36635692016-10-17 12:19:10 +0200130 self.assertEqual(request.status_code, status.HTTP_404_NOT_FOUND)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200131
132 def test_create_as_uuid_owner(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200133 request = self.user.post(self.url,
134 self.create_dummy_data(self.uuid))
Dirk Vogt36635692016-10-17 12:19:10 +0200135 self.assertEqual(request.status_code, status.HTTP_201_CREATED)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200136 self.assertTrue(request.data['id'] == -1)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200137
138 def test_create_as_uuid_not_owner(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200139 request = self.user.post(self.url,
140 self.create_dummy_data(self.other_uuid))
Dirk Vogt36635692016-10-17 12:19:10 +0200141 self.assertEqual(request.status_code, status.HTTP_403_FORBIDDEN)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200142
Dirk Vogt67eb1482016-10-13 12:42:56 +0200143 def post_multiple(self, client, data, count=5):
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200144 for i in range(count):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200145 client.post(self.url, data)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200146
147 def test_list(self):
148 count = 5
Dirk Vogt67eb1482016-10-13 12:42:56 +0200149 self.post_multiple(self.user, self.data, count)
150 request = self.admin.get(self.url)
Dirk Vogt36635692016-10-17 12:19:10 +0200151 self.assertEqual(request.status_code, status.HTTP_200_OK)
Dirk Vogte1784882016-10-13 16:09:38 +0200152 self.assertTrue(len(request.data) == count)
153
Dirk Vogt36635692016-10-17 12:19:10 +0200154 def test_retrieve_single(self, user=None,
155 expected_result=status.HTTP_200_OK):
Dirk Vogte1784882016-10-13 16:09:38 +0200156 count = 5
157 if user is None:
158 user = self.admin
159 self.post_multiple(self.user, self.data, count)
160 url = "{}1/".format(self.url)
161 request = user.get(url)
162 self.assertEqual(request.status_code, expected_result)
163
164 def test_retrieve_single_noauth(self):
Dirk Vogt36635692016-10-17 12:19:10 +0200165 self.test_retrieve_single(user=self.user,
166 expected_result=status.HTTP_403_FORBIDDEN)
Dirk Vogte1784882016-10-13 16:09:38 +0200167
168 def test_retrieve_single_device_owner(self):
Dirk Vogt36635692016-10-17 12:19:10 +0200169 self.test_retrieve_single(self.noauth_client,
170 status.HTTP_401_UNAUTHORIZED)
Dirk Vogte1784882016-10-13 16:09:38 +0200171
Dirk Vogt36635692016-10-17 12:19:10 +0200172 def test_retrieve_single_by_device(self, user=None,
173 expected_result=status.HTTP_200_OK):
Dirk Vogt0d9d5d22016-10-13 16:17:57 +0200174 count = 5
175 if user is None:
176 user = self.admin
177 self.post_multiple(self.user, self.data, count)
178 url = "{}1/".format(self.url_by_uuid.format(self.uuid))
Dirk Vogt0d9d5d22016-10-13 16:17:57 +0200179 request = user.get(url)
180 self.assertEqual(request.status_code, expected_result)
181
182 def test_retrieve_single_by_device_noauth(self):
Dirk Vogt36635692016-10-17 12:19:10 +0200183 self.test_retrieve_single_by_device(
184 user=self.user,
185 expected_result=status.HTTP_403_FORBIDDEN)
Dirk Vogt0d9d5d22016-10-13 16:17:57 +0200186
187 def test_retrieve_single_by_device_device_owner(self):
Dirk Vogt36635692016-10-17 12:19:10 +0200188 self.test_retrieve_single_by_device(
189 self.noauth_client, status.HTTP_401_UNAUTHORIZED)
Dirk Vogt0d9d5d22016-10-13 16:17:57 +0200190
Dirk Vogte1784882016-10-13 16:09:38 +0200191 def test_list_by_uuid(self):
192 count = 5
193 self.post_multiple(self.user, self.data, count)
194 self.post_multiple(self.admin, self.create_dummy_data(self.other_uuid),
195 count)
196 url = self.url_by_uuid.format(self.uuid)
197 request = self.admin.get(url)
Dirk Vogt36635692016-10-17 12:19:10 +0200198 self.assertEqual(request.status_code, status.HTTP_200_OK)
Dirk Vogte1784882016-10-13 16:09:38 +0200199 self.assertTrue(len(request.data) == count)
200
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200201 def test_list_noauth(self):
202 count = 5
Dirk Vogt67eb1482016-10-13 12:42:56 +0200203 self.post_multiple(self.user, self.data, count)
204 request = self.noauth_client.get(self.url)
Dirk Vogt36635692016-10-17 12:19:10 +0200205 self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200206
207 def test_list_device_owner(self):
208 count = 5
Dirk Vogt67eb1482016-10-13 12:42:56 +0200209 self.post_multiple(self.user, self.data, count)
210 request = self.user.get(self.url)
Dirk Vogt36635692016-10-17 12:19:10 +0200211 self.assertEqual(request.status_code, status.HTTP_403_FORBIDDEN)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200212
213
Dirk Vogt67eb1482016-10-13 12:42:56 +0200214def create_crashreport(uuid="not set"):
215 return {
216 'uuid': uuid,
217 'is_fake_report': 0,
218 'app_version': 2,
219 'uptime': "2 Hours",
220 'build_fingerprint': "models.CharField(max_length=200)",
221 'boot_reason': "models.CharField(max_length=200)",
222 'power_on_reason': "models.CharField(max_length=200)",
223 'power_off_reason': "models.CharField(max_length=200)",
224 'date': str(datetime.datetime(year=2016, month=1, day=1))
225 }
226
227
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200228class CrashreportListTestCase(HeartbeatListTestCase):
229
230 def setUp(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200231 self.setup_users()
232 self.data = self.create_dummy_data(self.uuid)
233 self.url = "/hiccup/api/v1/crashreports/"
Dirk Vogte1784882016-10-13 16:09:38 +0200234 self.url_by_uuid = "/hiccup/api/v1/devices/{}/crashreports/"
Dirk Vogt67eb1482016-10-13 12:42:56 +0200235
236 def create_dummy_data(self, uuid="not set"):
237 return create_crashreport(uuid)
238
239
240class LogfileUploadTest(APITestCase):
241 def setUp(self):
242 self.setup_users()
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200243 # we need a device
Dirk Vogt67eb1482016-10-13 12:42:56 +0200244 self.user.post("/hiccup/api/v1/crashreports/",
245 create_crashreport(self.uuid))
246 self.user.post("/hiccup/api/v1/crashreports/",
247 create_crashreport(self.uuid))
248 self.user.post("/hiccup/api/v1/crashreports/",
249 create_crashreport(self.other_uuid))
250 self.user.post("/hiccup/api/v1/crashreports/",
251 create_crashreport(self.other_uuid))
252
253 def setup_users(self):
254 self.password = "test"
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200255 request = self.client.post("/hiccup/api/v1/devices/register/", {})
256 self.uuid = request.data['uuid']
257 self.token = request.data['token']
258 request = self.client.post("/hiccup/api/v1/devices/register/", {})
259 self.other_uuid = request.data['uuid']
260 self.other_token = request.data['token']
Dirk Vogt67eb1482016-10-13 12:42:56 +0200261 self.admin = User.objects.create_superuser(
262 'myuser', 'myemail@test.com', self.password)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200263 self.user = APIClient()
264 self.other_user = APIClient()
265 self.user.credentials(HTTP_AUTHORIZATION='Token ' + self.token)
266 self.other_user.credentials(HTTP_AUTHORIZATION='Token '
267 + self.other_token)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200268
Dirk Vogt36635692016-10-17 12:19:10 +0200269 def get_url(self, uuid, report_id, filename):
270 return ("/hiccup/api/v1/devices/{}/crashreports/{}/logfile_put/{}/".
271 format(uuid, report_id, "test.log"))
272
Dirk Vogt67eb1482016-10-13 12:42:56 +0200273 def test_Logfile_upload_as_admin(self):
Dirk Vogt36635692016-10-17 12:19:10 +0200274 self.client.force_authenticate(self.admin)
275 f = tempfile.NamedTemporaryFile('w+', suffix=".log", delete=True)
276 f.write(u"blihblahblub")
277 request = self.client.post(
278 self.get_url(self.uuid, 1, f.name),
279 {'file': f}, format="multipart")
280 self.assertEqual(status.HTTP_201_CREATED, request.status_code)