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