# TestDataGenerator 사용 가이드

## 개요

`TestDataGenerator`는 기존 `TestDataHelper`를 확장하여 더 스마트하고 현실적인 테스트 데이터를 생성하는 유틸리티 클래스입니다.

## 주요 기능

### 1. 현실적인 데이터 생성
- 실제 회사명, 제조사, 제품 모델 사용
- 한국식 이름 생성
- 유효한 전화번호 및 사업자등록번호 형식
- 카테고리별 현실적인 가격 책정

### 2. 데이터 간 관계 자동 설정
- 회사 → 사용자 → 장비/라이선스 관계 자동 구성
- 시나리오별 데이터 세트 생성
- 제약 조건 자동 충족

### 3. 데이터 관리 기능
- 생성된 데이터 자동 추적
- 타입별/전체 데이터 정리 기능
- 캐싱을 통한 참조 데이터 재사용

## 사용 예시

### 기본 데이터 생성

```dart
// 회사 데이터 생성
final companyData = TestDataGenerator.createSmartCompanyData(
  name: '테스트 회사',
  companyTypes: ['technology', 'service'],
);

// 사용자 데이터 생성
final userData = TestDataGenerator.createSmartUserData(
  companyId: 1,
  role: 'manager',
  department: '개발팀',
);

// 장비 데이터 생성
final equipmentData = TestDataGenerator.createSmartEquipmentData(
  companyId: 1,
  warehouseLocationId: 1,
  category: '노트북',
  manufacturer: '삼성전자',
);

// 라이선스 데이터 생성
final licenseData = TestDataGenerator.createSmartLicenseData(
  companyId: 1,
  productName: 'Microsoft Office 365',
  licenseType: 'subscription',
);
```

### 시나리오 데이터 생성

```dart
// 장비 입고 시나리오
final equipmentScenario = await TestDataGenerator.createEquipmentScenario(
  equipmentCount: 10,
);

// 사용자 관리 시나리오
final userScenario = await TestDataGenerator.createUserScenario(
  userCount: 20,
);

// 라이선스 관리 시나리오
final licenseScenario = await TestDataGenerator.createLicenseScenario(
  licenseCount: 15,
);
```

### 데이터 정리

```dart
// 모든 테스트 데이터 정리
await TestDataGenerator.cleanupAllTestData();

// 특정 타입만 정리
await TestDataGenerator.cleanupTestDataByType(TestDataType.equipment);
```

## 실제 데이터 풀

### 회사명
- 테크솔루션, 디지털컴퍼니, 스마트시스템즈, 클라우드테크 등

### 제조사 및 모델
- **삼성전자**: Galaxy Book Pro, Galaxy Book Pro 360, Odyssey G9
- **LG전자**: Gram 17, Gram 16, UltraGear 27GN950
- **Apple**: MacBook Pro 16", MacBook Air M2, iMac 24"
- **Dell**: XPS 13, XPS 15, Latitude 7420
- 기타 HP, Lenovo, Microsoft, ASUS 제품

### 소프트웨어 제품
- Microsoft Office 365
- Adobe Creative Cloud
- AutoCAD 2024
- Visual Studio Enterprise
- JetBrains All Products

### 장비 카테고리
- 노트북, 데스크탑, 모니터, 프린터, 네트워크장비, 서버, 태블릿, 스캐너

### 창고 타입
- 메인창고, 서브창고A/B, 임시보관소, 수리센터, 대여센터

## 테스트 작성 예시

```dart
void main() {
  setUpAll(() async {
    await RealApiTestHelper.setupTestEnvironment();
    await RealApiTestHelper.loginAndGetToken();
  });

  tearDownAll(() async {
    await TestDataGenerator.cleanupAllTestData();
    await RealApiTestHelper.teardownTestEnvironment();
  });

  test('장비 관리 통합 테스트', () async {
    // 시나리오 데이터 생성
    final scenario = await TestDataGenerator.createEquipmentScenario(
      equipmentCount: 5,
    );

    // 테스트 수행
    expect(scenario.equipments.length, equals(5));
    
    // 장비 상태 변경 테스트
    for (final equipment in scenario.equipments) {
      // 출고 처리
      // 검증
    }
  });
}
```

## 주의사항

1. 테스트 종료 시 반드시 `cleanupAllTestData()` 호출
2. 실제 API와 연동되므로 네트워크 연결 필요
3. 생성된 데이터는 자동으로 추적되어 정리됨
4. 동시성 테스트 시 고유 ID 충돌 방지를 위해 타임스탬프 기반 ID 사용

## 확장 가능성

필요에 따라 다음 기능을 추가할 수 있습니다:
- 더 많은 실제 데이터 풀 추가
- 복잡한 시나리오 추가 (예: 장비 이동, 라이선스 갱신)
- 성능 테스트용 대량 데이터 생성
- 국제화 데이터 생성 (다국어 지원)