import pytest from django.urls import reverse from quiz.models import Course, Tag, Question, Exam, QuizUser, QuizSession from quiz.forms import CreateQuizForm @pytest.mark.django_db class TestQuizCreation: @pytest.fixture(autouse=True) def setup_data(self, client: pytest.FixtureRequest) -> None: # Clear database to ensure fresh state Question.objects.all().delete() Tag.objects.all().delete() QuizSession.objects.all().delete() Course.objects.all().delete() self.client = client s = self.client.session s.save() self.user = QuizUser.objects.create(session_key=s.session_key) self.course1 = Course.objects.create(name="Course 1", code="C1") self.course2 = Course.objects.create(name="Course 2", code="C2") self.tag1 = Tag.objects.create(name="Tag1", slug="tag-1") self.exam1 = Exam.objects.create(course=self.course1, date="2023-01-01") self.exam2 = Exam.objects.create(course=self.course2, date="2023-01-02") self.q1 = Question.objects.create( exam=self.exam1, text="UNIQUE_Q1_TEXT", correct_answer="A", file_path="path1" ) self.q1.tags.add(self.tag1) self.q2 = Question.objects.create( exam=self.exam2, text="UNIQUE_Q2_TEXT", correct_answer="A,B", file_path="path2" ) def test_create_quiz_form_valid(self) -> None: form_data = { 'course': self.course1.id, 'tags': [self.tag1.id], 'question_type': ['single'] } form = CreateQuizForm(data=form_data) assert form.is_valid() def test_create_quiz_view_post(self) -> None: response = self.client.post(reverse('quiz:create_quiz'), { 'course': self.course1.id, 'tags': [self.tag1.id], 'question_type': ['single'] }) session = QuizSession.objects.get(user=self.user) assert response.status_code == 302 assert response.url == reverse('quiz:quiz_mode', args=[session.id]) assert session.course.id == self.course1.id assert list(session.tags.values_list('id', flat=True)) == [self.tag1.id] assert session.question_types == ['single'] def test_get_next_question_filters(self) -> None: session = QuizSession.objects.create(user=self.user, course=self.course1) response = self.client.get(reverse('quiz:next_question', args=[session.id])) assert response.status_code == 200 assert "UNIQUE_Q1_TEXT" in response.content.decode() # Now change filter to Course 2 session.course = self.course2 session.save() response = self.client.get(reverse('quiz:next_question', args=[session.id])) assert "UNIQUE_Q2_TEXT" in response.content.decode() def test_filter_by_type(self) -> None: session = QuizSession.objects.create(user=self.user, question_types=['multi']) response = self.client.get(reverse('quiz:next_question', args=[session.id])) assert "UNIQUE_Q2_TEXT" in response.content.decode() session.question_types = ['single'] session.save() response = self.client.get(reverse('quiz:next_question', args=[session.id])) assert "UNIQUE_Q1_TEXT" in response.content.decode()