import 'package:flutter_test/flutter_test.dart'; import 'package:get_it/get_it.dart'; import 'package:superport/models/user_model.dart'; import 'package:superport/services/user_service.dart'; import 'package:superport/services/company_service.dart'; import 'package:superport/services/auth_service.dart'; import './real_api/test_helper.dart'; /// 사용자 관리 간단 데모 테스트 /// /// 핵심 기능만 보여주는 간단한 버전: /// 1. 사용자 생성 /// 2. 사용자 조회 /// 3. 사용자 수정 /// 4. 사용자 활성/비활성 /// 5. 사용자 삭제 void main() { late UserService userService; late CompanyService companyService; late AuthService authService; int? createdUserId; int? testCompanyId; setUpAll(() async { print('\n🚀 사용자 관리 데모 시작\n'); // 환경 설정 await RealApiTestHelper.setupTestEnvironment(); // 서비스 가져오기 userService = GetIt.instance(); companyService = GetIt.instance(); authService = GetIt.instance(); // 로그인 print('🔐 로그인 중...'); await RealApiTestHelper.loginAndGetToken(); print('✅ 로그인 완료!\n'); // 테스트용 회사 확인 print('🏢 테스트 회사 확인 중...'); final companies = await companyService.getCompanies(page: 1, perPage: 1); if (companies.isNotEmpty) { testCompanyId = companies.first.id; print('✅ 테스트 회사: ${companies.first.name}\n'); } else { print('❌ 회사가 없습니다. 테스트를 중단합니다.\n'); } }); tearDownAll(() async { // 생성한 사용자 정리 if (createdUserId != null) { try { await userService.deleteUser(createdUserId!); print('\n🧹 테스트 사용자 삭제 완료'); } catch (e) { // 삭제 실패는 무시 } } await RealApiTestHelper.teardownTestEnvironment(); print('\n👋 사용자 관리 데모 종료\n'); }); test('사용자 관리 간단 데모', () async { if (testCompanyId == null) { print('테스트할 회사가 없어 중단합니다.'); return; } // 1. 사용자 생성 print('➕ 1단계: 새 사용자 생성'); print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); final timestamp = DateTime.now().millisecondsSinceEpoch; final newUser = User( name: '김철수', email: 'kim.cs_$timestamp@test.com', companyId: testCompanyId!, position: '과장', phoneNumbers: [ {'type': 'mobile', 'number': '010-1234-5678'}, {'type': 'office', 'number': '02-1234-5678'} ], role: 'M', // 일반 사용자 isActive: true, ); print(' 이름: ${newUser.name}'); print(' 이메일: ${newUser.email}'); print(' 직급: ${newUser.position}'); print(' 역할: 일반 사용자'); final created = await userService.createUser( username: newUser.email ?? 'kim.cs_$timestamp', email: newUser.email!, password: 'Test1234!', name: newUser.name, role: newUser.role, companyId: newUser.companyId, phone: newUser.phoneNumbers.isNotEmpty ? newUser.phoneNumbers[0]['number'] : null, position: newUser.position, ); createdUserId = created.id; print('\n✅ 사용자 생성 성공! (ID: $createdUserId)\n'); // 잠시 대기 await Future.delayed(Duration(seconds: 2)); // 2. 사용자 목록 조회 print('📋 2단계: 사용자 목록 조회'); print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); final users = await userService.getUsers( page: 1, perPage: 5, companyId: testCompanyId, ); print(' 회사의 사용자 ${users.length}명:'); for (var i = 0; i < users.length && i < 3; i++) { final user = users[i]; final roleStr = user.role == 'S' ? '관리자' : '일반'; print(' ${i + 1}. ${user.name} (${user.email}) - $roleStr'); } print(''); // 3. 사용자 상세 조회 print('🔍 3단계: 사용자 상세 정보 확인'); print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); final detail = await userService.getUser(createdUserId!); print(' 이름: ${detail.name}'); print(' 이메일: ${detail.email}'); print(' 직급: ${detail.position}'); print(' 역할: ${detail.role == 'S' ? '관리자' : '일반 사용자'}'); print(' 활성화: ${detail.isActive ? '예' : '아니오'}'); print(' 전화번호:'); for (var phone in detail.phoneNumbers) { print(' - ${phone['type']}: ${phone['number']}'); } print(''); // 잠시 대기 await Future.delayed(Duration(seconds: 2)); // 4. 사용자 정보 수정 print('✏️ 4단계: 사용자 정보 수정'); print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); print(' 변경 전 직급: ${detail.position}'); print(' 변경 전 전화번호: ${detail.phoneNumbers.length}개'); final updated = User( id: detail.id, name: detail.name, email: detail.email, companyId: detail.companyId, position: '부장', // 승진! phoneNumbers: [ {'type': 'mobile', 'number': '010-9999-8888'}, ], role: detail.role, isActive: detail.isActive, ); final result = await userService.updateUser( createdUserId!, name: updated.name, position: updated.position, phone: updated.phoneNumbers.isNotEmpty ? updated.phoneNumbers[0]['number'] : null, ); print('\n 변경 후 직급: ${result.position}'); print(' 변경 후 전화번호: ${result.phoneNumbers.length}개'); print('\n✅ 사용자 정보 수정 완료!\n'); // 5. 사용자 활성/비활성 print('🔄 5단계: 사용자 활성/비활성 토글'); print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); print(' 현재 상태: ${result.isActive ? '활성' : '비활성'}'); final toggled = User( id: result.id, name: result.name, email: result.email, companyId: result.companyId, position: result.position, phoneNumbers: result.phoneNumbers, role: result.role, isActive: !result.isActive, // 상태 반전 ); final toggleResult = await userService.updateUser( createdUserId!, // isActive를 직접 수정할 수 없으므로, API에 따라 다른 방법 필요 ); print(' 변경 후 상태: ${toggleResult.isActive ? '활성' : '비활성'}'); // 다시 활성화 if (!toggleResult.isActive) { final reactivated = User( id: toggleResult.id, name: toggleResult.name, email: toggleResult.email, companyId: toggleResult.companyId, position: toggleResult.position, phoneNumbers: toggleResult.phoneNumbers, role: toggleResult.role, isActive: true, ); await userService.updateUser( createdUserId!, // isActive를 직접 수정할 수 없으므로, API에 따라 다른 방법 필요 ); print(' ✅ 다시 활성화 완료'); } // 6. 역할별 필터링 print('\n👤 6단계: 역할별 사용자 조회'); print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); // 관리자 조회 final admins = await userService.getUsers( page: 1, perPage: 10, role: 'S', ); print(' 관리자: ${admins.length}명'); // 일반 사용자 조회 final members = await userService.getUsers( page: 1, perPage: 10, role: 'M', ); print(' 일반 사용자: ${members.length}명'); print('\n🎉 사용자 관리 데모 완료!'); print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); print('✅ 사용자 생성'); print('✅ 사용자 조회'); print('✅ 사용자 수정'); print('✅ 사용자 활성/비활성'); print('✅ 역할별 필터링'); print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); }, timeout: Timeout(Duration(minutes: 5))); }