diff options
| -rw-r--r-- | pydis_site/apps/api/tests/test_nominations.py | 131 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/bot/nomination.py | 8 | 
2 files changed, 135 insertions, 4 deletions
| diff --git a/pydis_site/apps/api/tests/test_nominations.py b/pydis_site/apps/api/tests/test_nominations.py index 99a3fe69..258c2cd7 100644 --- a/pydis_site/apps/api/tests/test_nominations.py +++ b/pydis_site/apps/api/tests/test_nominations.py @@ -70,3 +70,134 @@ class CreationTests(APISubdomainTestCase):              dt.now(timezone.utc),              delta=timedelta(seconds=2)          ) +        self.assertEqual(nomination.user.id, data['user']) +        self.assertEqual(nomination.actor.id, data['actor']) +        self.assertEqual(nomination.reason, data['reason']) +        self.assertEqual(nomination.active, True) + +    def test_returns_400_for_missing_user(self): +        url = reverse('bot:nomination-list', host='api') +        data = { +            'actor': self.user.id, +            'reason': 'Joe Dart on Fender Bass', +        } + +        response = self.client.post(url, data=data) +        self.assertEqual(response.status_code, 400) +        self.assertEqual(response.json(), { +            'user': ['This field is required.'] +        }) + +    def test_returns_400_for_missing_actor(self): +        url = reverse('bot:nomination-list', host='api') +        data = { +            'user': self.user.id, +            'reason': 'Joe Dart on Fender Bass', +        } + +        response = self.client.post(url, data=data) +        self.assertEqual(response.status_code, 400) +        self.assertEqual(response.json(), { +            'actor': ['This field is required.'] +        }) + +    def test_returns_400_for_missing_reason(self): +        url = reverse('bot:nomination-list', host='api') +        data = { +            'user': self.user.id, +            'actor': self.user.id, +        } + +        response = self.client.post(url, data=data) +        self.assertEqual(response.status_code, 400) +        self.assertEqual(response.json(), { +            'reason': ['This field is required.'] +        }) + +    def test_returns_400_for_bad_user(self): +        url = reverse('bot:nomination-list', host='api') +        data = { +            'user': 1024, +            'reason': 'Joe Dart on Fender Bass', +            'actor': self.user.id, +        } + +        response = self.client.post(url, data=data) +        self.assertEqual(response.status_code, 400) +        self.assertEqual(response.json(), { +            'user': ['Invalid pk "1024" - object does not exist.'] +        }) + +    def test_returns_400_for_bad_actor(self): +        url = reverse('bot:nomination-list', host='api') +        data = { +            'user': self.user.id, +            'reason': 'Joe Dart on Fender Bass', +            'actor': 1024, +        } + +        response = self.client.post(url, data=data) +        self.assertEqual(response.status_code, 400) +        self.assertEqual(response.json(), { +            'actor': ['Invalid pk "1024" - object does not exist.'] +        }) + +    def test_returns_400_for_unnominate_reason_at_creation(self): +        url = reverse('bot:nomination-list', host='api') +        data = { +            'user': self.user.id, +            'reason': 'Joe Dart on Fender Bass', +            'actor': self.user.id, +            'unnominate_reason': "Joe Dart on the Joe Dart Bass" +        } + +        response = self.client.post(url, data=data) +        self.assertEqual(response.status_code, 400) +        self.assertEqual(response.json(), { +            'unnominate_reason': ['This field cannot be set at creation.'] +        }) + +    def test_returns_400_for_unwatched_at_at_creation(self): +        url = reverse('bot:nomination-list', host='api') +        data = { +            'user': self.user.id, +            'reason': 'Joe Dart on Fender Bass', +            'actor': self.user.id, +            'unwatched_at': "Joe Dart on the Joe Dart Bass" +        } + +        response = self.client.post(url, data=data) +        self.assertEqual(response.status_code, 400) +        self.assertEqual(response.json(), { +            'unwatched_at': ['This field cannot be set at creation.'] +        }) + +    def test_returns_400_for_inserted_at_at_creation(self): +        url = reverse('bot:nomination-list', host='api') +        data = { +            'user': self.user.id, +            'reason': 'Joe Dart on Fender Bass', +            'actor': self.user.id, +            'inserted_at': "Joe Dart on the Joe Dart Bass" +        } + +        response = self.client.post(url, data=data) +        self.assertEqual(response.status_code, 400) +        self.assertEqual(response.json(), { +            'inserted_at': ['This field cannot be set at creation.'] +        }) + +    def test_returns_400_for_active_at_creation(self): +        url = reverse('bot:nomination-list', host='api') +        data = { +            'user': self.user.id, +            'reason': 'Joe Dart on Fender Bass', +            'actor': self.user.id, +            'active': False +        } + +        response = self.client.post(url, data=data) +        self.assertEqual(response.status_code, 400) +        self.assertEqual(response.json(), { +            'active': ['This field cannot be set at creation.'] +        }) diff --git a/pydis_site/apps/api/viewsets/bot/nomination.py b/pydis_site/apps/api/viewsets/bot/nomination.py index c3615dd9..1059ffcd 100644 --- a/pydis_site/apps/api/viewsets/bot/nomination.py +++ b/pydis_site/apps/api/viewsets/bot/nomination.py @@ -19,12 +19,12 @@ class NominationViewSet(ModelViewSet):      filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)      filter_fields = ('user__id', 'actor__id', 'active')      frozen_fields = ('id', 'actor', 'inserted_at', 'user', 'unwatched_at', 'active') -    frozen_on_create = ('unwatched_at', 'unnominate_reason') +    frozen_on_create = ('unwatched_at', 'unnominate_reason', 'active', 'inserted_at')      def create(self, request, *args, **kwargs):          for field in request.data:              if field in self.frozen_on_create: -                raise ValidationError({field: ['This field cannot be updated.']}) +                raise ValidationError({field: ['This field cannot be set at creation.']})          serializer = self.get_serializer(data=request.data)          serializer.is_valid(raise_exception=True) @@ -53,8 +53,8 @@ class NominationViewSet(ModelViewSet):      @action(detail=True, methods=['patch'])      def end_nomination(self, request, pk=None):          for field in request.data: -            if field in self.frozen_fields: -                raise ValidationError({field: ['This field cannot be updated.']}) +            if field != "unnominate_reason": +                raise ValidationError({field: ['This field cannot be set at end_nomination']})          if "unnominate_reason" not in request.data:              raise ValidationError( | 
