[ 'first_name' => 'Express', 'last_name' => 'Checkout', 'email' => 'expr@placeholder.local', 'address' => 'Pending', 'city' => 'PendingCity', 'state' => 'PendingState', 'country' => 'US', 'postcode' => '00000', 'phone' => '0000000000', ]]); $cart = $this->fakeCart([ 'id' => 99, 'sub_total' => 100.0, 'base_sub_total' => 100.0, 'discount_amount' => 10.0, 'base_discount_amount' => 10.0, ]); $payload = (new ExpressOrderResource($cart))->toArray(Request::create('/')); $this->assertSame(0, $payload['tax_amount']); $this->assertSame(0, $payload['shipping_tax_amount']); $this->assertEquals(90.0, $payload['grand_total']); $this->assertEquals(90.0, $payload['base_grand_total']); $this->assertSame('PendingCity', $payload['billing_address']['city']); $this->assertSame('00000', $payload['billing_address']['postcode']); $this->assertSame('order_billing', $payload['billing_address']['address_type']); } public function test_shipping_address_omitted_for_non_stockable_carts(): void { $cart = $this->fakeCart([ 'id' => 1, 'sub_total' => 50.0, 'base_sub_total' => 50.0, 'discount_amount' => 0, 'haveStockable' => false, ]); $payload = (new ExpressOrderResource($cart))->toArray(Request::create('/')); $this->assertNull($payload['shipping_address']); $this->assertNotEmpty($payload['billing_address']); } /** * Build a cart-shaped stdClass that exposes every property the * resource reads. Eloquent's behavior is irrelevant here - the * resource only does property access + a `haveStockableItems()` * method call. */ private function fakeCart(array $overrides): object { $defaults = [ 'id' => 1, 'is_guest' => 1, 'customer_id' => null, 'customer' => null, 'customer_email' => null, 'customer_first_name' => null, 'customer_last_name' => null, 'channel_id' => 1, 'items_count' => 1, 'items_qty' => 1, 'base_currency_code' => 'USD', 'channel_currency_code' => 'USD', 'cart_currency_code' => 'USD', 'sub_total' => 0, 'sub_total_incl_tax' => 0, 'base_sub_total' => 0, 'base_sub_total_incl_tax' => 0, 'coupon_code' => null, 'applied_cart_rule_ids' => null, 'discount_amount' => 0, 'base_discount_amount' => 0, 'billing_address' => null, 'shipping_address' => null, 'payment' => null, 'items' => collect(), 'haveStockable' => true, ]; $data = array_merge($defaults, $overrides); $cart = new class { public ?object $channel = null; public ?object $payment = null; public ?object $billing_address = null; public ?object $shipping_address = null; public mixed $items = null; public bool $haveStockable = true; public function haveStockableItems(): bool { return $this->haveStockable; } }; foreach ($data as $key => $value) { $cart->{$key} = $value; } $cart->channel = new class { public string $name = 'Default'; }; $cart->payment = (object) [ 'method' => 'paypal_smart_button', 'method_title' => 'PayPal Smart Button', ]; return $cart; } }