Files
Gnuboard7/modules/_bundled/sirsoft-ecommerce/tests/Unit/Resources/OrderMileageDisplayFieldsTest.php
T
2026-07-01 10:30:32 +09:00

138 lines
6.0 KiB
PHP

<?php
namespace Modules\Sirsoft\Ecommerce\Tests\Unit\Resources;
use Modules\Sirsoft\Ecommerce\Database\Factories\OrderFactory;
use Modules\Sirsoft\Ecommerce\Database\Factories\OrderOptionFactory;
use Modules\Sirsoft\Ecommerce\DTO\Summary;
use Modules\Sirsoft\Ecommerce\Http\Resources\GuestOrderResource;
use Modules\Sirsoft\Ecommerce\Http\Resources\OrderListResource;
use Modules\Sirsoft\Ecommerce\Http\Resources\UserOrderListResource;
use Modules\Sirsoft\Ecommerce\Tests\ModuleTestCase;
/**
* 주문 마일리지 표시 필드 정합성 테스트
*
* 이슈 #44 전수조사: 마일리지 시스템 도입 전 완성된 주문 화면들이
* 기대하는 마일리지 사용/적립/환불 키를 백엔드 응답(Summary DTO / 목록 Resource)이
* 실제로 노출하는지 검증한다. 누락 시 화면에 마일리지가 "--"/미표시로 회귀한다.
*/
class OrderMileageDisplayFieldsTest extends ModuleTestCase
{
/**
* Summary DTO 가 마일리지 사용액 포맷(points_used_formatted)을 노출하는지 확인
*
* 결함: 체크아웃 요약(_checkout_summary) line 332 가 points_used_formatted 를 바인딩하나
* Summary::toArray() 가 points_used(값)만 만들고 포맷 키를 누락 → 사용액이 "--" 로 표시.
*/
public function test_summary_exposes_points_used_formatted(): void
{
// Given: 사용 마일리지 3000, 결제전 252000, 최종 249000 인 합계
$summary = new Summary(
subtotal: 252000,
pointsUsed: 3000,
paymentAmount: 252000,
finalAmount: 249000,
);
// When: 배열 직렬화
$result = $summary->toArray();
// Then: 사용액/결제예정액 포맷 키가 노출
$this->assertArrayHasKey('points_used_formatted', $result);
$this->assertEquals('3,000원', $result['points_used_formatted']);
$this->assertArrayHasKey('payment_amount_formatted', $result);
$this->assertEquals('252,000원', $result['payment_amount_formatted']);
// 적립 포맷(P 단위)은 기존대로 유지
$this->assertEquals('0P', $result['mileage_formatted']);
}
/**
* 마일리지 미사용 주문도 points_used_formatted 가 0원으로 노출되는지 확인 (폴백 안전)
*/
public function test_summary_points_used_formatted_zero_when_unused(): void
{
$summary = new Summary(subtotal: 100000, paymentAmount: 100000, finalAmount: 100000);
$result = $summary->toArray();
$this->assertEquals('0원', $result['points_used_formatted']);
}
/**
* OrderListResource(관리자 목록)가 마일리지 사용/적립 필드를 노출하는지 확인
*/
public function test_admin_order_list_resource_exposes_mileage_fields(): void
{
// Given: 마일리지 사용 5000, 적립 2400
$order = OrderFactory::new()->create([
'total_points_used_amount' => 5000,
'total_earned_points_amount' => 2400,
]);
// When: 목록 리소스 변환
$resource = (new OrderListResource($order))->resolve();
// Then: 사용/적립 + 포맷 노출
$this->assertEquals(5000, $resource['total_points_used_amount']);
$this->assertEquals('5,000원', $resource['total_points_used_amount_formatted']);
$this->assertEquals(2400, $resource['total_earned_points_amount']);
$this->assertEquals('2,400원', $resource['total_earned_points_amount_formatted']);
}
/**
* UserOrderListResource(마이페이지 목록)가 마일리지 사용/적립 필드를 노출하는지 확인
*/
public function test_user_order_list_resource_exposes_mileage_fields(): void
{
// Given: 마일리지 사용 1000, 적립 990
$order = OrderFactory::new()->create([
'total_points_used_amount' => 1000,
'total_earned_points_amount' => 990,
]);
$order->load('options');
// When: 목록 리소스 변환
$resource = (new UserOrderListResource($order))->resolve();
// Then: 사용/적립 + 포맷 노출
$this->assertEquals(1000, $resource['total_points_used_amount']);
$this->assertEquals('1,000원', $resource['total_points_used_amount_formatted']);
$this->assertEquals(990, $resource['total_earned_points_amount']);
$this->assertEquals('990원', $resource['total_earned_points_amount_formatted']);
}
/**
* GuestOrderResource(비회원 주문상세)가 마일리지 사용/적립/환불 필드를 노출하는지 확인
*
* 결함: 비회원 주문상세는 회원과 동일 결제정보 partial 을 쓰나 GuestOrderResource 가
* 마일리지 필드를 전혀 노출하지 않아 비회원 화면에 마일리지가 미표시.
*/
public function test_guest_order_resource_exposes_mileage_and_refund_fields(): void
{
// Given: 사용 2000, 적립 1500, 환불 마일리지 800 인 주문 + 옵션 1개
$order = OrderFactory::new()->create([
'total_points_used_amount' => 2000,
'total_earned_points_amount' => 1500,
'total_refunded_points_amount' => 800,
]);
OrderOptionFactory::new()->forOrder($order)->create([
'unit_price' => 10000,
'quantity' => 1,
'subtotal_price' => 10000,
]);
$order->load('options');
// When: 비회원 리소스 변환
$resource = (new GuestOrderResource($order))->resolve();
// Then: 사용/적립/환불 마일리지 + 포맷 노출 (회원 OrderResource 와 패리티)
$this->assertEquals(2000, $resource['total_points_used_amount']);
$this->assertEquals('2,000원', $resource['total_points_used_amount_formatted']);
$this->assertEquals(1500, $resource['total_earned_points_amount']);
$this->assertEquals('1,500원', $resource['total_earned_points_amount_formatted']);
$this->assertEquals(800, $resource['total_refunded_points_amount']);
$this->assertEquals('800원', $resource['total_refunded_points_amount_formatted']);
}
}