fix(apps): improve auth repository tests
This commit is contained in:
@@ -1,35 +1,41 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:mocktail/mocktail.dart';
|
||||
import 'package:social_app/features/auth/data/auth_repository.dart';
|
||||
import 'package:social_app/features/auth/data/auth_api.dart';
|
||||
import 'package:social_app/features/auth/data/auth_repository_impl.dart';
|
||||
import 'package:social_app/features/auth/data/models/signup_request.dart';
|
||||
import 'package:social_app/features/auth/data/models/login_request.dart';
|
||||
import 'package:social_app/features/auth/data/models/auth_response.dart';
|
||||
import 'package:social_app/core/storage/token_storage.dart';
|
||||
import 'package:social_app/core/api/api_client.dart';
|
||||
|
||||
class MockAuthApi extends Mock implements AuthApi {}
|
||||
|
||||
class MockTokenStorage extends Mock implements TokenStorage {}
|
||||
|
||||
class FakeSignupStartRequest extends Fake implements SignupStartRequest {}
|
||||
|
||||
class FakeLoginRequest extends Fake implements LoginRequest {}
|
||||
class MockApiClient extends Mock implements ApiClient {}
|
||||
|
||||
void main() {
|
||||
late AuthRepository repository;
|
||||
late AuthRepositoryImpl repository;
|
||||
late MockAuthApi mockApi;
|
||||
late MockTokenStorage mockStorage;
|
||||
|
||||
setUpAll(() {
|
||||
registerFallbackValue(FakeSignupStartRequest());
|
||||
registerFallbackValue(FakeLoginRequest());
|
||||
});
|
||||
|
||||
setUp(() {
|
||||
mockApi = MockAuthApi();
|
||||
mockStorage = MockTokenStorage();
|
||||
repository = AuthRepositoryImpl(api: mockApi, tokenStorage: mockStorage);
|
||||
registerFallbackValue(
|
||||
const SignupStartRequest(username: '', email: '', password: ''),
|
||||
);
|
||||
registerFallbackValue(const LoginRequest(email: '', password: ''));
|
||||
registerFallbackValue(const SignupVerifyRequest(email: '', token: ''));
|
||||
registerFallbackValue(const SignupResendRequest(email: ''));
|
||||
registerFallbackValue(const LogoutRequest(refreshToken: ''));
|
||||
registerFallbackValue(const RefreshRequest(refreshToken: ''));
|
||||
});
|
||||
|
||||
group('AuthRepository', () {
|
||||
test('signupStart returns SignupStartResponse', () async {
|
||||
final repo = _MockAuthRepository();
|
||||
when(() => repo.signupStart(any())).thenAnswer(
|
||||
group('AuthRepositoryImpl', () {
|
||||
test('signupStart calls api and returns response', () async {
|
||||
when(() => mockApi.signupStart(any())).thenAnswer(
|
||||
(_) async => const SignupStartResponse(
|
||||
status: 'pending_verification',
|
||||
email: 'test@example.com',
|
||||
@@ -37,7 +43,7 @@ void main() {
|
||||
),
|
||||
);
|
||||
|
||||
final result = await repo.signupStart(
|
||||
final result = await repository.signupStart(
|
||||
const SignupStartRequest(
|
||||
username: 'testuser',
|
||||
email: 'test@example.com',
|
||||
@@ -46,12 +52,11 @@ void main() {
|
||||
);
|
||||
|
||||
expect(result.status, 'pending_verification');
|
||||
expect(result.email, 'test@example.com');
|
||||
verify(() => mockApi.signupStart(any())).called(1);
|
||||
});
|
||||
|
||||
test('login returns AuthResponse and saves tokens', () async {
|
||||
final repo = _MockAuthRepository();
|
||||
when(() => repo.login(any())).thenAnswer(
|
||||
test('login calls api and saves tokens', () async {
|
||||
when(() => mockApi.login(any())).thenAnswer(
|
||||
(_) async => AuthResponse(
|
||||
accessToken: 'access_token',
|
||||
refreshToken: 'refresh_token',
|
||||
@@ -60,15 +65,65 @@ void main() {
|
||||
user: const AuthUser(id: '123', email: 'test@example.com'),
|
||||
),
|
||||
);
|
||||
when(
|
||||
() => mockStorage.saveTokens(
|
||||
access: any(named: 'access'),
|
||||
refresh: any(named: 'refresh'),
|
||||
),
|
||||
).thenAnswer((_) async {});
|
||||
|
||||
final result = await repo.login(
|
||||
final result = await repository.login(
|
||||
const LoginRequest(email: 'test@example.com', password: 'password123'),
|
||||
);
|
||||
|
||||
expect(result.accessToken, 'access_token');
|
||||
expect(result.user.email, 'test@example.com');
|
||||
verify(
|
||||
() => mockStorage.saveTokens(
|
||||
access: 'access_token',
|
||||
refresh: 'refresh_token',
|
||||
),
|
||||
).called(1);
|
||||
});
|
||||
|
||||
test('logout calls api with refresh token and clears storage', () async {
|
||||
when(
|
||||
() => mockStorage.getRefreshToken(),
|
||||
).thenAnswer((_) async => 'refresh_token');
|
||||
when(() => mockApi.logout(any())).thenAnswer((_) async {});
|
||||
when(() => mockStorage.clear()).thenAnswer((_) async {});
|
||||
|
||||
await repository.logout();
|
||||
|
||||
verify(() => mockApi.logout(any())).called(1);
|
||||
verify(() => mockStorage.clear()).called(1);
|
||||
});
|
||||
|
||||
test('refresh saves new tokens', () async {
|
||||
when(() => mockApi.refresh(any())).thenAnswer(
|
||||
(_) async => AuthResponse(
|
||||
accessToken: 'new_access',
|
||||
refreshToken: 'new_refresh',
|
||||
expiresIn: 3600,
|
||||
tokenType: 'bearer',
|
||||
user: const AuthUser(id: '123', email: 'test@example.com'),
|
||||
),
|
||||
);
|
||||
when(
|
||||
() => mockStorage.saveTokens(
|
||||
access: any(named: 'access'),
|
||||
refresh: any(named: 'refresh'),
|
||||
),
|
||||
).thenAnswer((_) async {});
|
||||
|
||||
final result = await repository.refresh('old_refresh');
|
||||
|
||||
expect(result.accessToken, 'new_access');
|
||||
verify(
|
||||
() => mockStorage.saveTokens(
|
||||
access: 'new_access',
|
||||
refresh: 'new_refresh',
|
||||
),
|
||||
).called(1);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
class _MockAuthRepository extends Mock implements AuthRepository {}
|
||||
|
||||
Reference in New Issue
Block a user