import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; import 'package:dio/dio.dart'; import 'package:quiz_app/core/endpoint/api_endpoint.dart'; import 'package:quiz_app/data/models/base/base_model.dart'; import 'package:quiz_app/data/services/answer_service.dart'; class MockDio extends Mock implements Dio {} void main() { late MockDio mockDio; late AnswerService answerService; setUp(() { mockDio = MockDio(); answerService = AnswerService(); answerService.dio = mockDio; }); group('AnswerService Tests', () { test('submitQuizAnswers - Success', () async { final payload = {'question_id': 'q1', 'answer': 'A'}; when(() => mockDio.post(APIEndpoint.quizAnswer, data: payload)).thenAnswer((_) async => Response( statusCode: 200, data: {}, requestOptions: RequestOptions(path: APIEndpoint.quizAnswer), )); final result = await answerService.submitQuizAnswers(payload); expect(result, isA()); expect(result?.message, 'success'); verify(() => mockDio.post(APIEndpoint.quizAnswer, data: payload)).called(1); }); test('submitQuizAnswers - Failure', () async { final payload = {'question_id': 'q1', 'answer': 'A'}; when(() => mockDio.post(APIEndpoint.quizAnswer, data: payload)).thenThrow(DioException( requestOptions: RequestOptions(path: APIEndpoint.quizAnswer), error: 'Network Error', type: DioExceptionType.connectionError, )); final result = await answerService.submitQuizAnswers(payload); expect(result, isNull); verify(() => mockDio.post(APIEndpoint.quizAnswer, data: payload)).called(1); }); test('getAnswerSession - Success', () async { final sessionId = '682a26b3bedac6c20a215452'; final userId = '680f0e63180b5c19b3751d42'; final responseData = { "message": "Successfully retrieved the answer", "data": { "id": "682a26e6bedac6c20a215453", "session_id": "682a26b3bedac6c20a215452", "quiz_id": "682a120f18339f4cc31318e4", "user_id": "680f0e63180b5c19b3751d42", "answered_at": "2025-05-19 01:28:22", "answers": [ { "index": 1, "question": "Siapakah ketua Wali Songo yang juga dikenal sebagai Sunan Gresik?", "target_answer": "Maulana Malik Ibrahim", "duration": 30, "type": "fill_the_blank", "options": null, "answer": "maulana Malik ibrahim", "is_correct": true, "time_spent": 8.0 } ], "total_score": 100, "total_correct": 1 }, "meta": null }; when(() => mockDio.post(APIEndpoint.quizAnswerSession, data: { "session_id": sessionId, "user_id": userId, })).thenAnswer((_) async => Response( statusCode: 200, data: responseData, requestOptions: RequestOptions(path: APIEndpoint.quizAnswerSession), )); final result = await answerService.getAnswerSession(sessionId, userId); expect(result, isNotNull); expect(result?.data?.sessionId, sessionId); expect(result?.data?.userId, userId); expect(result?.data?.totalScore, 100); verify(() => mockDio.post(APIEndpoint.quizAnswerSession, data: { "session_id": sessionId, "user_id": userId, })).called(1); }); test('getAnswerSession - Failure', () async { final sessionId = ''; final userId = ''; when(() => mockDio.post(APIEndpoint.quizAnswerSession, data: { "session_id": sessionId, "user_id": userId, })).thenThrow(DioException( requestOptions: RequestOptions(path: APIEndpoint.quizAnswerSession), error: 'Network Error', type: DioExceptionType.connectionError, )); final result = await answerService.getAnswerSession(sessionId, userId); expect(result, isNull); verify(() => mockDio.post(APIEndpoint.quizAnswerSession, data: { "session_id": sessionId, "user_id": userId, })).called(1); }); }); }