'cj'], [ 'name' => ['ko' => 'CJ대한통운', 'en' => 'CJ Logistics'], 'type' => 'domestic', 'tracking_url' => 'https://trace.cjlogistics.com/next/tracking.html?wblNo={tracking_number}', 'is_active' => true, 'sort_order' => 1, ] ); } public function test_option_resource_exposes_tracking_url_from_shipping(): void { $carrier = $this->makeCarrier(); $order = OrderFactory::new()->create(); $option = OrderOptionFactory::new()->create(['order_id' => $order->id]); OrderShippingFactory::new()->forOrderOption($option)->create([ 'carrier_id' => $carrier->id, 'tracking_number' => '123456789012', ]); $array = (new OrderOptionResource($option->fresh()->load('shippings.carrier'))) ->toArray(Request::create('/')); $this->assertSame('123456789012', $array['tracking_number']); $this->assertSame( 'https://trace.cjlogistics.com/next/tracking.html?wblNo=123456789012', $array['tracking_url'] ); } public function test_option_resource_tracking_url_null_when_no_tracking_number(): void { $carrier = $this->makeCarrier(); $order = OrderFactory::new()->create(); $option = OrderOptionFactory::new()->create(['order_id' => $order->id]); OrderShippingFactory::new()->forOrderOption($option)->create([ 'carrier_id' => $carrier->id, 'tracking_number' => null, ]); $array = (new OrderOptionResource($option->fresh()->load('shippings.carrier'))) ->toArray(Request::create('/')); $this->assertNull($array['tracking_url']); } public function test_option_resource_tracking_url_missing_when_shippings_not_loaded(): void { $order = OrderFactory::new()->create(); $option = OrderOptionFactory::new()->create(['order_id' => $order->id]); // shippings 관계 미로드 → whenLoaded 가 MissingValue 반환 (직렬화 시 키 제거) $array = (new OrderOptionResource($option->fresh()))->toArray(Request::create('/')); $this->assertInstanceOf(MissingValue::class, $array['tracking_url']); } }