aboutsummaryrefslogtreecommitdiffstats
path: root/pydis_site/apps/api/tests
diff options
context:
space:
mode:
authorGravatar ks129 <[email protected]>2021-02-22 11:37:53 +0200
committerGravatar ks129 <[email protected]>2021-02-22 11:37:53 +0200
commit9af0579297e8f1b535099f24f41b4c7f85e2a0cc (patch)
tree2243633de727e71c9a688de55a35a7346d47dfff /pydis_site/apps/api/tests
parentSmall improvements in nomination viewset (diff)
Update nomination-related tests to cover recent table-splitting changes
Diffstat (limited to 'pydis_site/apps/api/tests')
-rw-r--r--pydis_site/apps/api/tests/test_models.py16
-rw-r--r--pydis_site/apps/api/tests/test_nominations.py144
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."]
+ })