import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; import 'package:dio/dio.dart'; import 'package:quiz_app/data/models/quiz/question_listings_model.dart'; import 'package:quiz_app/data/providers/dio_client.dart'; import 'package:quiz_app/data/services/quiz_service.dart'; import 'package:quiz_app/data/models/quiz/question_create_request.dart'; class MockDio extends Mock implements Dio {} class MockApiClient extends Mock implements ApiClient {} void main() { late MockDio mockDio; late QuizService quizService; setUp(() { mockDio = MockDio(); quizService = QuizService(); quizService.dio = mockDio; }); group('createQuiz', () { final request = QuizCreateRequestModel( title: 'Test Quiz', description: 'A sample quiz description', isPublic: true, date: '2025-05-19', totalQuiz: 1, limitDuration: 60, authorId: 'author_123', subjectId: 'subject_456', questionListings: [ QuestionListing( index: 1, question: 'Sample question?', targetAnswer: 'Sample Answer', duration: 30, type: 'multiple_choice', ) ], ); test('returns true when status code is 201', () async { when(() => mockDio.post(any(), data: any(named: 'data'))).thenAnswer( (_) async => Response( requestOptions: RequestOptions(path: ''), statusCode: 201, ), ); final result = await quizService.createQuiz(request); expect(result, true); }); test('throws Exception on non-201 response', () async { when(() => mockDio.post(any(), data: any(named: 'data'))).thenAnswer( (_) async => Response( requestOptions: RequestOptions(path: ''), statusCode: 400, ), ); expect(() => quizService.createQuiz(request), throwsException); }); test('throws Exception on Dio error', () async { when(() => mockDio.post(any(), data: any(named: 'data'))).thenThrow(Exception('Network Error')); expect(() => quizService.createQuiz(request), throwsException); }); }); group('createQuizAuto', () { const sentence = "This is a test sentence."; final mockResponseData = { 'message': "succes create quiz automatic", 'data': [ {'qustion': 'What is this?', 'answer': 'A test.'}, ] }; test('returns BaseResponseModel when status code is 200', () async { when(() => mockDio.post(any(), data: any(named: 'data'))).thenAnswer( (_) async => Response( requestOptions: RequestOptions(path: ''), statusCode: 200, data: mockResponseData, ), ); final result = await quizService.createQuizAuto(sentence); expect(result.data, isA>()); expect(result.data!.first.qustion, 'What is this?'); }); test('throws Exception on non-200 response', () async { when(() => mockDio.post(any(), data: any(named: 'data'))).thenAnswer( (_) async => Response( requestOptions: RequestOptions(path: ''), statusCode: 500, ), ); expect(() => quizService.createQuizAuto(sentence), throwsException); }); test('throws Exception on Dio error', () async { when(() => mockDio.post(any(), data: any(named: 'data'))).thenThrow(Exception('Network Error')); expect(() => quizService.createQuizAuto(sentence), throwsException); }); }); }