from django.test import TestCase, Client from django.urls import reverse from quiz.models import Course, Tag, Question, Exam from quiz.forms import CreateQuizForm class QuizCreationTests(TestCase): def setUp(self): 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="Tag 1", slug="tag-1") self.tag2 = Tag.objects.create(name="Tag 2", slug="tag-2") 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="Q1", correct_answer="A", file_path="p1") self.q1.tags.add(self.tag1) self.q2 = Question.objects.create(exam=self.exam2, text="Q2", correct_answer="A,B", file_path="p2") self.q2.tags.add(self.tag2) self.client = Client() def test_create_quiz_form_valid(self): form_data = { 'course': self.course1.id, 'tags': [self.tag1.id], 'question_type': ['single'] } form = CreateQuizForm(data=form_data) self.assertTrue(form.is_valid()) def test_create_quiz_view_post_updates_session(self): response = self.client.post(reverse('create_quiz'), { 'course': self.course1.id, 'tags': [self.tag1.id], 'question_type': ['single'] }) self.assertRedirects(response, reverse('next_question')) session = self.client.session self.assertEqual(session['quiz_filter_course_id'], self.course1.id) self.assertEqual(session['quiz_filter_tag_ids'], [self.tag1.id]) self.assertEqual(session['quiz_filter_types'], ['single']) def test_get_next_question_respects_filters(self): # Set session data manually session = self.client.session session['quiz_filter_course_id'] = self.course1.id session.save() # Should get Q1 (Course 1) but not Q2 (Course 2) # Note: We need a user session for answered questions tracking, # but the view handles anonymous users by creating a session or erroring? # Let's check middleware. It seems middleware handles quiz_user creation. response = self.client.get(reverse('next_question')) self.assertEqual(response.status_code, 200) self.assertContains(response, "Q1") # Now change filter to Course 2 session['quiz_filter_course_id'] = self.course2.id session.save() response = self.client.get(reverse('next_question')) self.assertContains(response, "Q2") def test_filter_by_type(self): session = self.client.session session['quiz_filter_types'] = ['multi'] session.save() response = self.client.get(reverse('next_question')) self.assertContains(response, "Q2") # Q2 is multi (A,B) session['quiz_filter_types'] = ['single'] session.save() response = self.client.get(reverse('next_question')) self.assertContains(response, "Q1") # Q1 is single (A)