Explorar el Código

修复 customerOrders 的 baseImage 类型错误,改为 JSON 字符串以匹配 GraphQL String。

Co-authored-by: Cursor <cursoragent@cursor.com>
chengwl hace 2 días
padre
commit
fd922db08e

+ 13 - 6
packages/Webkul/BagistoApi/src/Models/CustomerOrderItem.php

@@ -164,15 +164,20 @@ class CustomerOrderItem extends Model
     /**
      * Product main image (same structure as cart item base_image).
      *
-     * @return array<string, string>|null
+     * GraphQL exposes this as String, matching CartItemData::baseImage.
+     * Value is a JSON object: {"small_image_url":"...","medium_image_url":"...","large_image_url":"...","original_image_url":"..."}.
      */
-    #[ApiProperty(writable: false, description: 'Product base image URLs (small/medium/large/original)')]
-    public function getBaseImage(): ?array
+    #[ApiProperty(
+        writable: false,
+        description: 'Product base image URLs as JSON string (small/medium/large/original)',
+        schema: ['type' => 'string', 'nullable' => true],
+    )]
+    public function getBaseImage(): ?string
     {
         return $this->resolveBaseImage();
     }
 
-    public function getBaseImageAttribute(): ?array
+    public function getBaseImageAttribute(): ?string
     {
         return $this->resolveBaseImage();
     }
@@ -228,7 +233,7 @@ class CustomerOrderItem extends Model
         return $this->product;
     }
 
-    private function resolveBaseImage(): ?array
+    private function resolveBaseImage(): ?string
     {
         $product = $this->resolveImageProduct();
 
@@ -237,7 +242,9 @@ class CustomerOrderItem extends Model
         }
 
         try {
-            return ProductImage::getProductBaseImage($product);
+            $image = ProductImage::getProductBaseImage($product);
+
+            return is_array($image) ? json_encode($image) : null;
         } catch (\Throwable) {
             return null;
         }

+ 113 - 0
packages/Webkul/BagistoApi/tests/Feature/GraphQL/CustomerOrderTest.php

@@ -120,6 +120,81 @@ class CustomerOrderTest extends GraphQLTestCase
         expect($data['edges'])->not()->toBeEmpty();
     }
 
+    /**
+     * Test: Order item baseImage is a JSON string, not a GraphQL object
+     */
+    public function test_customer_orders_item_base_image_is_json_string(): void
+    {
+        $testData = $this->createTestData();
+
+        \Webkul\Product\Models\ProductImage::query()->create([
+            'product_id' => $testData['product']->id,
+            'path'       => 'product/15/test-image.webp',
+            'position'   => 1,
+        ]);
+
+        $query = <<<'GQL'
+            query getCustomerOrders {
+              customerOrders(first: 10) {
+                edges {
+                  node {
+                    _id
+                    items {
+                      edges {
+                        node {
+                          sku
+                          name
+                          baseImage
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+        GQL;
+
+        $response = $this->authenticatedGraphQL($testData['customer'], $query);
+
+        if ($response->json('errors.0.message') && str_contains((string) $response->json('errors.0.message'), 'edges')) {
+            $query = <<<'GQL'
+                query getCustomerOrders {
+                  customerOrders(first: 10) {
+                    edges {
+                      node {
+                        _id
+                        items {
+                          sku
+                          name
+                          baseImage
+                        }
+                      }
+                    }
+                  }
+                }
+            GQL;
+
+            $response = $this->authenticatedGraphQL($testData['customer'], $query);
+        }
+
+        $response->assertOk();
+        expect($response->json('errors'))->toBeNull();
+
+        $item = $response->json('data.customerOrders.edges.0.node.items.edges.0.node')
+            ?? $response->json('data.customerOrders.edges.0.node.items.0');
+        expect($item)->not()->toBeNull();
+        expect($item['baseImage'])->toBeString();
+
+        $decoded = json_decode($item['baseImage'], true);
+        expect($decoded)->toBeArray()
+            ->and($decoded)->toHaveKeys([
+                'small_image_url',
+                'medium_image_url',
+                'large_image_url',
+                'original_image_url',
+            ]);
+    }
+
     /**
      * Test: Unauthenticated request returns error
      */
@@ -554,4 +629,42 @@ class CustomerOrderTest extends GraphQLTestCase
             ->toContain('orderCurrencyCode')
             ->toContain('createdAt');
     }
+
+    /**
+     * Test: CustomerOrderItem.baseImage is a GraphQL String
+     */
+    public function test_customer_order_item_base_image_schema_is_string(): void
+    {
+        $query = <<<'GQL'
+            {
+              __type(name: "CustomerOrderItem") {
+                name
+                fields {
+                  name
+                  type {
+                    kind
+                    name
+                    ofType {
+                      kind
+                      name
+                    }
+                  }
+                }
+              }
+            }
+        GQL;
+
+        $response = $this->graphQL($query);
+
+        $response->assertSuccessful();
+
+        $fields = $response->json('data.__type.fields');
+        expect($fields)->not()->toBeNull();
+
+        $baseImage = collect($fields)->firstWhere('name', 'baseImage');
+        expect($baseImage)->not()->toBeNull();
+
+        $typeName = $baseImage['type']['name'] ?? $baseImage['type']['ofType']['name'] ?? null;
+        expect($typeName)->toBe('String');
+    }
 }

+ 53 - 0
packages/Webkul/BagistoApi/tests/Unit/Models/CustomerOrderItemBaseImageTest.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace Webkul\BagistoApi\Tests\Unit\Models;
+
+use Webkul\BagistoApi\Models\CustomerOrderItem;
+use Webkul\BagistoApi\Tests\BagistoApiTestCase;
+use Webkul\Product\Models\Product;
+use Webkul\Product\Models\ProductImage;
+
+class CustomerOrderItemBaseImageTest extends BagistoApiTestCase
+{
+    public function test_base_image_is_json_encoded_string(): void
+    {
+        $this->seedRequiredData();
+
+        $product = Product::factory()->create();
+
+        ProductImage::query()->create([
+            'product_id' => $product->id,
+            'path'       => 'product/15/test-image.webp',
+            'position'   => 1,
+        ]);
+
+        $item = new CustomerOrderItem;
+        $item->type = 'simple';
+        $item->setRelation('product', $product->load('images'));
+        $item->setRelation('children', collect());
+
+        $baseImage = $item->getBaseImage();
+
+        expect($baseImage)->toBeString();
+
+        $decoded = json_decode($baseImage, true);
+
+        expect($decoded)->toBeArray()
+            ->and($decoded)->toHaveKeys([
+                'small_image_url',
+                'medium_image_url',
+                'large_image_url',
+                'original_image_url',
+            ]);
+    }
+
+    public function test_base_image_is_null_without_product(): void
+    {
+        $item = new CustomerOrderItem;
+        $item->type = 'simple';
+        $item->setRelation('product', null);
+        $item->setRelation('children', collect());
+
+        expect($item->getBaseImage())->toBeNull();
+    }
+}