112 lines
4.3 KiB
Python
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()
|