ExpressOrderResourceTest.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. namespace Webkul\BagistoApi\Tests\Unit\Transformers;
  3. use Illuminate\Http\Request;
  4. use Tests\TestCase;
  5. use Webkul\BagistoApi\Transformers\ExpressOrderResource;
  6. /**
  7. * Coverage for express-checkout order shaping:
  8. *
  9. * - shipping_amount / tax_amount are zeroed
  10. * - grand_total == sub_total - discount_amount
  11. * - billing address is filled from the configured placeholder when
  12. * the cart has no real address attached
  13. */
  14. class ExpressOrderResourceTest extends TestCase
  15. {
  16. public function test_zeros_out_tax_and_shipping_and_uses_placeholder_address(): void
  17. {
  18. config(['bagistoapi.express_checkout.placeholder_address' => [
  19. 'first_name' => 'Express',
  20. 'last_name' => 'Checkout',
  21. 'email' => 'expr@placeholder.local',
  22. 'address' => 'Pending',
  23. 'city' => 'PendingCity',
  24. 'state' => 'PendingState',
  25. 'country' => 'US',
  26. 'postcode' => '00000',
  27. 'phone' => '0000000000',
  28. ]]);
  29. $cart = $this->fakeCart([
  30. 'id' => 99,
  31. 'sub_total' => 100.0,
  32. 'base_sub_total' => 100.0,
  33. 'discount_amount' => 10.0,
  34. 'base_discount_amount' => 10.0,
  35. ]);
  36. $payload = (new ExpressOrderResource($cart))->toArray(Request::create('/'));
  37. $this->assertSame(0, $payload['tax_amount']);
  38. $this->assertSame(0, $payload['shipping_tax_amount']);
  39. $this->assertEquals(90.0, $payload['grand_total']);
  40. $this->assertEquals(90.0, $payload['base_grand_total']);
  41. $this->assertSame('PendingCity', $payload['billing_address']['city']);
  42. $this->assertSame('00000', $payload['billing_address']['postcode']);
  43. $this->assertSame('order_billing', $payload['billing_address']['address_type']);
  44. }
  45. public function test_shipping_address_omitted_for_non_stockable_carts(): void
  46. {
  47. $cart = $this->fakeCart([
  48. 'id' => 1,
  49. 'sub_total' => 50.0,
  50. 'base_sub_total' => 50.0,
  51. 'discount_amount' => 0,
  52. 'haveStockable' => false,
  53. ]);
  54. $payload = (new ExpressOrderResource($cart))->toArray(Request::create('/'));
  55. $this->assertNull($payload['shipping_address']);
  56. $this->assertNotEmpty($payload['billing_address']);
  57. }
  58. /**
  59. * Build a cart-shaped stdClass that exposes every property the
  60. * resource reads. Eloquent's behavior is irrelevant here - the
  61. * resource only does property access + a `haveStockableItems()`
  62. * method call.
  63. */
  64. private function fakeCart(array $overrides): object
  65. {
  66. $defaults = [
  67. 'id' => 1,
  68. 'is_guest' => 1,
  69. 'customer_id' => null,
  70. 'customer' => null,
  71. 'customer_email' => null,
  72. 'customer_first_name' => null,
  73. 'customer_last_name' => null,
  74. 'channel_id' => 1,
  75. 'items_count' => 1,
  76. 'items_qty' => 1,
  77. 'base_currency_code' => 'USD',
  78. 'channel_currency_code' => 'USD',
  79. 'cart_currency_code' => 'USD',
  80. 'sub_total' => 0,
  81. 'sub_total_incl_tax' => 0,
  82. 'base_sub_total' => 0,
  83. 'base_sub_total_incl_tax' => 0,
  84. 'coupon_code' => null,
  85. 'applied_cart_rule_ids' => null,
  86. 'discount_amount' => 0,
  87. 'base_discount_amount' => 0,
  88. 'billing_address' => null,
  89. 'shipping_address' => null,
  90. 'payment' => null,
  91. 'items' => collect(),
  92. 'haveStockable' => true,
  93. ];
  94. $data = array_merge($defaults, $overrides);
  95. $cart = new class
  96. {
  97. public ?object $channel = null;
  98. public ?object $payment = null;
  99. public ?object $billing_address = null;
  100. public ?object $shipping_address = null;
  101. public mixed $items = null;
  102. public bool $haveStockable = true;
  103. public function haveStockableItems(): bool
  104. {
  105. return $this->haveStockable;
  106. }
  107. };
  108. foreach ($data as $key => $value) {
  109. $cart->{$key} = $value;
  110. }
  111. $cart->channel = new class {
  112. public string $name = 'Default';
  113. };
  114. $cart->payment = (object) [
  115. 'method' => 'paypal_smart_button',
  116. 'method_title' => 'PayPal Smart Button',
  117. ];
  118. return $cart;
  119. }
  120. }