129 lines
4.2 KiB
Dart
129 lines
4.2 KiB
Dart
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<BaseResponseModel>());
|
|
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);
|
|
});
|
|
});
|
|
}
|