from django.test import TestCase from django.contrib.auth.models import User from django.utils import timezone from rest_framework import status from rest_framework.test import APITestCase, APIRequestFactory, force_authenticate from webapp.models import Signup, SignupForm from webapp.serializers import SignupSerializer, SignupFormSerializer from webapp.tests.event_fixture import createEventObject, createEventJSON from webapp.utils import month_from_now import json URL = "/api/signup/" ALL_QUESTION_TYPES = json.dumps([ ]) def createSignupForm(name="Form1", start_time=timezone.now(), end_time=month_from_now(), questions=ALL_QUESTION_TYPES, visible=True): return SignupForm.objects.create( title=name, start_time=start_time, end_time=end_time, questions=questions, visible=visible ) def createSignupObject(form, answer): return Signup.objects.create( signupForm=form, answer=answer ) def createSignupJSON(form_id, answer): return { "signupForm": form_id, "answer": answer } class SignupTestCase(APITestCase): def setUp(self): self.signupForm = createSignupForm() self.hiddenForm = createSignupForm(visible=False) # self.event = createEventObject(signup_id=self.signupForm.id) self.signup1 = createSignupObject(self.signupForm, json.dumps([])) self.signup2 = createSignupObject(self.signupForm, json.dumps([])) username, password = "test_admin", "password123" self.authClient = User.objects.create_superuser(username, "myemail@test.com", password) def test_get_signups(self): expected = SignupSerializer( self.signupForm.signup_set.all(), many=True ) # Unauthorized response = self.client.get(URL, format="json") self.assertTrue(response.status_code, status.HTTP_401_UNAUTHORIZED) # Authenticate self.client.force_authenticate(user=self.authClient) response = self.client.get(URL, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data["results"], expected.data) def test_get_single_signup(self): id = self.signup1.id expected = SignupSerializer( Signup.objects.get(id=id) ) # Unauthorized response = self.client.get(f"{URL}{id}/", format="json") self.assertTrue(response.status_code, status.HTTP_401_UNAUTHORIZED) # Authenticate self.client.force_authenticate(user=self.authClient) response = self.client.get(f"{URL}{id}/", format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data, expected.data) def test_create_signup(self): new = createSignupJSON(self.signup1.id, "[]") response = self.client.post(URL, format="json") self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(Signup.objects.count(), 3) def test_create_signup_404_or_hidden(self): new = createSignupJSON(3001, "[]") response = self.client.post(URL, format="json") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) self.assertEqual(Signup.objects.count(), 2) new = createSignupJSON(self.hiddenForm, "[]") response = self.client.post(URL, format="json") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) self.assertEqual(Signup.objects.count(), 2) # Update and Delete are available for super admin (Django Admin) # and to the user that signed up (uid token) def test_update_signup_token(self): pass def test_delete_signup_token(self): pass