- 모든 서비스 메서드 시그니처를 실제 구현에 맞게 수정 - TestDataGenerator 제거하고 직접 객체 생성으로 변경 - 모델 필드명 및 타입 불일치 수정 - 불필요한 Either 패턴 사용 제거 - null safety 관련 이슈 해결 수정된 파일: - test/integration/screens/company_integration_test.dart - test/integration/screens/equipment_integration_test.dart - test/integration/screens/user_integration_test.dart - test/integration/screens/login_integration_test.dart
197 lines
6.6 KiB
Dart
197 lines
6.6 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:dio/dio.dart';
|
|
import 'package:superport/data/models/auth/login_request.dart';
|
|
import 'test_helper.dart';
|
|
|
|
void main() {
|
|
group('실제 API 로그인 테스트', skip: 'Real API tests - skipping in CI', () {
|
|
setUpAll(() async {
|
|
await RealApiTestHelper.setupTestEnvironment();
|
|
});
|
|
|
|
tearDownAll(() async {
|
|
await RealApiTestHelper.teardownTestEnvironment();
|
|
});
|
|
|
|
test('유효한 계정으로 로그인 성공', () async {
|
|
// Arrange
|
|
final loginRequest = LoginRequest(
|
|
email: 'admin@superport.kr',
|
|
password: 'admin123!',
|
|
);
|
|
|
|
// Act
|
|
final result = await RealApiTestHelper.authService.login(loginRequest);
|
|
|
|
// Assert
|
|
expect(result.isRight(), true);
|
|
|
|
result.fold(
|
|
(failure) => fail('로그인이 실패하면 안됩니다: ${failure.message}'),
|
|
(loginResponse) {
|
|
expect(loginResponse.accessToken, isNotEmpty);
|
|
expect(loginResponse.refreshToken, isNotEmpty);
|
|
expect(loginResponse.tokenType, 'Bearer');
|
|
expect(loginResponse.user, isNotNull);
|
|
expect(loginResponse.user.email, 'admin@superport.kr');
|
|
|
|
// 로그인 성공 정보 확인
|
|
// Access Token: ${loginResponse.accessToken.substring(0, 20)}...
|
|
// User ID: ${loginResponse.user.id}
|
|
// User Email: ${loginResponse.user.email}
|
|
// User Name: ${loginResponse.user.name}
|
|
// User Role: ${loginResponse.user.role}
|
|
},
|
|
);
|
|
});
|
|
|
|
test('잘못된 이메일로 로그인 실패', () async {
|
|
// Arrange
|
|
final loginRequest = LoginRequest(
|
|
email: 'wrong@email.com',
|
|
password: 'admin123!',
|
|
);
|
|
|
|
// Act
|
|
final result = await RealApiTestHelper.authService.login(loginRequest);
|
|
|
|
// Assert
|
|
expect(result.isLeft(), true);
|
|
|
|
result.fold(
|
|
(failure) {
|
|
expect(failure.message, contains('올바르지 않습니다'));
|
|
// 로그인 실패 (잘못된 이메일)
|
|
// Error: ${failure.message}
|
|
},
|
|
(_) => fail('잘못된 이메일로 로그인이 성공하면 안됩니다'),
|
|
);
|
|
});
|
|
|
|
test('잘못된 비밀번호로 로그인 실패', () async {
|
|
// Arrange
|
|
final loginRequest = LoginRequest(
|
|
email: 'admin@superport.kr',
|
|
password: 'wrongpassword',
|
|
);
|
|
|
|
// Act
|
|
final result = await RealApiTestHelper.authService.login(loginRequest);
|
|
|
|
// Assert
|
|
expect(result.isLeft(), true);
|
|
|
|
result.fold(
|
|
(failure) {
|
|
expect(failure.message, contains('올바르지 않습니다'));
|
|
// 로그인 실패 (잘못된 비밀번호)
|
|
// Error: ${failure.message}
|
|
},
|
|
(_) => fail('잘못된 비밀번호로 로그인이 성공하면 안됩니다'),
|
|
);
|
|
});
|
|
|
|
test('토큰 저장 및 조회', () async {
|
|
// Arrange
|
|
final loginRequest = LoginRequest(
|
|
email: 'admin@superport.kr',
|
|
password: 'admin123!',
|
|
);
|
|
|
|
// Act - 로그인
|
|
final loginResult = await RealApiTestHelper.authService.login(loginRequest);
|
|
|
|
// Assert - 로그인 성공
|
|
expect(loginResult.isRight(), true);
|
|
|
|
// Act - 저장된 토큰 조회
|
|
final accessToken = await RealApiTestHelper.authService.getAccessToken();
|
|
final refreshToken = await RealApiTestHelper.authService.getRefreshToken();
|
|
final currentUser = await RealApiTestHelper.authService.getCurrentUser();
|
|
|
|
// Assert - 토큰 확인
|
|
expect(accessToken, isNotNull);
|
|
expect(refreshToken, isNotNull);
|
|
expect(currentUser, isNotNull);
|
|
expect(currentUser!.email, 'admin@superport.kr');
|
|
|
|
// 토큰 저장 확인
|
|
// Access Token 저장됨: ${accessToken!.substring(0, 20)}...
|
|
// Refresh Token 저장됨: ${refreshToken!.substring(0, 20)}...
|
|
// Current User: ${currentUser.name} (${currentUser.email})
|
|
});
|
|
|
|
test('로그아웃', () async {
|
|
// Arrange - 먼저 로그인
|
|
await RealApiTestHelper.loginAndGetToken();
|
|
|
|
// Act - 로그아웃
|
|
await RealApiTestHelper.authService.logout();
|
|
|
|
// Assert - 토큰 삭제 확인
|
|
final accessToken = await RealApiTestHelper.authService.getAccessToken();
|
|
final refreshToken = await RealApiTestHelper.authService.getRefreshToken();
|
|
final currentUser = await RealApiTestHelper.authService.getCurrentUser();
|
|
|
|
expect(accessToken, isNull);
|
|
expect(refreshToken, isNull);
|
|
expect(currentUser, isNull);
|
|
|
|
// 로그아웃 완료
|
|
// 모든 토큰과 사용자 정보가 삭제되었습니다.
|
|
});
|
|
|
|
test('인증된 API 호출 테스트', () async {
|
|
// Arrange - 로그인하여 토큰 획득
|
|
await RealApiTestHelper.loginAndGetToken();
|
|
|
|
// Act - 인증이 필요한 API 호출 (현재 사용자 정보 조회)
|
|
try {
|
|
final response = await RealApiTestHelper.apiClient.get('/auth/me');
|
|
|
|
// Assert
|
|
expect(response.statusCode, 200);
|
|
expect(response.data, isNotNull);
|
|
|
|
// 응답 구조 확인
|
|
final responseData = response.data;
|
|
if (responseData is Map && responseData.containsKey('data')) {
|
|
final userData = responseData['data'];
|
|
expect(userData['email'], 'admin@superport.kr');
|
|
|
|
// 인증된 API 호출 성공
|
|
// User Data: $userData
|
|
} else {
|
|
// 직접 데이터인 경우
|
|
expect(responseData['email'], 'admin@superport.kr');
|
|
|
|
// 인증된 API 호출 성공
|
|
// User Data: $responseData
|
|
}
|
|
} catch (e) {
|
|
RealApiTestHelper.logError('인증된 API 호출', e);
|
|
fail('인증된 API 호출이 실패했습니다: $e');
|
|
}
|
|
});
|
|
|
|
test('토큰 없이 보호된 API 호출 시 401 에러', timeout: Timeout(Duration(seconds: 60)), () async {
|
|
// Arrange - 토큰 제거
|
|
RealApiTestHelper.apiClient.removeAuthToken();
|
|
|
|
// Act & Assert
|
|
try {
|
|
await RealApiTestHelper.apiClient.get('/companies');
|
|
fail('401 에러가 발생해야 합니다');
|
|
} catch (e) {
|
|
if (e is DioException) {
|
|
expect(e.response?.statusCode, 401);
|
|
// 인증 실패 테스트 성공
|
|
// Status Code: ${e.response?.statusCode}
|
|
// Error Message: ${e.response?.data}
|
|
} else {
|
|
fail('DioException이 발생해야 합니다');
|
|
}
|
|
}
|
|
});
|
|
});
|
|
} |