diff options
| author | 2021-02-22 11:37:53 +0200 | |
|---|---|---|
| committer | 2021-02-22 11:37:53 +0200 | |
| commit | 9af0579297e8f1b535099f24f41b4c7f85e2a0cc (patch) | |
| tree | 2243633de727e71c9a688de55a35a7346d47dfff | |
| parent | Small improvements in nomination viewset (diff) | |
Update nomination-related tests to cover recent table-splitting changes
| -rw-r--r-- | pydis_site/apps/api/tests/test_models.py | 16 | ||||
| -rw-r--r-- | pydis_site/apps/api/tests/test_nominations.py | 144 | 
2 files changed, 139 insertions, 21 deletions
| diff --git a/pydis_site/apps/api/tests/test_models.py b/pydis_site/apps/api/tests/test_models.py index 853e6621..66052e01 100644 --- a/pydis_site/apps/api/tests/test_models.py +++ b/pydis_site/apps/api/tests/test_models.py @@ -10,6 +10,7 @@ from pydis_site.apps.api.models import (      Message,      MessageDeletionContext,      Nomination, +    NominationEntry,      OffTopicChannelName,      OffensiveMessage,      Reminder, @@ -37,17 +38,11 @@ class StringDunderMethodTests(SimpleTestCase):      def setUp(self):          self.nomination = Nomination(              id=123, -            actor=User( -                id=9876, -                name='Mr. Hemlock', -                discriminator=6666, -            ),              user=User(                  id=9876,                  name="Hemlock's Cat",                  discriminator=7777,              ), -            reason="He purrrrs like the best!",          )          self.objects = ( @@ -135,6 +130,15 @@ class StringDunderMethodTests(SimpleTestCase):                  ),                  content="oh no",                  expiration=dt(5018, 11, 20, 15, 52, tzinfo=timezone.utc) +            ), +            NominationEntry( +                nomination_id=self.nomination.id, +                actor=User( +                    id=9876, +                    name='Mr. Hemlock', +                    discriminator=6666, +                ), +                reason="He purrrrs like the best!",              )          ) diff --git a/pydis_site/apps/api/tests/test_nominations.py b/pydis_site/apps/api/tests/test_nominations.py index b37135f8..3892ec6e 100644 --- a/pydis_site/apps/api/tests/test_nominations.py +++ b/pydis_site/apps/api/tests/test_nominations.py @@ -3,7 +3,7 @@ from datetime import datetime as dt, timedelta, timezone  from django_hosts.resolvers import reverse  from .base import APISubdomainTestCase -from ..models import Nomination, User +from ..models import Nomination, NominationEntry, User  class CreationTests(APISubdomainTestCase): @@ -14,6 +14,11 @@ class CreationTests(APISubdomainTestCase):              name='joe dart',              discriminator=1111,          ) +        cls.user2 = User.objects.create( +            id=9876, +            name='Who?', +            discriminator=1234 +        )      def test_accepts_valid_data(self):          url = reverse('bot:nomination-list', host='api') @@ -27,17 +32,39 @@ class CreationTests(APISubdomainTestCase):          self.assertEqual(response.status_code, 201)          nomination = Nomination.objects.get(id=response.json()['id']) +        nomination_entry = NominationEntry.objects.get( +            nomination_id=nomination.id, +            actor_id=self.user.id +        )          self.assertAlmostEqual(              nomination.inserted_at,              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_entry.reason, data['reason'])          self.assertEqual(nomination.active, True) -    def test_returns_400_on_second_active_nomination(self): +    def test_returns_200_on_second_active_nomination_by_different_user(self): +        url = reverse('bot:nomination-list', host='api') +        first_data = { +            'actor': self.user.id, +            'reason': 'Joe Dart on Fender Bass', +            'user': self.user.id, +        } +        second_data = { +            'actor': self.user2.id, +            'reason': 'Great user', +            'user': self.user.id +        } + +        response1 = self.client.post(url, data=first_data) +        self.assertEqual(response1.status_code, 201) + +        response2 = self.client.post(url, data=second_data) +        self.assertEqual(response2.status_code, 201) + +    def test_returns_400_on_second_active_nomination_by_existing_nominator(self):          url = reverse('bot:nomination-list', host='api')          data = {              'actor': self.user.id, @@ -51,7 +78,7 @@ class CreationTests(APISubdomainTestCase):          response2 = self.client.post(url, data=data)          self.assertEqual(response2.status_code, 400)          self.assertEqual(response2.json(), { -            'active': ['There can only be one active nomination.'] +            'actor': ['This actor have already created nomination entry for this nomination.']          })      def test_returns_400_for_missing_user(self): @@ -189,30 +216,40 @@ class NominationTests(APISubdomainTestCase):          )          cls.active_nomination = Nomination.objects.create( -            user=cls.user, +            user=cls.user +        ) +        cls.active_nomination_entry = NominationEntry.objects.create( +            nomination=cls.active_nomination,              actor=cls.user,              reason="He's pretty funky"          )          cls.inactive_nomination = Nomination.objects.create(              user=cls.user, -            actor=cls.user, -            reason="He's pretty funky",              active=False,              end_reason="His neck couldn't hold the funk",              ended_at="5018-11-20T15:52:00+00:00"          ) +        cls.inactive_nomination_entry = NominationEntry.objects.create( +            nomination=cls.inactive_nomination, +            actor=cls.user, +            reason="He's pretty funky" +        ) -    def test_returns_200_update_reason_on_active(self): +    def test_returns_200_update_reason_on_active_with_actor(self):          url = reverse('bot:nomination-detail', args=(self.active_nomination.id,), host='api')          data = { -            'reason': "He's one funky duck" +            'reason': "He's one funky duck", +            'actor': self.user.id          }          response = self.client.patch(url, data=data)          self.assertEqual(response.status_code, 200) -        nomination = Nomination.objects.get(id=response.json()['id']) -        self.assertEqual(nomination.reason, data['reason']) +        nomination_entry = NominationEntry.objects.get( +            nomination_id=response.json()['id'], +            actor_id=self.user.id +        ) +        self.assertEqual(nomination_entry.reason, data['reason'])      def test_returns_400_on_frozen_field_update(self):          url = reverse('bot:nomination-detail', args=(self.active_nomination.id,), host='api') @@ -241,14 +278,18 @@ class NominationTests(APISubdomainTestCase):      def test_returns_200_update_reason_on_inactive(self):          url = reverse('bot:nomination-detail', args=(self.inactive_nomination.id,), host='api')          data = { -            'reason': "He's one funky duck" +            'reason': "He's one funky duck", +            'actor': self.user.id          }          response = self.client.patch(url, data=data)          self.assertEqual(response.status_code, 200) -        nomination = Nomination.objects.get(id=response.json()['id']) -        self.assertEqual(nomination.reason, data['reason']) +        nomination_entry = NominationEntry.objects.get( +            nomination_id=response.json()['id'], +            actor_id=self.user.id +        ) +        self.assertEqual(nomination_entry.reason, data['reason'])      def test_returns_200_update_end_reason_on_inactive(self):          url = reverse('bot:nomination-detail', args=(self.inactive_nomination.id,), host='api') @@ -442,3 +483,76 @@ class NominationTests(APISubdomainTestCase):          infractions = response.json()          self.assertEqual(len(infractions), 2) + +    def test_return_nomination_entries_get_single_nomination(self): +        url = reverse('bot:nomination-detail', args=(self.active_nomination.id,), host='api') +        response = self.client.get(url) +        self.assertEqual(response.status_code, 200) +        data = response.json() + +        self.assertEqual(len(data['entries']), 1) +        self.assertEqual(data['entries'][0], { +            "actor": self.user.id, +            "reason": "He's pretty funky", +            "inserted_at": self.active_nomination_entry.inserted_at.isoformat().replace( +                "+00:00", "Z" +            ) +        }) + +    def test_return_nomination_entries_get_all_nominations(self): +        url = reverse('api:nomination-list', host='api') +        response = self.client.get(url) +        self.assertEqual(response.status_code, 200) + +        data = response.json() + +        self.assertEqual(len(data), 2) +        self.assertEqual(len(data[0]["entries"]), 1) +        self.assertEqual(len(data[1]["entries"]), 1) + +    def test_patch_nomination_set_reviewed_of_active_nomination(self): +        url = reverse('api:nomination-detail', args=(self.active_nomination.id,), host='api') +        data = {'reviewed': True} + +        response = self.client.patch(url, data=data) +        self.assertEqual(response.status_code, 200) + +    def test_patch_nomination_set_reviewed_of_inactive_nomination(self): +        url = reverse('api:nomination-detail', args=(self.inactive_nomination.id,), host='api') +        data = {'reviewed': True} + +        response = self.client.patch(url, data=data) +        self.assertEqual(response.status_code, 400) +        self.assertEqual(response.json(), { +            'reviewed': ['This field cannot be set if nomination is inactive.'] +        }) + +    def test_patch_nomination_set_reviewed_and_end(self): +        url = reverse('api:nomination-detail', args=(self.active_nomination.id,), host='api') +        data = {'reviewed': True, 'active': False, 'end_reason': "What?"} + +        response = self.client.patch(url, data=data) +        self.assertEqual(response.status_code, 400) +        self.assertEqual(response.json(), { +            'reviewed': ['This field cannot be set same time than ending nomination.'] +        }) + +    def test_modifying_reason_without_actor(self): +        url = reverse('api:nomination-detail', args=(self.active_nomination.id,), host='api') +        data = {'reason': 'That is my reason!'} + +        response = self.client.patch(url, data=data) +        self.assertEqual(response.status_code, 400) +        self.assertEqual(response.json(), { +            'actor': ['This field is required when editing reason.'] +        }) + +    def test_modifying_reason_with_unknown_actor(self): +        url = reverse('api:nomination-detail', args=(self.active_nomination.id,), host='api') +        data = {'reason': 'That is my reason!', 'actor': 90909090909090} + +        response = self.client.patch(url, data=data) +        self.assertEqual(response.status_code, 400) +        self.assertEqual(response.json(), { +            'actor': ["Actor don't exist or have not nominated user."] +        }) | 
