115 lines
3.4 KiB
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);
|
|
});
|
|
});
|
|
}
|