diff --git a/django_walletpass/classviews.py b/django_walletpass/classviews.py index 798312a..d23905b 100644 --- a/django_walletpass/classviews.py +++ b/django_walletpass/classviews.py @@ -138,8 +138,7 @@ class LogViewSet(viewsets.ViewSet): permission_classes = (AllowAny, ) def create(self, request): - json_body = json.loads(request.body) - for message in json_body['logs']: + for message in request.data.get('logs', []): log = Log(message=message) Log.parse_log(log, message) return Response({}, status=status.HTTP_200_OK) diff --git a/django_walletpass/models.py b/django_walletpass/models.py index 89f9aab..5571fc4 100644 --- a/django_walletpass/models.py +++ b/django_walletpass/models.py @@ -382,7 +382,7 @@ def parse_log(cls, log, message): elif 'warning' in status: status = 'warning' - log.created_at = datetime.datetime.strptime(timestamp_str, "%Y-%m-%d %H:%M:%S %z") + log.created_at = datetime.datetime.strptime(timestamp_str, "%Y-%m-%d %H:%M:%S %p %z") log.status = status log.task_type = task_type log.device_id = device_id diff --git a/django_walletpass/tests/main.py b/django_walletpass/tests/main.py index 0f28217..0f63edf 100644 --- a/django_walletpass/tests/main.py +++ b/django_walletpass/tests/main.py @@ -1,14 +1,19 @@ +import datetime +import json from unittest import mock from dateutil.parser import parse from django.contrib import admin from django.test import TestCase +from django.urls import reverse from django.utils import timezone +from rest_framework import status +from rest_framework.test import APITestCase, APIRequestFactory from django_walletpass import crypto from django_walletpass.admin import PassAdmin -from django_walletpass.classviews import FORMAT -from django_walletpass.models import Pass, PassBuilder, Registration +from django_walletpass.classviews import FORMAT, LogViewSet +from django_walletpass.models import Pass, PassBuilder, Registration, Log from django_walletpass.settings import dwpconfig as WALLETPASS_CONF @@ -116,3 +121,30 @@ def test_push_notification(self, send_notification_mock, get_registrations_mock) send_notification_mock.assert_called_with(mock.ANY) request = send_notification_mock.call_args_list[0][0][0] self.assertEqual(request.message, {"aps": {}}) + + +class LogViewSetTestCase(APITestCase): + def setUp(self): + self.factory = APIRequestFactory() + + def test_create_log(self): + url = reverse('walletpass_log', urlconf='django_walletpass.urls') + expected_timestamp_str = "2024-07-08 10:22:35 AM +0200" + data = { + 'logs': [f"[{expected_timestamp_str}] Web service error for pass.com.develatio.devpubs.example (" + "https://example.com/passes/): Response to 'What changed?' " + "request included 1 serial numbers but the lastUpdated tag (2024-07-08T08:03:13.588412+00:00) " + "remained the same."] + } + request = self.factory.post(url, data=json.dumps(data), content_type='application/json') + view = LogViewSet.as_view({'post': 'create'}) + response = view(request) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + created_log = Log.objects.first() + self.assertIsNotNone(created_log) + expected_timestamp = datetime.datetime.strptime(expected_timestamp_str, "%Y-%m-%d %I:%M:%S %p %z") + expected_utc_timestamp = expected_timestamp.astimezone(timezone.utc) + + self.assertEqual(created_log.created_at, expected_utc_timestamp)