11, 'discount_amount' => 1000], ['product_option_id' => 12, 'discount_amount' => 1000], ], ); // 주문 쿠폰 $orderCoupon = new CouponApplication( couponId: 122, couponIssueId: 6001, name: '주문 쿠폰', targetType: 'order_amount', appliedItems: [ ['product_option_id' => 11, 'discount_amount' => 2000], ], ); $product = new AppliedPromotions(coupons: [$productCoupon]); $order = new AppliedPromotions( coupons: [$orderCoupon], discountCodes: [new DiscountCodeApplication(codeId: 7, code: 'WELCOME10', name: '환영코드')], ); return new PromotionsSummary(productPromotions: $product, orderPromotions: $order); } /** * toArray() 가 평탄 키 3종을 포함한다. */ public function test_to_array_includes_flat_keys(): void { $arr = $this->makeSummary()->toArray(); $this->assertArrayHasKey('coupon_issue_ids', $arr); $this->assertArrayHasKey('item_coupons', $arr); $this->assertArrayHasKey('discount_code', $arr); // 기존 구조도 유지 $this->assertArrayHasKey('product_promotions', $arr); $this->assertArrayHasKey('order_promotions', $arr); } /** * coupon_issue_ids 는 상품+주문 전체 쿠폰 발급 ID (중복 제거). */ public function test_coupon_issue_ids_covers_all_coupons(): void { $arr = $this->makeSummary()->toArray(); $this->assertEqualsCanonicalizing([5001, 6001], $arr['coupon_issue_ids']); } /** * item_coupons 는 상품 쿠폰을 적용 옵션별로 매핑한다 (주문 쿠폰 제외). */ public function test_item_coupons_maps_product_coupons_by_option(): void { $arr = $this->makeSummary()->toArray(); $this->assertEquals([5001], $arr['item_coupons'][11] ?? null); $this->assertEquals([5001], $arr['item_coupons'][12] ?? null); // 주문 쿠폰(6001)은 item_coupons 에 들어가지 않는다 foreach ($arr['item_coupons'] as $ids) { $this->assertNotContains(6001, $ids); } } /** * discount_code 는 적용된 할인코드 문자열. */ public function test_discount_code_returns_code_string(): void { $arr = $this->makeSummary()->toArray(); $this->assertEquals('WELCOME10', $arr['discount_code']); } /** * 쿠폰/코드가 없으면 평탄 키는 빈 값. */ public function test_empty_promotions_produce_empty_flat_keys(): void { $arr = (new PromotionsSummary)->toArray(); $this->assertSame([], $arr['coupon_issue_ids']); $this->assertSame([], $arr['item_coupons']); $this->assertNull($arr['discount_code']); } }