TIF_E41211115_Genso_quiz_ba.../test/service/test_quiz_service.py

112 lines
4.3 KiB
Python

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()