OrderActionTest.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?php
  2. namespace Webkul\BagistoApi\Tests\Feature\GraphQL;
  3. use Webkul\BagistoApi\Tests\GraphQLTestCase;
  4. use Webkul\Sales\Models\Order;
  5. use Webkul\Sales\Models\OrderItem;
  6. use Webkul\Sales\Models\OrderPayment;
  7. use Webkul\Product\Models\Product;
  8. use Webkul\Checkout\Facades\Cart;
  9. /**
  10. * Helper to create a test order for a customer.
  11. */
  12. function createTestOrder($test, $customer, $status = 'pending') {
  13. $product = Product::factory()->create();
  14. $order = Order::factory()->create([
  15. 'customer_id' => $customer->id,
  16. 'customer_email' => $customer->email,
  17. 'customer_first_name' => $customer->first_name,
  18. 'customer_last_name' => $customer->last_name,
  19. 'status' => $status,
  20. ]);
  21. OrderItem::factory()->create([
  22. 'order_id' => $order->id,
  23. 'product_id' => $product->id,
  24. 'qty_ordered' => 1,
  25. ]);
  26. OrderPayment::factory()->create(['order_id' => $order->id]);
  27. return $order;
  28. }
  29. class OrderActionTest extends GraphQLTestCase
  30. {
  31. public function test_customer_can_cancel_their_own_pending_order(): void
  32. {
  33. $this->seedRequiredData();
  34. $customer = $this->createCustomer();
  35. $order = createTestOrder($this, $customer, 'pending');
  36. $mutation = <<<'GQL'
  37. mutation CancelOrder($input: CancelOrderInput!) {
  38. createCancelOrder(input: $input) {
  39. cancelOrder {
  40. success
  41. message
  42. status
  43. orderId
  44. }
  45. }
  46. }
  47. GQL;
  48. $response = $this->authenticatedGraphQL($customer, $mutation, [
  49. 'input' => ['orderId' => (int) $order->id]
  50. ]);
  51. $response->assertOk()
  52. ->assertJsonPath('data.createCancelOrder.cancelOrder.success', true)
  53. ->assertJsonPath('data.createCancelOrder.cancelOrder.status', 'canceled');
  54. }
  55. public function test_customer_cannot_cancel_an_order_that_does_not_belong_to_them(): void
  56. {
  57. $this->seedRequiredData();
  58. $customer1 = $this->createCustomer();
  59. $customer2 = $this->createCustomer();
  60. $orderOfCustomer2 = createTestOrder($this, $customer2);
  61. $mutation = <<<'GQL'
  62. mutation CancelOrder($input: CancelOrderInput!) {
  63. createCancelOrder(input: $input) {
  64. cancelOrder { success }
  65. }
  66. }
  67. GQL;
  68. $response = $this->authenticatedGraphQL($customer1, $mutation, [
  69. 'input' => ['orderId' => (int) $orderOfCustomer2->id]
  70. ]);
  71. // Should return a resource not found error
  72. expect($response->json('errors'))->not->toBeEmpty();
  73. }
  74. public function test_customer_can_reorder_items_from_a_previous_order(): void
  75. {
  76. $this->seedRequiredData();
  77. $customer = $this->createCustomer();
  78. $order = createTestOrder($this, $customer, 'completed');
  79. // Cart should be empty initially
  80. expect(Cart::getCart())->toBeNull();
  81. $mutation = <<<'GQL'
  82. mutation Reorder($input: ReorderInput!) {
  83. createReorderOrder(input: $input) {
  84. reorderOrder {
  85. success
  86. itemsAddedCount
  87. }
  88. }
  89. }
  90. GQL;
  91. $response = $this->authenticatedGraphQL($customer, $mutation, [
  92. 'input' => ['orderId' => (int) $order->id]
  93. ]);
  94. $response->assertOk()
  95. ->assertJsonPath('data.createReorderOrder.reorderOrder.success', true)
  96. ->assertJsonPath('data.createReorderOrder.reorderOrder.itemsAddedCount', 1);
  97. // Verify cart now has the item
  98. expect(Cart::getCart())->not->toBeNull();
  99. expect(Cart::getCart()->items->count())->toBe(1);
  100. }
  101. }