TIF_E41211115_Genso_quiz_app/test/service/auth_service_test.dart

151 lines
5.5 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/login/login_request_model.dart';
import 'package:quiz_app/data/models/register/register_request.dart';
import 'package:quiz_app/data/services/auth_service.dart';
class MockDio extends Mock implements Dio {}
void main() {
late MockDio mockDio;
late AuthService authService;
setUp(() {
mockDio = MockDio();
authService = AuthService();
authService.dio = mockDio;
});
group('AuthService with Mocktail (Using Real Data)', () {
test('Register Success', () async {
final request = RegisterRequestModel(
email: 'danakhdan@gmail.com',
password: '123456',
name: 'Akhdan Robbani',
birthDate: '12-07-2002',
);
when(() => mockDio.post(APIEndpoint.register, data: request.toJson())).thenAnswer((_) async => Response(
statusCode: 200,
data: {},
requestOptions: RequestOptions(path: APIEndpoint.register),
));
final result = await authService.register(request);
expect(result, true);
verify(() => mockDio.post(APIEndpoint.register, data: request.toJson())).called(1);
});
test('Register Failure', () async {
final request = RegisterRequestModel(
email: 'danakhdan@gmail.com',
password: '123456',
name: 'Akhdan Robbani',
birthDate: '12-07-2002',
);
when(() => mockDio.post(APIEndpoint.register, data: request.toJson())).thenAnswer((_) async => Response(
statusCode: 400,
data: {'message': 'Registration failed'},
requestOptions: RequestOptions(path: APIEndpoint.register),
));
expect(() => authService.register(request), throwsException);
verify(() => mockDio.post(APIEndpoint.register, data: request.toJson())).called(1);
});
test('Login With Email Success', () async {
final request = LoginRequestModel(email: 'danakhdan@gmail.com', password: '123456');
final responseData = {
'message': 'Login success',
'data': {
'id': 'lkasjd93093j4oi234n1234',
'email': 'danakhdan@gmail.com',
'name': 'Akhdan Robbani',
'birth_date': '2002-08-13 07:00:00',
'pic_url': 'https://example.com/akhdan.png',
'phone': '081234567890',
'locale': 'id-ID',
},
'meta': null,
};
when(() => mockDio.post(APIEndpoint.login, data: request.toJson())).thenAnswer((_) async => Response(
statusCode: 200,
data: responseData,
requestOptions: RequestOptions(path: APIEndpoint.login),
));
final result = await authService.loginWithEmail(request);
expect(result.name, 'Akhdan Robbani');
expect(result.email, 'danakhdan@gmail.com');
expect(result.birthDate, DateTime.parse('2002-08-13 07:00:00'));
expect(result.phone, '081234567890');
expect(result.locale, 'id-ID');
verify(() => mockDio.post(APIEndpoint.login, data: request.toJson())).called(1);
});
test('Login With Email Failure - Invalid Credentials', () async {
final request = LoginRequestModel(email: 'danakhdan@gmail.com', password: 'wrongpassword');
when(() => mockDio.post(APIEndpoint.login, data: request.toJson())).thenAnswer((_) async => Response(
statusCode: 401,
data: {'message': 'Invalid credentials'},
requestOptions: RequestOptions(path: APIEndpoint.login),
));
expect(() => authService.loginWithEmail(request), throwsException);
verify(() => mockDio.post(APIEndpoint.login, data: request.toJson())).called(1);
});
test('Login With Google Success', () async {
final idToken = 'valid_google_token';
final responseData = {
'message': 'Login success',
'data': {
'id': '680e5a6d2f480bd75db17a09',
'email': 'danakhdan@gmail.com',
'name': 'Akhdan Robbani',
'birth_date': '2002-08-13 07:00:00',
'pic_url': null,
'phone': '081234567890',
'locale': 'id-ID'
},
'meta': null
};
when(() => mockDio.post(APIEndpoint.loginGoogle, data: {"token_id": idToken})).thenAnswer((_) async => Response(
statusCode: 200,
data: responseData,
requestOptions: RequestOptions(path: APIEndpoint.loginGoogle),
));
final result = await authService.loginWithGoogle(idToken);
expect(result.name, 'Akhdan Robbani');
expect(result.email, 'danakhdan@gmail.com');
expect(result.birthDate, DateTime.parse('2002-08-13 07:00:00'));
expect(result.phone, '081234567890');
expect(result.locale, 'id-ID');
verify(() => mockDio.post(APIEndpoint.loginGoogle, data: {"token_id": idToken})).called(1);
});
test('Login With Google Failure - Invalid Token', () async {
final idToken = 'invalid_google_token';
when(() => mockDio.post(APIEndpoint.loginGoogle, data: {"token_id": idToken})).thenAnswer((_) async => Response(
statusCode: 401,
data: {'message': 'Invalid Google token'},
requestOptions: RequestOptions(path: APIEndpoint.loginGoogle),
));
expect(() => authService.loginWithGoogle(idToken), throwsException);
verify(() => mockDio.post(APIEndpoint.loginGoogle, data: {"token_id": idToken})).called(1);
});
});
}