import 'package:dio/dio.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:superport/data/datasources/remote/api_client.dart'; import 'package:superport/data/models/vendor_dto.dart'; import 'package:superport/data/repositories/vendor_repository.dart'; void main() { late Dio dio; late VendorRepository vendorRepository; String? authToken; setUpAll(() async { // 직접 Dio 인스턴스 생성 (테스트용) dio = Dio(BaseOptions( baseUrl: 'http://43.201.34.104:8080/api/v1', connectTimeout: const Duration(seconds: 30), receiveTimeout: const Duration(seconds: 30), )); // 로그인하여 토큰 획득 try { final loginResponse = await dio.post('/auth/login', data: { 'email': 'admin@example.com', 'password': 'password123', }); authToken = loginResponse.data['access_token']; dio.options.headers['Authorization'] = 'Bearer $authToken'; print('✅ 로그인 성공! 토큰 획득됨'); } catch (e) { print('❌ 로그인 실패: $e'); fail('로그인에 실패했습니다'); } }); group('Vendor API Tests', () { test('Vendors 목록 조회 테스트', () async { try { // 직접 API 호출 테스트 final response = await dio.get('/vendors', queryParameters: { 'page': 1, 'limit': 5, }); print('\n========== 원본 API 응답 =========='); print('Status Code: ${response.statusCode}'); print('응답 데이터: ${response.data}'); expect(response.statusCode, 200); expect(response.data, isA>()); expect(response.data['data'], isA()); expect(response.data['total'], isA()); expect(response.data['page'], isA()); expect(response.data['total_pages'], isA()); print('\n========== JSON 파싱 테스트 =========='); // VendorListResponse로 파싱 테스트 try { final vendorListResponse = VendorListResponse.fromJson(response.data); print('✅ VendorListResponse 파싱 성공'); print('Items 개수: ${vendorListResponse.items.length}'); print('총 개수: ${vendorListResponse.totalCount}'); print('현재 페이지: ${vendorListResponse.currentPage}'); print('총 페이지: ${vendorListResponse.totalPages}'); expect(vendorListResponse.items.length, greaterThan(0)); expect(vendorListResponse.totalCount, greaterThan(0)); // 첫 번째 Vendor 데이터 확인 final firstVendor = vendorListResponse.items.first; print('\n첫 번째 벤더 정보:'); print('ID: ${firstVendor.id}'); print('이름: ${firstVendor.name}'); print('삭제됨: ${firstVendor.isDeleted}'); print('활성화: ${firstVendor.isActive}'); expect(firstVendor.id, isNotNull); expect(firstVendor.name.isNotEmpty, true); } catch (e, stackTrace) { print('❌ VendorListResponse 파싱 실패: $e'); print('Stack trace: $stackTrace'); fail('JSON 파싱에 실패했습니다: $e'); } } catch (e, stackTrace) { print('❌ API 호출 실패: $e'); print('Stack trace: $stackTrace'); fail('API 호출에 실패했습니다: $e'); } }); test('단일 Vendor 조회 테스트', () async { try { // 먼저 목록에서 첫 번째 벤더 ID 가져오기 final listResponse = await dio.get('/vendors', queryParameters: {'limit': 1}); final firstVendorId = listResponse.data['data'][0]['id']; // 단일 벤더 조회 final response = await dio.get('/vendors/$firstVendorId'); print('\n========== 단일 벤더 조회 =========='); print('Status Code: ${response.statusCode}'); print('응답 데이터: ${response.data}'); expect(response.statusCode, 200); expect(response.data, isA>()); // VendorDto로 파싱 테스트 final vendor = VendorDto.fromJson(response.data); print('✅ VendorDto 파싱 성공'); print('벤더 정보: ${vendor.name}'); } catch (e) { print('❌ 단일 벤더 조회 실패: $e'); fail('단일 벤더 조회에 실패했습니다: $e'); } }); }); }