import unittest from unittest.mock import MagicMock from app.services import QuizService from app.app.schemas.requests import QuizCreateSchema from app.app.schemas.response import UserQuizListResponse from app.exception import DataNotFoundException, ValidationException class TestQuizService(unittest.TestCase): def setUp(self): self.quiz_repo = MagicMock() self.user_repo = MagicMock() self.subject_repo = MagicMock() self.service = QuizService( quiz_repository=self.quiz_repo, user_repository=self.user_repo, subject_repository=self.subject_repo, ) def test_get_quiz_success(self): fake_quiz = MagicMock(subject_id="subj1") fake_subject = MagicMock() self.quiz_repo.get_by_id.return_value = fake_quiz self.subject_repo.get_by_id.return_value = fake_subject result = self.service.get_quiz("quiz123") self.assertIsNotNone(result) self.quiz_repo.get_by_id.assert_called_once() def test_get_quiz_not_found(self): self.quiz_repo.get_by_id.return_value = None with self.assertRaises(DataNotFoundException): self.service.get_quiz("invalid_id") def test_search_quiz_success(self): fake_quiz = MagicMock(author_id="user123") self.quiz_repo.search_by_title_or_category.return_value = [fake_quiz] self.quiz_repo.count_by_search.return_value = 1 self.user_repo.get_user_by_id.return_value = MagicMock() result, total = self.service.search_quiz("math", "subj1") self.assertEqual(total, 1) self.assertTrue(len(result) > 0) def test_search_quiz_author_missing(self): fake_quiz = MagicMock(author_id="user123") self.quiz_repo.search_by_title_or_category.return_value = [fake_quiz] self.quiz_repo.count_by_search.return_value = 1 self.user_repo.get_user_by_id.return_value = None # simulate missing author result, total = self.service.search_quiz("math", "subj1") self.assertEqual(result, []) # filtered out self.assertEqual(total, 1) def test_create_quiz_with_invalid_options(self): question = MagicMock(type="option", options=["a", "b"]) # only 2 options quiz_schema = MagicMock(question_listings=[question]) with self.assertRaises(ValidationException): self.service.create_quiz(quiz_schema) def test_create_quiz_valid(self): question = MagicMock(type="option", options=["a", "b", "c", "d"], duration=30) quiz_schema = MagicMock(question_listings=[question]) self.quiz_repo.create.return_value = "quiz_id_123" result = self.service.create_quiz(quiz_schema) self.assertEqual(result, "quiz_id_123") def test_get_user_quiz_success(self): self.quiz_repo.get_by_user_id.return_value = [MagicMock()] self.quiz_repo.count_by_user_id.return_value = 1 self.user_repo.get_user_by_id.return_value = MagicMock() result = self.service.get_user_quiz("user123") self.assertIsInstance(result, UserQuizListResponse) self.assertEqual(result.total, 1) def test_get_user_quiz_empty(self): self.quiz_repo.get_by_user_id.return_value = [] result = self.service.get_user_quiz("user123") self.assertEqual(result.total, 0) self.assertEqual(result.quizzes, []) def test_get_quiz_recommendation_success(self): quiz = MagicMock(author_id="user123") self.quiz_repo.get_top_played_quizzes.return_value = [quiz] self.user_repo.get_user_by_id.return_value = MagicMock() result = self.service.get_quiz_recommendation(1, 10) self.assertTrue(len(result) > 0) def test_get_quiz_recommendation_empty(self): self.quiz_repo.get_top_played_quizzes.return_value = [] with self.assertRaises(DataNotFoundException): self.service.get_quiz_recommendation(1, 10) def test_update_quiz(self): self.quiz_repo.update.return_value = True result = self.service.update_quiz("quiz_id", {"title": "updated"}) self.assertTrue(result) def test_delete_quiz(self): self.quiz_repo.delete.return_value = True result = self.service.delete_quiz("quiz_id") self.assertTrue(result) if __name__ == "__main__": unittest.main()