Files
superport/test/integration/real_api/auth_real_api_test.dart
JiWoong Sul 198aac6525
Some checks failed
Flutter Test & Quality Check / Test on macos-latest (push) Has been cancelled
Flutter Test & Quality Check / Test on ubuntu-latest (push) Has been cancelled
Flutter Test & Quality Check / Build APK (push) Has been cancelled
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
2025-08-05 20:24:05 +09:00

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이 발생해야 합니다');
}
}
});
});
}