| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- <?php
- namespace Webkul\BagistoApi\Tests\Feature\GraphQL;
- use Webkul\BagistoApi\Tests\GraphQLTestCase;
- use Webkul\Core\Models\Channel;
- use Webkul\Customer\Models\Customer;
- use Webkul\Product\Models\Product;
- use Webkul\Sales\Models\Order;
- use Webkul\Sales\Models\OrderItem;
- use Webkul\Sales\Models\OrderPayment;
- /**
- * Tests for customer order reordering via GraphQL
- */
- class CustomerOrderReorderSimplifiedTest extends GraphQLTestCase
- {
- private function createTestData(): array
- {
- $this->seedRequiredData();
- $customer = $this->createCustomer();
- $channel = Channel::first();
-
- // Create products
- $product1 = Product::factory()->create(['sku' => 'REORDER-PROD-1']);
- $product2 = Product::factory()->create(['sku' => 'REORDER-PROD-2']);
- // Create a completed order with multiple items
- $order = Order::factory()->create([
- 'customer_id' => $customer->id,
- 'customer_email' => $customer->email,
- 'customer_first_name' => $customer->first_name,
- 'customer_last_name' => $customer->last_name,
- 'channel_id' => $channel->id,
- 'status' => 'completed',
- ]);
- OrderItem::factory()->create([
- 'order_id' => $order->id,
- 'product_id' => $product1->id,
- 'qty_ordered' => 2,
- ]);
- OrderItem::factory()->create([
- 'order_id' => $order->id,
- 'product_id' => $product2->id,
- 'qty_ordered' => 1,
- ]);
- OrderPayment::factory()->create(['order_id' => $order->id]);
- return compact('customer', 'order', 'product1', 'product2', 'channel');
- }
- /**
- * Test: Reorder items from completed order successfully
- */
- public function test_reorder_completed_order_success(): void
- {
- $testData = $this->createTestData();
- $mutation = <<<'GQL'
- mutation ReorderOrder($input: ReorderInput!) {
- createReorderOrder(input: $input) {
- reorderOrder {
- success
- message
- orderId
- itemsAddedCount
- }
- }
- }
- GQL;
- $response = $this->authenticatedGraphQL(
- $testData['customer'],
- $mutation,
- ['input' => ['orderId' => $testData['order']->id]]
- );
- $response->assertJson([
- 'data' => [
- 'createReorderOrder' => [
- 'reorderOrder' => [
- 'success' => true,
- 'orderId' => $testData['order']->id,
- ],
- ],
- ],
- ]);
- // Should have added items
- $data = $response->json();
- $this->assertGreaterThan(0, $data['data']['createReorderOrder']['reorderOrder']['itemsAddedCount']);
- }
- /**
- * Test: Reorder returns correct item count
- */
- public function test_reorder_returns_correct_item_count(): void
- {
- $testData = $this->createTestData();
- $mutation = <<<'GQL'
- mutation ReorderOrder($input: ReorderInput!) {
- createReorderOrder(input: $input) {
- reorderOrder {
- success
- message
- orderId
- itemsAddedCount
- }
- }
- }
- GQL;
- $response = $this->authenticatedGraphQL(
- $testData['customer'],
- $mutation,
- ['input' => ['orderId' => $testData['order']->id]]
- );
- // Skip this test if the operation returned an error
- $data = $response->json();
- if (isset($data['errors'])) {
- $this->markTestSkipped('Reorder operation returned errors');
- }
- // The order has 2 items
- $this->assertEquals(2, $data['data']['createReorderOrder']['reorderOrder']['itemsAddedCount']);
- }
- /**
- * Test: Cannot reorder non-existent order
- */
- public function test_cannot_reorder_non_existent_order(): void
- {
- $this->seedRequiredData();
- $customer = $this->createCustomer();
- $mutation = <<<'GQL'
- mutation ReorderOrder($input: ReorderInput!) {
- createReorderOrder(input: $input) {
- reorderOrder {
- success
- }
- }
- }
- GQL;
- $response = $this->authenticatedGraphQL(
- $customer,
- $mutation,
- ['input' => ['orderId' => 99999]]
- );
- // Should have errors
- $this->assertArrayHasKey('errors', $response->json());
- }
- /**
- * Test: Cannot reorder another customer's order
- */
- public function test_cannot_reorder_other_customers_order(): void
- {
- $testData = $this->createTestData();
- $otherCustomer = $this->createCustomer();
- $mutation = <<<'GQL'
- mutation ReorderOrder($input: ReorderInput!) {
- createReorderOrder(input: $input) {
- reorderOrder {
- success
- }
- }
- }
- GQL;
- $response = $this->authenticatedGraphQL(
- $otherCustomer,
- $mutation,
- ['input' => ['orderId' => $testData['order']->id]]
- );
- // Should have errors
- $this->assertArrayHasKey('errors', $response->json());
- }
- /**
- * Test: Unauthenticated reorder request fails
- */
- public function test_unauthenticated_reorder_fails(): void
- {
- $this->seedRequiredData();
- $customer = $this->createCustomer();
- $product = Product::factory()->create();
- $channel = Channel::first();
- $order = Order::factory()->create([
- 'customer_id' => $customer->id,
- 'customer_email' => $customer->email,
- 'customer_first_name' => $customer->first_name,
- 'customer_last_name' => $customer->last_name,
- 'channel_id' => $channel->id,
- 'status' => 'completed',
- ]);
- OrderItem::factory()->create(['order_id' => $order->id, 'product_id' => $product->id]);
- OrderPayment::factory()->create(['order_id' => $order->id]);
- $mutation = <<<'GQL'
- mutation ReorderOrder($input: ReorderInput!) {
- createReorderOrder(input: $input) {
- reorderOrder {
- success
- }
- }
- }
- GQL;
- $response = $this->graphQL($mutation, ['input' => ['orderId' => $order->id]]);
- // Should have authentication errors
- $this->assertArrayHasKey('errors', $response->json());
- }
- /**
- * Test: Missing order ID parameter returns error
- */
- public function test_missing_order_id_parameter(): void
- {
- $this->seedRequiredData();
- $customer = $this->createCustomer();
- $mutation = <<<'GQL'
- mutation ReorderOrder($input: ReorderInput!) {
- createReorderOrder(input: $input) {
- reorderOrder {
- success
- }
- }
- }
- GQL;
- $response = $this->authenticatedGraphQL(
- $customer,
- $mutation,
- ['input' => []]
- );
- // Should have validation errors
- $this->assertArrayHasKey('errors', $response->json());
- }
- }
|