Files

112 lines
3.8 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:lanebow/services/auth_service.dart';
import 'package:lanebow/services/api_service.dart';
import 'package:lanebow/models/user_model.dart';
import 'package:lanebow/config/api_config.dart';
@GenerateMocks([ApiService, FlutterSecureStorage])
import 'auth_service_test.mocks.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
group('AuthService', () {
late MockApiService mockApiService;
late MockFlutterSecureStorage mockSecureStorage;
late AuthService authService;
setUp(() async {
mockApiService = MockApiService();
mockSecureStorage = MockFlutterSecureStorage();
SharedPreferences.setMockInitialValues({});
authService = AuthService(apiService: mockApiService, secureStorage: mockSecureStorage);
});
test('login 성공 시 토큰/유저 저장 및 isAuthenticated=true', () async {
// arrange
final fakeUserJson = {
'id': 'u1',
'name': 'Tester',
'email': 't@example.com',
'role': 'admin',
'clubId': 'c1',
};
when(mockApiService.post(ApiConfig.login, data: anyNamed('data'))).thenAnswer(
(_) async => {
'token': 'fake-token',
'user': fakeUserJson,
},
);
// act
final ok = await authService.login('id', 'pw');
// assert
expect(ok, true);
expect(authService.isAuthenticated, true);
expect(authService.token, 'fake-token');
verify(mockSecureStorage.write(key: ApiConfig.tokenKey, value: 'fake-token')).called(1);
verify(mockApiService.setToken('fake-token')).called(1);
final prefs = await SharedPreferences.getInstance();
expect(prefs.getString(ApiConfig.userIdKey), 'u1');
expect(prefs.getString(ApiConfig.userRoleKey), 'admin');
expect(prefs.getString(ApiConfig.clubIdKey), 'c1');
});
test('initialize() 저장된 토큰이 있으면 프로필 조회 및 currentUser 설정', () async {
// arrange
when(mockSecureStorage.read(key: ApiConfig.tokenKey)).thenAnswer((_) async => 'saved-token');
when(mockApiService.get(ApiConfig.profile)).thenAnswer((_) async => {
'id': 'u1',
'name': 'Tester',
'email': 't@example.com',
'role': 'admin',
'clubId': 'c1',
});
// act
await authService.initialize();
// assert
expect(authService.isInitialized, true);
expect(authService.token, 'saved-token');
expect(authService.currentUser, isA<User>());
verify(mockApiService.setToken('saved-token')).called(1);
});
test('logout() 토큰/유저/저장소 초기화', () async {
// arrange: 로그인된 상태처럼 세팅
when(mockApiService.post(ApiConfig.login, data: anyNamed('data'))).thenAnswer(
(_) async => {
'token': 'fake-token',
'user': {
'id': 'u1',
'name': 'Tester',
'email': 't@example.com',
'role': 'admin',
},
},
);
await authService.login('id', 'pw');
// act
await authService.logout();
// assert
expect(authService.isAuthenticated, false);
expect(authService.currentUser, isNull);
verify(mockSecureStorage.delete(key: ApiConfig.tokenKey)).called(1);
final prefs = await SharedPreferences.getInstance();
expect(prefs.getString(ApiConfig.userIdKey), isNull);
expect(prefs.getString(ApiConfig.userRoleKey), isNull);
expect(prefs.getString(ApiConfig.clubIdKey), isNull);
});
});
}