Use proper Status code in tests| ADD Logfile upload
diff --git a/crashreports/models.py b/crashreports/models.py
index be44b57..0a06a6f 100644
--- a/crashreports/models.py
+++ b/crashreports/models.py
@@ -42,8 +42,8 @@
def crashreport_file_name(instance, filename):
return '/'.join([
"crashreport_uploads",
- instance.device.uuid,
- instance.crashreport.id,
+ instance.crashreport.device.uuid,
+ str(instance.crashreport.id),
str(instance.crashreport.date),
filename])
@@ -60,7 +60,7 @@
date = models.DateTimeField()
tags = TaggableManager(blank=True)
device_local_id = models.PositiveIntegerField(blank=True)
- next_crashreport_key = models.PositiveIntegerField(default=1)
+ next_logfile_key = models.PositiveIntegerField(default=1)
@transaction.atomic
def get_logfile_key(self):
@@ -87,8 +87,8 @@
crashreport_local_id = models.PositiveIntegerField(blank=True)
def save(self, *args, **kwargs):
- if not self.device_local_id:
- self.device_local_id = self.crashreport.next_logfile_key()
+ if not self.crashreport_local_id:
+ self.crashreport_local_id = self.crashreport.get_logfile_key()
super(LogFile, self).save(*args, **kwargs)
diff --git a/crashreports/rest_api_crashreports.py b/crashreports/rest_api_crashreports.py
index 606e2b7..93eabb7 100644
--- a/crashreports/rest_api_crashreports.py
+++ b/crashreports/rest_api_crashreports.py
@@ -3,8 +3,6 @@
from django.shortcuts import get_object_or_404
from crashreports.permissions import HasRightsOrIsDeviceOwnerDeviceCreation
from crashreports.serializers import CrashReportSerializer
-from rest_framework import exceptions
-import traceback
class ListCreateView(generics.ListCreateAPIView):
diff --git a/crashreports/rest_api_logfiles.py b/crashreports/rest_api_logfiles.py
index 7033c55..c37685b 100644
--- a/crashreports/rest_api_logfiles.py
+++ b/crashreports/rest_api_logfiles.py
@@ -7,7 +7,6 @@
from rest_framework.exceptions import PermissionDenied
from rest_framework.exceptions import NotFound
-
from rest_framework.response import Response
from crashreports.models import LogFile
from crashreports.models import Crashreport
@@ -16,16 +15,19 @@
@api_view(http_method_names=['POST'], )
-@parser_classes(FileUploadParser)
-@permission_classes(IsAuthenticated,)
-def logfile_put(request):
+@parser_classes([FileUploadParser, ])
+@permission_classes([IsAuthenticated, ])
+def logfile_put(request, uuid, device_local_id, filename):
try:
- crashreport = Crashreport.objects.get(crashreport_pk)
+ crashreport = Crashreport.objects.get(device__uuid=uuid,
+ device_local_id=device_local_id)
except:
- raise NotFound(detail="crashreport does not exist")
+ raise NotFound(detail="Crashreport does not exist.")
+
if (not (user_owns_uuid(request.user, crashreport.device.uuid)
or user_is_hiccup_staff(request.user))):
raise PermissionDenied(detail="Not allowed.")
- logfile = LogFile(crashreport=crashreport, logfile=request.data["file"])
+ f = request.data["file"]
+ logfile = LogFile(crashreport=crashreport, logfile=f)
logfile.save()
- return Response(201, data={'result': 'ok'})
+ return Response(status=201)
diff --git a/crashreports/serializers.py b/crashreports/serializers.py
index d04c384..3fb9aac 100644
--- a/crashreports/serializers.py
+++ b/crashreports/serializers.py
@@ -42,7 +42,7 @@
class HeartBeatSerializer(serializers.ModelSerializer):
- permission_classes = (permissions.AllowAny,)
+ permission_classes = (permissions.IsAuthenticated,)
uuid = serializers.CharField(max_length=64)
id = PrivateField()
device_local_id = serializers.IntegerField(required=False)
diff --git a/crashreports/tests.py b/crashreports/tests.py
index aee66d2..c18e482 100644
--- a/crashreports/tests.py
+++ b/crashreports/tests.py
@@ -1,7 +1,9 @@
from django.contrib.auth.models import User
from rest_framework.test import APITestCase
from rest_framework.test import APIClient
+from rest_framework import status
import datetime
+import tempfile
# Create your tests here.
@@ -15,7 +17,7 @@
request = self.client.post("/hiccup/api/v1/devices/register/", {})
self.assertTrue("token" in request.data)
self.assertTrue("uuid" in request.data)
- self.assertEqual(request.status_code, 200)
+ self.assertEqual(request.status_code, status.HTTP_200_OK)
# Create your tests here.
@@ -40,20 +42,20 @@
request = client.get("/hiccup/api/v1/devices/", {})
self.assertTrue("uuid" in request.data[1])
self.assertTrue(len(request.data) >= 3)
- self.assertEqual(request.status_code, 200)
+ self.assertEqual(request.status_code, status.HTTP_200_OK)
client.logout()
def test_device_list_unauth(self):
client = APIClient()
request = client.get("/hiccup/api/v1/devices/", {})
- self.assertEqual(request.status_code, 401)
+ self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
def test_retrieve_device_auth(self):
client = APIClient()
client.login(username='myuser', password='test')
request = client.get(
"/hiccup/api/v1/devices/{}/".format(self.uuid_to_retrieve), {})
- self.assertEqual(request.status_code, 200)
+ self.assertEqual(request.status_code, status.HTTP_200_OK)
self.assertEqual(request.data['uuid'], str(self.uuid_to_retrieve))
self.assertEqual(request.data['token'], self.token_to_retrieve)
client.logout()
@@ -62,7 +64,7 @@
client = APIClient()
request = client.get(
"/hiccup/api/v1/devices/{}/".format(self.uuid_to_retrieve), {})
- self.assertEqual(request.status_code, 401)
+ self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
def test_delete_device_auth(self):
client = APIClient()
@@ -70,10 +72,10 @@
url = "/hiccup/api/v1/devices/{}/".format(self.uuid_to_delete)
request = client.delete(
url.format(self.uuid_to_delete), {})
- self.assertEqual(request.status_code, 204)
+ self.assertEqual(request.status_code, status.HTTP_204_NO_CONTENT)
request = client.delete(
url.format(self.uuid_to_delete), {})
- self.assertEqual(request.status_code, 404)
+ self.assertEqual(request.status_code, status.HTTP_404_NOT_FOUND)
client.logout()
@@ -115,28 +117,28 @@
def test_create_no_auth(self):
request = self.noauth_client.post(self.url, self.data)
- self.assertEqual(request.status_code, 401)
+ self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
def test_create_as_admin(self):
request = self.admin.post(self.url, self.data)
- self.assertEqual(request.status_code, 201)
+ self.assertEqual(request.status_code, status.HTTP_201_CREATED)
self.assertTrue(request.data['id'] > 0)
def test_create_as_admin_not_existing_device(self):
request = self.admin.post(self.url,
self.create_dummy_data())
- self.assertEqual(request.status_code, 404)
+ self.assertEqual(request.status_code, status.HTTP_404_NOT_FOUND)
def test_create_as_uuid_owner(self):
request = self.user.post(self.url,
self.create_dummy_data(self.uuid))
- self.assertEqual(request.status_code, 201)
+ self.assertEqual(request.status_code, status.HTTP_201_CREATED)
self.assertTrue(request.data['id'] == -1)
def test_create_as_uuid_not_owner(self):
request = self.user.post(self.url,
self.create_dummy_data(self.other_uuid))
- self.assertEqual(request.status_code, 403)
+ self.assertEqual(request.status_code, status.HTTP_403_FORBIDDEN)
def post_multiple(self, client, data, count=5):
for i in range(count):
@@ -146,10 +148,11 @@
count = 5
self.post_multiple(self.user, self.data, count)
request = self.admin.get(self.url)
- self.assertEqual(request.status_code, 200)
+ self.assertEqual(request.status_code, status.HTTP_200_OK)
self.assertTrue(len(request.data) == count)
- def test_retrieve_single(self, user=None, expected_result=200):
+ def test_retrieve_single(self, user=None,
+ expected_result=status.HTTP_200_OK):
count = 5
if user is None:
user = self.admin
@@ -159,27 +162,31 @@
self.assertEqual(request.status_code, expected_result)
def test_retrieve_single_noauth(self):
- self.test_retrieve_single(user=self.user, expected_result=403)
+ self.test_retrieve_single(user=self.user,
+ expected_result=status.HTTP_403_FORBIDDEN)
def test_retrieve_single_device_owner(self):
- self.test_retrieve_single(self.noauth_client, 401)
+ self.test_retrieve_single(self.noauth_client,
+ status.HTTP_401_UNAUTHORIZED)
- def test_retrieve_single_by_device(self, user=None, expected_result=200):
+ def test_retrieve_single_by_device(self, user=None,
+ expected_result=status.HTTP_200_OK):
count = 5
if user is None:
user = self.admin
self.post_multiple(self.user, self.data, count)
url = "{}1/".format(self.url_by_uuid.format(self.uuid))
- print(url)
request = user.get(url)
self.assertEqual(request.status_code, expected_result)
def test_retrieve_single_by_device_noauth(self):
- self.test_retrieve_single_by_device(user=self.user,
- expected_result=403)
+ self.test_retrieve_single_by_device(
+ user=self.user,
+ expected_result=status.HTTP_403_FORBIDDEN)
def test_retrieve_single_by_device_device_owner(self):
- self.test_retrieve_single_by_device(self.noauth_client, 401)
+ self.test_retrieve_single_by_device(
+ self.noauth_client, status.HTTP_401_UNAUTHORIZED)
def test_list_by_uuid(self):
count = 5
@@ -188,20 +195,20 @@
count)
url = self.url_by_uuid.format(self.uuid)
request = self.admin.get(url)
- self.assertEqual(request.status_code, 200)
+ self.assertEqual(request.status_code, status.HTTP_200_OK)
self.assertTrue(len(request.data) == count)
def test_list_noauth(self):
count = 5
self.post_multiple(self.user, self.data, count)
request = self.noauth_client.get(self.url)
- self.assertEqual(request.status_code, 401)
+ self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
def test_list_device_owner(self):
count = 5
self.post_multiple(self.user, self.data, count)
request = self.user.get(self.url)
- self.assertEqual(request.status_code, 403)
+ self.assertEqual(request.status_code, status.HTTP_403_FORBIDDEN)
def create_crashreport(uuid="not set"):
@@ -253,13 +260,21 @@
self.other_token = request.data['token']
self.admin = User.objects.create_superuser(
'myuser', 'myemail@test.com', self.password)
- self.admin = APIClient()
- self.admin.login(username='myuser', password='test')
self.user = APIClient()
self.other_user = APIClient()
self.user.credentials(HTTP_AUTHORIZATION='Token ' + self.token)
self.other_user.credentials(HTTP_AUTHORIZATION='Token '
+ self.other_token)
+ def get_url(self, uuid, report_id, filename):
+ return ("/hiccup/api/v1/devices/{}/crashreports/{}/logfile_put/{}/".
+ format(uuid, report_id, "test.log"))
+
def test_Logfile_upload_as_admin(self):
- pass
+ self.client.force_authenticate(self.admin)
+ f = tempfile.NamedTemporaryFile('w+', suffix=".log", delete=True)
+ f.write(u"blihblahblub")
+ request = self.client.post(
+ self.get_url(self.uuid, 1, f.name),
+ {'file': f}, format="multipart")
+ self.assertEqual(status.HTTP_201_CREATED, request.status_code)
diff --git a/crashreports/urls.py b/crashreports/urls.py
index 55a8b38..dd9999c 100644
--- a/crashreports/urls.py
+++ b/crashreports/urls.py
@@ -6,6 +6,7 @@
urlpatterns = [
+ # crashreports
url(r'^api/v1/crashreports/$',
rest_api_crashreports.ListCreateView.as_view(),
name='api_v1_crashreports'),
@@ -20,10 +21,18 @@
rest_api_crashreports.RetrieveUpdateDestroyView.as_view(),
name='api_v1_crashreports_by_uuid'),
+ # logfiles
+
+ url(r'^api/v1/devices/(?P<uuid>[a-f0-9-]+)/crashreports/' +
+ '(?P<device_local_id>[0-9]+)/logfile_put/(?P<filename>[^/]+)/$',
+ rest_api_logfiles.logfile_put,
+ name='api_v1_putlogfile_for_device_id'),
+
# url(r'^api/v1/logfile_put$',
# rest_api_logfiles.logfile_put,
# name='api_v1_crashreports_put_logfile'),
+ # heartbeats
url(r'^api/v1/heartbeats/$',
rest_api_heartbeats.ListCreateView.as_view(),
name='api_v1_heartbeats'),
@@ -33,11 +42,13 @@
url(r'^api/v1/heartbeats/(?P<id>[0-9]+)/$',
rest_api_heartbeats.RetrieveUpdateDestroyView.as_view(),
name='api_v1_heatbeat'),
- url(r'^api/v1/devices/(?P<device__uuid>[a-f0-9-]+)/heartbeats/' +
+ url(r'^api/v1/devices/(?P<uuid>[a-f0-9-]+)/heartbeats/' +
'(?P<device_local_id>[0-9]+)/$',
rest_api_heartbeats.RetrieveUpdateDestroyView.as_view(),
name='api_v1_heartbeat_by_uuid'),
+ # devices
+
url(r'^api/v1/devices/$', rest_api_devices.ListCreateDevices.as_view(),
name='api_v1_list_devices'),
url(r'^api/v1/devices/(?P<uuid>[a-f0-9-]+)/$',