From 651c96d04e7c945a0fb7e371ab0965afb1a731ef Mon Sep 17 00:00:00 2001 From: Thom Wiggers Date: Tue, 23 Jul 2019 14:07:36 +0200 Subject: [PATCH 1/2] Add tests for close announcement --- website/announcements/tests.py | 72 ++++++++++++++++++++++++++++++++++ website/announcements/views.py | 6 ++- 2 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 website/announcements/tests.py diff --git a/website/announcements/tests.py b/website/announcements/tests.py new file mode 100644 index 00000000..82b6aa2e --- /dev/null +++ b/website/announcements/tests.py @@ -0,0 +1,72 @@ +from django.contrib.auth.models import AnonymousUser, User +from django.contrib.sessions.middleware import SessionMiddleware +from django.test import TestCase, RequestFactory +from django.urls import reverse + +from announcements.views import close_announcement + + +class AnnouncementCloseTestCase(TestCase): + + def setUp(self): + self.factory = RequestFactory() + self.user = User.objects.create_user( + username='thom', + email='test@example.com', + password='top secret', + ) + self.middleware = SessionMiddleware() + + def test_get_request(self): + for user in [self.user, AnonymousUser()]: + request = self.factory.get( + reverse('announcements:close-announcement')) + self.middleware.process_request(request) + with self.subTest(user=user): + request.user = user + response = close_announcement(request) + self.assertEqual(response.status_code, 405) + + def test_post_no_id(self): + request = self.factory.post( + reverse('announcements:close-announcement')) + self.middleware.process_request(request) + request.user = AnonymousUser() + response = close_announcement(request) + self.assertEqual(response.status_code, 400) + + def test_post_id_string(self): + request = self.factory.post( + reverse('announcements:close-announcement'), + {'id': 'bla'}) + self.middleware.process_request(request) + request.user = AnonymousUser() + response = close_announcement(request) + self.assertEqual(response.status_code, 400) + + def test_valid_request_anonymous(self): + request = self.factory.post( + reverse('announcements:close-announcement'), + {'id': 3}) + self.middleware.process_request(request) + request.user = AnonymousUser() + response = close_announcement(request) + + self.assertEqual(response.status_code, 204) + self.assertIn('closed_announcements', request.session) + self.assertIn(3, request.session['closed_announcements']) + self.assertTrue(request.session.modified) + self.assertEqual(response.content, b'') + + def test_valid_request_logged_in(self): + request = self.factory.post( + reverse('announcements:close-announcement'), + {'id': 3}) + self.middleware.process_request(request) + request.user = self.user + response = close_announcement(request) + + self.assertEqual(response.status_code, 204) + self.assertIn('closed_announcements', request.session) + self.assertIn(3, request.session['closed_announcements']) + self.assertEqual(response.content, b'') diff --git a/website/announcements/views.py b/website/announcements/views.py index 6ab4d85e..d23b7f8e 100644 --- a/website/announcements/views.py +++ b/website/announcements/views.py @@ -12,7 +12,11 @@ def close_announcement(request): """ if 'id' not in request.POST: return HttpResponseBadRequest("no id specified") - announcement_id = int(request.POST['id']) + try: + announcement_id = int(request.POST['id']) + except ValueError: + return HttpResponseBadRequest("no integer id specified") + # if we do not have a list of closed announcements yet: if 'closed_announcements' not in request.session: request.session['closed_announcements'] = [] # cannot use sets here :( -- GitLab From e2770eb0a1e98d0845c851b3b6219c114b30428e Mon Sep 17 00:00:00 2001 From: Thom Wiggers Date: Tue, 23 Jul 2019 15:01:19 +0200 Subject: [PATCH 2/2] Add test for closed announcement already exists --- website/announcements/tests.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/website/announcements/tests.py b/website/announcements/tests.py index 82b6aa2e..db46de09 100644 --- a/website/announcements/tests.py +++ b/website/announcements/tests.py @@ -70,3 +70,19 @@ class AnnouncementCloseTestCase(TestCase): self.assertIn('closed_announcements', request.session) self.assertIn(3, request.session['closed_announcements']) self.assertEqual(response.content, b'') + + def test_valid_alread_canceled(self): + request = self.factory.post( + reverse('announcements:close-announcement'), + {'id': 3}) + self.middleware.process_request(request) + request.session['closed_announcements'] = [3] + request.user = AnonymousUser() + response = close_announcement(request) + + self.assertEqual(response.status_code, 204) + self.assertIn('closed_announcements', request.session) + self.assertIn(3, request.session['closed_announcements']) + self.assertEqual(len(request.session['closed_announcements']), 1) + self.assertTrue(request.session.modified) + self.assertEqual(response.content, b'') -- GitLab