assignmentClass)) { $this->markTestSkipped('sirsoft-ecommerce 모듈이 설치되어 있지 않습니다.'); } // 모듈 마이그레이션 실행 $this->artisan('migrate', [ '--path' => 'modules/sirsoft-ecommerce/database/migrations', '--realpath' => true, ]); } /** * 테스트용 ProductLabel 생성 * * @param array $overrides 오버라이드할 속성 * @return mixed ProductLabel 인스턴스 */ private function createLabel(array $overrides = []): mixed { $data = array_merge([ 'name' => ['ko' => '테스트 라벨', 'en' => 'Test Label'], 'color' => '#FF0000', 'is_active' => true, ], $overrides); return $this->labelClass::create($data); } /** * 테스트용 Product 생성 * * @param array $overrides 오버라이드할 속성 * @return mixed Product 인스턴스 */ private function createProduct(array $overrides = []): mixed { $data = array_merge([ 'name' => ['ko' => '테스트 상품', 'en' => 'Test Product'], 'product_code' => 'TEST-'.uniqid(), 'selling_price' => 10000, 'sales_status' => 'on_sale', 'display_status' => 'visible', 'tax_status' => 'taxable', ], $overrides); return $this->productClass::create($data); } /** * 테스트용 ProductLabelAssignment 생성 * * @param array $overrides 오버라이드할 속성 * @return mixed ProductLabelAssignment 인스턴스 */ private function createAssignment(array $overrides = []): mixed { // 기본 label과 product 생성 $label = $this->createLabel(); $product = $this->createProduct(); $data = array_merge([ 'product_id' => $product->id, 'label_id' => $label->id, ], $overrides); return $this->assignmentClass::create($data); } /** * start_date와 end_date가 date로 캐스팅되는지 테스트 */ public function test_dates_are_cast_to_date(): void { // Arrange $label = $this->createLabel(); $product = $this->createProduct(); // Act $assignment = $this->assignmentClass::create([ 'product_id' => $product->id, 'label_id' => $label->id, 'start_date' => '2025-01-15', 'end_date' => '2025-06-30', ]); // Assert $this->assertInstanceOf(\Illuminate\Support\Carbon::class, $assignment->start_date); $this->assertInstanceOf(\Illuminate\Support\Carbon::class, $assignment->end_date); $this->assertEquals('2025-01-15', $assignment->start_date->toDateString()); $this->assertEquals('2025-06-30', $assignment->end_date->toDateString()); } /** * isActive()가 날짜 범위 내일 때 true를 반환하는지 테스트 */ public function test_is_active_returns_true_when_within_date_range(): void { // Arrange $assignment = $this->createAssignment([ 'start_date' => now()->subDay()->toDateString(), 'end_date' => now()->addDay()->toDateString(), ]); // Act & Assert $this->assertTrue($assignment->isActive()); } /** * isActive()가 시작일 이전일 때 false를 반환하는지 테스트 */ public function test_is_active_returns_false_when_before_start_date(): void { // Arrange $assignment = $this->createAssignment([ 'start_date' => now()->addDay()->toDateString(), 'end_date' => now()->addDays(10)->toDateString(), ]); // Act & Assert $this->assertFalse($assignment->isActive()); } /** * isActive()가 종료일 이후일 때 false를 반환하는지 테스트 */ public function test_is_active_returns_false_when_after_end_date(): void { // Arrange $assignment = $this->createAssignment([ 'start_date' => now()->subDays(10)->toDateString(), 'end_date' => now()->subDay()->toDateString(), ]); // Act & Assert $this->assertFalse($assignment->isActive()); } /** * isActive()가 날짜 제한 없을 때 true를 반환하는지 테스트 */ public function test_is_active_returns_true_when_no_date_limits(): void { // Arrange $assignment = $this->createAssignment([ 'start_date' => null, 'end_date' => null, ]); // Act & Assert $this->assertTrue($assignment->isActive()); } /** * scopeCurrentlyActive가 활성 라벨만 필터링하는지 테스트 */ public function test_scope_currently_active_filters_correctly(): void { // Arrange $label = $this->createLabel(); $product = $this->createProduct(); // 활성 라벨 (날짜 범위 내) $activeAssignment = $this->assignmentClass::create([ 'product_id' => $product->id, 'label_id' => $label->id, 'start_date' => now()->subDay()->toDateString(), 'end_date' => now()->addDay()->toDateString(), ]); // 비활성 라벨 (기간 지남) $label2 = $this->createLabel(); $inactiveAssignment = $this->assignmentClass::create([ 'product_id' => $product->id, 'label_id' => $label2->id, 'start_date' => now()->subDays(10)->toDateString(), 'end_date' => now()->subDays(5)->toDateString(), ]); // Act $activeAssignments = $this->assignmentClass::currentlyActive()->get(); // Assert $this->assertTrue($activeAssignments->contains('id', $activeAssignment->id)); $this->assertFalse($activeAssignments->contains('id', $inactiveAssignment->id)); } /** * product 관계가 정상 동작하는지 테스트 */ public function test_product_relationship_works(): void { // Arrange $label = $this->createLabel(); $product = $this->createProduct(['name' => ['ko' => '관계 테스트 상품', 'en' => 'Relation Test Product']]); $assignment = $this->assignmentClass::create([ 'product_id' => $product->id, 'label_id' => $label->id, ]); // Act $relatedProduct = $assignment->product; // Assert $this->assertInstanceOf($this->productClass, $relatedProduct); $this->assertEquals($product->id, $relatedProduct->id); } /** * label 관계가 정상 동작하는지 테스트 */ public function test_label_relationship_works(): void { // Arrange $label = $this->createLabel(['name' => ['ko' => '관계 테스트 라벨', 'en' => 'Relation Test Label']]); $product = $this->createProduct(); $assignment = $this->assignmentClass::create([ 'product_id' => $product->id, 'label_id' => $label->id, ]); // Act $relatedLabel = $assignment->label; // Assert $this->assertInstanceOf($this->labelClass, $relatedLabel); $this->assertEquals($label->id, $relatedLabel->id); } }