TIF_E41211115_Genso_quiz_app/test/service/quiz_service_test.dart

115 lines
3.4 KiB
Dart

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<List<RawQuizModel>>());
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);
});
});
}