diff options
Diffstat (limited to 'pydis_site')
| -rw-r--r-- | pydis_site/apps/api/tests/test_offensive_message.py | 68 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/bot/offensive_message.py | 13 | 
2 files changed, 59 insertions, 22 deletions
diff --git a/pydis_site/apps/api/tests/test_offensive_message.py b/pydis_site/apps/api/tests/test_offensive_message.py index f45b5a66..d01231f1 100644 --- a/pydis_site/apps/api/tests/test_offensive_message.py +++ b/pydis_site/apps/api/tests/test_offensive_message.py @@ -6,6 +6,17 @@ from .base import AuthenticatedAPITestCase  from pydis_site.apps.api.models import OffensiveMessage +def create_offensive_message() -> OffensiveMessage: +    """Creates and returns an `OffensiveMessgage` record for tests.""" +    delete_at = datetime.datetime.now(tz=datetime.UTC) + datetime.timedelta(days=1) + +    return OffensiveMessage.objects.create( +        id=602951077675139072, +        channel_id=291284109232308226, +        delete_date=delete_at, +    ) + +  class CreationTests(AuthenticatedAPITestCase):      def test_accept_valid_data(self):          url = reverse('api:bot:offensivemessage-list') @@ -111,13 +122,7 @@ class ListTests(AuthenticatedAPITestCase):  class DeletionTests(AuthenticatedAPITestCase):      @classmethod      def setUpTestData(cls): -        delete_at = datetime.datetime.now(tz=datetime.UTC) + datetime.timedelta(days=1) - -        cls.valid_offensive_message = OffensiveMessage.objects.create( -            id=602951077675139072, -            channel_id=291284109232308226, -            delete_date=delete_at.isoformat() -        ) +        cls.valid_offensive_message = create_offensive_message()      def test_delete_data(self):          url = reverse( @@ -132,24 +137,45 @@ class DeletionTests(AuthenticatedAPITestCase):          ) -class NotAllowedMethodsTests(AuthenticatedAPITestCase): +class UpdateOffensiveMessageTestCase(AuthenticatedAPITestCase):      @classmethod      def setUpTestData(cls): -        delete_at = datetime.datetime.now(tz=datetime.UTC) + datetime.timedelta(days=1) +        cls.message = create_offensive_message() +        cls.in_one_week = datetime.datetime.now(tz=datetime.UTC) + datetime.timedelta(days=7) -        cls.valid_offensive_message = OffensiveMessage.objects.create( -            id=602951077675139072, -            channel_id=291284109232308226, -            delete_date=delete_at.isoformat() +    def test_updating_message(self): +        url = reverse('api:bot:offensivemessage-detail', args=(self.message.id,)) +        data = {'delete_date': self.in_one_week.isoformat()} +        update_response = self.client.patch(url, data=data) +        self.assertEqual(update_response.status_code, 200) + +        self.message.refresh_from_db() +        self.assertAlmostEqual( +            self.message.delete_date, +            self.in_one_week, +            delta=datetime.timedelta(seconds=1),          ) -    def test_returns_405_for_patch_and_put_requests(self): -        url = reverse( -            'api:bot:offensivemessage-detail', args=(self.valid_offensive_message.id,) +    def test_updating_nonexistent_message(self): +        url = reverse('api:bot:offensivemessage-detail', args=(self.message.id + 1,)) +        data = {'delete_date': self.in_one_week} + +        response = self.client.patch(url, data=data) +        self.assertEqual(response.status_code, 404) +        self.message.refresh_from_db() +        self.assertNotAlmostEqual( +            self.message.delete_date, +            self.in_one_week, +            delta=datetime.timedelta(seconds=1),          ) -        not_allowed_methods = (self.client.patch, self.client.put) -        for method in not_allowed_methods: -            with self.subTest(method=method): -                response = method(url, {}) -                self.assertEqual(response.status_code, 405) + +class NotAllowedMethodsTests(AuthenticatedAPITestCase): +    @classmethod +    def setUpTestData(cls): +        cls.message = create_offensive_message() + +    def test_returns_405_for_get(self): +        url = reverse('api:bot:offensivemessage-detail', args=(self.message.id,)) +        response = self.client.get(url) +        self.assertEqual(response.status_code, 405) diff --git a/pydis_site/apps/api/viewsets/bot/offensive_message.py b/pydis_site/apps/api/viewsets/bot/offensive_message.py index 54cb3a38..fc8837e0 100644 --- a/pydis_site/apps/api/viewsets/bot/offensive_message.py +++ b/pydis_site/apps/api/viewsets/bot/offensive_message.py @@ -1,6 +1,7 @@  from rest_framework.mixins import (      CreateModelMixin,      DestroyModelMixin, +    UpdateModelMixin,      ListModelMixin  )  from rest_framework.viewsets import GenericViewSet @@ -10,7 +11,7 @@ from pydis_site.apps.api.serializers import OffensiveMessageSerializer  class OffensiveMessageViewSet( -    CreateModelMixin, ListModelMixin, DestroyModelMixin, GenericViewSet +    CreateModelMixin, ListModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet  ):      """      View providing CRUD access to offensive messages. @@ -46,6 +47,16 @@ class OffensiveMessageViewSet(      - 201: returned on success      - 400: if the body format is invalid +    ### PATCH /bot/offensive-messages/<id:int> +    Perform a partial update of the offensive message with the given `id`. +    Intended to allow rescheduling the deletion date in case the bot's attempt +    to delete the message failed due to another error than the message already +    being deleted. + +    #### Status codes +    - 200: returned on success +    - 404: if a offensive message object with the given `id` does not exist +      ### DELETE /bot/offensive-messages/<id:int>      Delete the offensive message object with the given `id`.  |