test: 통합 테스트 오류 및 경고 수정
- 모든 서비스 메서드 시그니처를 실제 구현에 맞게 수정 - 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
This commit is contained in:
197
test/integration/real_api/auth_real_api_test.dart
Normal file
197
test/integration/real_api/auth_real_api_test.dart
Normal file
@@ -0,0 +1,197 @@
|
||||
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이 발생해야 합니다');
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user