diff --git a/backend-packages.json b/backend-packages.json index 38f9532c..d79986fe 100644 --- a/backend-packages.json +++ b/backend-packages.json @@ -6,22 +6,22 @@ "PlatformAssetUrl": "", "Sources": [ { - "Name": "AzureBlob", - "Container": "packages", - "ServiceUri": "https://vc3prerelease.blob.core.windows.net", - "Modules": [] + "Name": "AzureBlob", + "Container": "packages", + "ServiceUri": "https://vc3prerelease.blob.core.windows.net", + "Modules": [] }, { "Name": "GithubReleases", "ModuleSources": [ "https://raw.githubusercontent.com/VirtoCommerce/vc-modules/master/modules_v3.json" ], - "Modules": [ - { + "Modules": [ + { "Id": "VirtoCommerce.Loyalty", "Version": "3.1004.0" - }, - { + }, + { "Id": "VirtoCommerce.ElasticSearch", "Version": "3.806.0" }, @@ -300,7 +300,7 @@ { "Id": "VirtoCommerce.Xapi", "Version": "3.1013.0" - }, + }, { "Id": "VirtoCommerce.Catalog", "Version": "3.1034.0" @@ -311,7 +311,7 @@ }, { "Id": "VirtoCommerce.PageBuilderModule", - "Version": "3.1015.0" + "Version": "3.1016.0" }, { "Id": "VirtoCommerce.XCatalog", @@ -341,10 +341,6 @@ "Id": "VirtoCommerce.Cart", "Version": "3.1007.0" }, - { - "Id": "VirtoCommerce.XCart", - "Version": "3.1025.0" - }, { "Id": "VirtoCommerce.XOrder", "Version": "3.1007.0" @@ -356,8 +352,12 @@ { "Id": "VirtoCommerce.Orders", "Version": "3.1012.0" + }, + { + "Id": "VirtoCommerce.XCart", + "Version": "3.1026.0" } - ] + ] } ] -} \ No newline at end of file +} diff --git a/core/global_settings.py b/core/global_settings.py index 3d8b5d89..3e13ba40 100644 --- a/core/global_settings.py +++ b/core/global_settings.py @@ -33,6 +33,11 @@ class GlobalSettings(BaseSettings): verify_ssl: bool = False poll_interval: int = 2 poll_attempts: int = 10 + # Default timeout (ms) for Playwright actions, navigation, and web-first + # assertions in e2e tests. Higher than Playwright's 5s assertion default so + # tests tolerate slower remote environments (e.g. shared demo backends on + # CI) where the UI settles later than it does against a local frontend. + playwright_timeout: int = 30000 @cached_property def env_vars(self) -> dict[str, str]: diff --git a/dataset/data/categories/acme_electronics_laptops.json b/dataset/data/categories/acme_electronics_laptops.json new file mode 100644 index 00000000..c59a1207 --- /dev/null +++ b/dataset/data/categories/acme_electronics_laptops.json @@ -0,0 +1,17 @@ +{ + "id": "category-acme-electronics-laptops", + "code": "category-acme-electronics-laptops", + "catalogId": "catalog-acme-electronics", + "name": "Laptops", + "seoObjectType": "Category", + "seoInfos": [ + { + "id": "seo-info-acme-electronics-category-laptops-en", + "storeId": "store-acme", + "isActive": true, + "languageCode": "en-US", + "pageTitle": "Laptops", + "semanticUrl": "laptops" + } + ] +} diff --git a/dataset/data/manifest.json b/dataset/data/manifest.json index 9d123a4f..36d05624 100644 --- a/dataset/data/manifest.json +++ b/dataset/data/manifest.json @@ -106,6 +106,13 @@ "endpoint": "/api/inventory/products/{PAYLOAD_ITEM:productId}", "payload_type": "single" }, + { + "name": "product_configurations", + "module_id": "VirtoCommerce.Catalog", + "method": "POST", + "endpoint": "/api/catalog/products/configurations", + "payload_type": "single" + }, { "name": "prices", "module_id": "VirtoCommerce.Pricing", diff --git a/dataset/data/prices/laptops/laptop_acer_predator_helios_neo_16_ai.json b/dataset/data/prices/laptops/laptop_acer_predator_helios_neo_16_ai.json new file mode 100644 index 00000000..69f714f2 --- /dev/null +++ b/dataset/data/prices/laptops/laptop_acer_predator_helios_neo_16_ai.json @@ -0,0 +1,25 @@ +{ + "productId": "laptop-acer-predator-helios-neo-16-ai", + "product": { + "id": "laptop-acer-predator-helios-neo-16-ai", + "name": "Acer Predator Helios Neo 16 AI" + }, + "prices": [ + { + "catalog": "catalog-acme-electronics", + "currency": "USD", + "list": 2299.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-usd", + "productId": "laptop-acer-predator-helios-neo-16-ai" + }, + { + "catalog": "catalog-acme-electronics", + "currency": "EUR", + "list": 2138.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-eur", + "productId": "laptop-acer-predator-helios-neo-16-ai" + } + ] +} diff --git a/dataset/data/prices/laptops/laptop_apple_macbook_air_15_midnight_16gb_1tb.json b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_midnight_16gb_1tb.json new file mode 100644 index 00000000..507fbe2f --- /dev/null +++ b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_midnight_16gb_1tb.json @@ -0,0 +1,25 @@ +{ + "productId": "laptop-apple-macbook-air-15-midnight-16gb-1tb", + "product": { + "id": "laptop-apple-macbook-air-15-midnight-16gb-1tb", + "name": "Apple MacBook Air 15 Midnight RAM 16Gb SSD 1Tb" + }, + "prices": [ + { + "catalog": "catalog-acme-electronics", + "currency": "USD", + "list": 1699.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-usd", + "productId": "laptop-apple-macbook-air-15-midnight-16gb-1tb" + }, + { + "catalog": "catalog-acme-electronics", + "currency": "EUR", + "list": 1580.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-eur", + "productId": "laptop-apple-macbook-air-15-midnight-16gb-1tb" + } + ] +} diff --git a/dataset/data/prices/laptops/laptop_apple_macbook_air_15_midnight_16gb_512gb.json b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_midnight_16gb_512gb.json new file mode 100644 index 00000000..45ac625a --- /dev/null +++ b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_midnight_16gb_512gb.json @@ -0,0 +1,25 @@ +{ + "productId": "laptop-apple-macbook-air-15-midnight-16gb-512gb", + "product": { + "id": "laptop-apple-macbook-air-15-midnight-16gb-512gb", + "name": "Apple MacBook Air 15 Midnight RAM 16Gb SSD 512Gb" + }, + "prices": [ + { + "catalog": "catalog-acme-electronics", + "currency": "USD", + "list": 1499.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-usd", + "productId": "laptop-apple-macbook-air-15-midnight-16gb-512gb" + }, + { + "catalog": "catalog-acme-electronics", + "currency": "EUR", + "list": 1394.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-eur", + "productId": "laptop-apple-macbook-air-15-midnight-16gb-512gb" + } + ] +} diff --git a/dataset/data/prices/laptops/laptop_apple_macbook_air_15_midnight_8gb_512gb.json b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_midnight_8gb_512gb.json new file mode 100644 index 00000000..48e98325 --- /dev/null +++ b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_midnight_8gb_512gb.json @@ -0,0 +1,25 @@ +{ + "productId": "laptop-apple-macbook-air-15-midnight-8gb-512gb", + "product": { + "id": "laptop-apple-macbook-air-15-midnight-8gb-512gb", + "name": "Apple MacBook Air 15 Midnight RAM 8Gb SSD 512Gb" + }, + "prices": [ + { + "catalog": "catalog-acme-electronics", + "currency": "USD", + "list": 1299.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-usd", + "productId": "laptop-apple-macbook-air-15-midnight-8gb-512gb" + }, + { + "catalog": "catalog-acme-electronics", + "currency": "EUR", + "list": 1208.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-eur", + "productId": "laptop-apple-macbook-air-15-midnight-8gb-512gb" + } + ] +} diff --git a/dataset/data/prices/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb.json b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb.json new file mode 100644 index 00000000..e993cbf5 --- /dev/null +++ b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb.json @@ -0,0 +1,25 @@ +{ + "productId": "laptop-apple-macbook-air-15-silver-16gb-1tb", + "product": { + "id": "laptop-apple-macbook-air-15-silver-16gb-1tb", + "name": "Apple MacBook Air 15 Silver RAM 16Gb SSD 1Tb" + }, + "prices": [ + { + "catalog": "catalog-acme-electronics", + "currency": "USD", + "list": 1699.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-usd", + "productId": "laptop-apple-macbook-air-15-silver-16gb-1tb" + }, + { + "catalog": "catalog-acme-electronics", + "currency": "EUR", + "list": 1580.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-eur", + "productId": "laptop-apple-macbook-air-15-silver-16gb-1tb" + } + ] +} diff --git a/dataset/data/prices/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb.json b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb.json new file mode 100644 index 00000000..ade82bdd --- /dev/null +++ b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb.json @@ -0,0 +1,25 @@ +{ + "productId": "laptop-apple-macbook-air-15-silver-16gb-512gb", + "product": { + "id": "laptop-apple-macbook-air-15-silver-16gb-512gb", + "name": "Apple MacBook Air 15 Silver RAM 16Gb SSD 512Gb" + }, + "prices": [ + { + "catalog": "catalog-acme-electronics", + "currency": "USD", + "list": 1499.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-usd", + "productId": "laptop-apple-macbook-air-15-silver-16gb-512gb" + }, + { + "catalog": "catalog-acme-electronics", + "currency": "EUR", + "list": 1394.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-eur", + "productId": "laptop-apple-macbook-air-15-silver-16gb-512gb" + } + ] +} diff --git a/dataset/data/prices/laptops/laptop_apple_macbook_air_15_silver_8gb_512gb.json b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_silver_8gb_512gb.json new file mode 100644 index 00000000..c9587412 --- /dev/null +++ b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_silver_8gb_512gb.json @@ -0,0 +1,25 @@ +{ + "productId": "laptop-apple-macbook-air-15-silver-8gb-512gb", + "product": { + "id": "laptop-apple-macbook-air-15-silver-8gb-512gb", + "name": "Apple MacBook Air 15 Silver RAM 8Gb SSD 512Gb" + }, + "prices": [ + { + "catalog": "catalog-acme-electronics", + "currency": "USD", + "list": 1299.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-usd", + "productId": "laptop-apple-macbook-air-15-silver-8gb-512gb" + }, + { + "catalog": "catalog-acme-electronics", + "currency": "EUR", + "list": 1208.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-eur", + "productId": "laptop-apple-macbook-air-15-silver-8gb-512gb" + } + ] +} diff --git a/dataset/data/prices/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_1tb.json b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_1tb.json new file mode 100644 index 00000000..ad91fe59 --- /dev/null +++ b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_1tb.json @@ -0,0 +1,25 @@ +{ + "productId": "laptop-apple-macbook-air-15-sky-blue-16gb-1tb", + "product": { + "id": "laptop-apple-macbook-air-15-sky-blue-16gb-1tb", + "name": "Apple MacBook Air 15 Sky Blue RAM 16Gb SSD 1Tb" + }, + "prices": [ + { + "catalog": "catalog-acme-electronics", + "currency": "USD", + "list": 1699.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-usd", + "productId": "laptop-apple-macbook-air-15-sky-blue-16gb-1tb" + }, + { + "catalog": "catalog-acme-electronics", + "currency": "EUR", + "list": 1580.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-eur", + "productId": "laptop-apple-macbook-air-15-sky-blue-16gb-1tb" + } + ] +} diff --git a/dataset/data/prices/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_512gb.json b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_512gb.json new file mode 100644 index 00000000..f624a399 --- /dev/null +++ b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_512gb.json @@ -0,0 +1,25 @@ +{ + "productId": "laptop-apple-macbook-air-15-sky-blue-16gb-512gb", + "product": { + "id": "laptop-apple-macbook-air-15-sky-blue-16gb-512gb", + "name": "Apple MacBook Air 15 Sky Blue RAM 16Gb SSD 512Gb" + }, + "prices": [ + { + "catalog": "catalog-acme-electronics", + "currency": "USD", + "list": 1499.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-usd", + "productId": "laptop-apple-macbook-air-15-sky-blue-16gb-512gb" + }, + { + "catalog": "catalog-acme-electronics", + "currency": "EUR", + "list": 1394.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-eur", + "productId": "laptop-apple-macbook-air-15-sky-blue-16gb-512gb" + } + ] +} diff --git a/dataset/data/prices/laptops/laptop_apple_macbook_air_15_sky_blue_8gb_512gb.json b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_sky_blue_8gb_512gb.json new file mode 100644 index 00000000..ca706e67 --- /dev/null +++ b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_sky_blue_8gb_512gb.json @@ -0,0 +1,25 @@ +{ + "productId": "laptop-apple-macbook-air-15-sky-blue-8gb-512gb", + "product": { + "id": "laptop-apple-macbook-air-15-sky-blue-8gb-512gb", + "name": "Apple MacBook Air 15 Sky Blue RAM 8Gb SSD 512Gb" + }, + "prices": [ + { + "catalog": "catalog-acme-electronics", + "currency": "USD", + "list": 1299.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-usd", + "productId": "laptop-apple-macbook-air-15-sky-blue-8gb-512gb" + }, + { + "catalog": "catalog-acme-electronics", + "currency": "EUR", + "list": 1208.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-eur", + "productId": "laptop-apple-macbook-air-15-sky-blue-8gb-512gb" + } + ] +} diff --git a/dataset/data/prices/laptops/laptop_apple_macbook_air_15_starlight_16gb_1tb.json b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_starlight_16gb_1tb.json new file mode 100644 index 00000000..92ab9bb0 --- /dev/null +++ b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_starlight_16gb_1tb.json @@ -0,0 +1,25 @@ +{ + "productId": "laptop-apple-macbook-air-15-starlight-16gb-1tb", + "product": { + "id": "laptop-apple-macbook-air-15-starlight-16gb-1tb", + "name": "Apple MacBook Air 15 Starlight RAM 16Gb SSD 1Tb" + }, + "prices": [ + { + "catalog": "catalog-acme-electronics", + "currency": "USD", + "list": 1699.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-usd", + "productId": "laptop-apple-macbook-air-15-starlight-16gb-1tb" + }, + { + "catalog": "catalog-acme-electronics", + "currency": "EUR", + "list": 1580.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-eur", + "productId": "laptop-apple-macbook-air-15-starlight-16gb-1tb" + } + ] +} diff --git a/dataset/data/prices/laptops/laptop_apple_macbook_air_15_starlight_16gb_512gb.json b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_starlight_16gb_512gb.json new file mode 100644 index 00000000..89869dc1 --- /dev/null +++ b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_starlight_16gb_512gb.json @@ -0,0 +1,25 @@ +{ + "productId": "laptop-apple-macbook-air-15-starlight-16gb-512gb", + "product": { + "id": "laptop-apple-macbook-air-15-starlight-16gb-512gb", + "name": "Apple MacBook Air 15 Starlight RAM 16Gb SSD 512Gb" + }, + "prices": [ + { + "catalog": "catalog-acme-electronics", + "currency": "USD", + "list": 1499.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-usd", + "productId": "laptop-apple-macbook-air-15-starlight-16gb-512gb" + }, + { + "catalog": "catalog-acme-electronics", + "currency": "EUR", + "list": 1394.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-eur", + "productId": "laptop-apple-macbook-air-15-starlight-16gb-512gb" + } + ] +} diff --git a/dataset/data/prices/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb.json b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb.json new file mode 100644 index 00000000..34d36ccf --- /dev/null +++ b/dataset/data/prices/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb.json @@ -0,0 +1,25 @@ +{ + "productId": "laptop-apple-macbook-air-15-starlight-8gb-512gb", + "product": { + "id": "laptop-apple-macbook-air-15-starlight-8gb-512gb", + "name": "Apple MacBook Air 15 Starlight RAM 8Gb SSD 512Gb" + }, + "prices": [ + { + "catalog": "catalog-acme-electronics", + "currency": "USD", + "list": 1299.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-usd", + "productId": "laptop-apple-macbook-air-15-starlight-8gb-512gb" + }, + { + "catalog": "catalog-acme-electronics", + "currency": "EUR", + "list": 1208.99, + "minQuantity": 1, + "pricelistId": "pricelist-acme-eur", + "productId": "laptop-apple-macbook-air-15-starlight-8gb-512gb" + } + ] +} diff --git a/dataset/data/product_configurations/configuration_laptop_acer_predator_helios_neo_16_ai.json b/dataset/data/product_configurations/configuration_laptop_acer_predator_helios_neo_16_ai.json new file mode 100644 index 00000000..799eb6b0 --- /dev/null +++ b/dataset/data/product_configurations/configuration_laptop_acer_predator_helios_neo_16_ai.json @@ -0,0 +1,61 @@ +{ + "id": "configuration-laptop-acer-predator-helios-neo-16-ai", + "productId": "laptop-acer-predator-helios-neo-16-ai", + "isActive": true, + "sections": [ + { + "id": "configuration-section-memory-laptop-acer-predator-helios-neo-16-ai", + "name": "Memory", + "description": "Memory", + "isRequired": true, + "type": "Product", + "options": [ + { + "productId": "sodimm-corsair-vengeance-ddr5-4800-8gb", + "productName": "Corsair Vengeance DDR5-4800 8GB", + "productType": "Physical", + "quantity": 1 + }, + { + "productId": "sodimm-crucial-ddr5-4800-16gb", + "productName": "Crucial DDR5-4800 16GB", + "productType": "Physical", + "quantity": 1 + }, + { + "productId": "sodimm-samsung-ddr5-4800-8gb", + "productName": "Samsung DDR5-4800 8GB", + "productType": "Physical", + "quantity": 1 + } + ] + }, + { + "id": "configuration-section-storage-laptop-acer-predator-helios-neo-16-ai", + "name": "Storage", + "description": "Storage", + "isRequired": true, + "type": "Product", + "options": [ + { + "productId": "ssd-adata-legend-860-pcie-40-nvme-m2-512gb", + "productName": "ADATA Legend 860 PCIe 4.0 NVMe M.2 SSD 512GB", + "productType": "Physical", + "quantity": 1 + }, + { + "productId": "ssd-kingston-fury-renegade-g5-pcie-50-nvme-m2-1024gb", + "productName": "Kingston FURY Renegade G5 PCIe 5.0 NVMe M.2 SSD 1024GB", + "productType": "Physical", + "quantity": 1 + }, + { + "productId": "ssd-samsung-980-pro-pcie-40-nvme-m2-1024gb", + "productName": "Samsung 980 PRO PCIe 4.0 NVMe M.2 SSD 1024GB", + "productType": "Physical", + "quantity": 1 + } + ] + } + ] +} diff --git a/dataset/data/product_inventories/laptops/laptop_acer_predator_helios_neo_16_ai_ffc_canada_mapleroute_distribution_hub.json b/dataset/data/product_inventories/laptops/laptop_acer_predator_helios_neo_16_ai_ffc_canada_mapleroute_distribution_hub.json new file mode 100644 index 00000000..05c34c93 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_acer_predator_helios_neo_16_ai_ffc_canada_mapleroute_distribution_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-acer-predator-helios-neo-16-ai", + "sku": "laptop-acer-predator-helios-neo-16-ai", + "productName": "Acer Predator Helios Neo 16 AI", + "fulfillmentCenterId": "ffc-canada-mapleroute-distribution-hub", + "fulfillmentCenterName": "MapleRoute Distribution Hub - Canada", + "inStockQuantity": 2570 +} diff --git a/dataset/data/product_inventories/laptops/laptop_acer_predator_helios_neo_16_ai_ffc_chile_andes_supply_node.json b/dataset/data/product_inventories/laptops/laptop_acer_predator_helios_neo_16_ai_ffc_chile_andes_supply_node.json new file mode 100644 index 00000000..ee8a51aa --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_acer_predator_helios_neo_16_ai_ffc_chile_andes_supply_node.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-acer-predator-helios-neo-16-ai", + "sku": "laptop-acer-predator-helios-neo-16-ai", + "productName": "Acer Predator Helios Neo 16 AI", + "fulfillmentCenterId": "ffc-chile-andes-supply-node", + "fulfillmentCenterName": "Andes Supply Node - Chile", + "inStockQuantity": 1221 +} diff --git a/dataset/data/product_inventories/laptops/laptop_acer_predator_helios_neo_16_ai_ffc_india_bharatflow_distribution_hub.json b/dataset/data/product_inventories/laptops/laptop_acer_predator_helios_neo_16_ai_ffc_india_bharatflow_distribution_hub.json new file mode 100644 index 00000000..a246fbe7 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_acer_predator_helios_neo_16_ai_ffc_india_bharatflow_distribution_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-acer-predator-helios-neo-16-ai", + "sku": "laptop-acer-predator-helios-neo-16-ai", + "productName": "Acer Predator Helios Neo 16 AI", + "fulfillmentCenterId": "ffc-india-bharatflow-distribution-hub", + "fulfillmentCenterName": "BharatFlow Distribution Hub - India", + "inStockQuantity": 2495 +} diff --git a/dataset/data/product_inventories/laptops/laptop_acer_predator_helios_neo_16_ai_ffc_south_africa_transafrica_fulfillment_park.json b/dataset/data/product_inventories/laptops/laptop_acer_predator_helios_neo_16_ai_ffc_south_africa_transafrica_fulfillment_park.json new file mode 100644 index 00000000..f9f56f56 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_acer_predator_helios_neo_16_ai_ffc_south_africa_transafrica_fulfillment_park.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-acer-predator-helios-neo-16-ai", + "sku": "laptop-acer-predator-helios-neo-16-ai", + "productName": "Acer Predator Helios Neo 16 AI", + "fulfillmentCenterId": "ffc-south-africa-transafrica-fulfillment-park", + "fulfillmentCenterName": "TransAfrica Fulfillment Park - South Africa", + "inStockQuantity": 1754 +} diff --git a/dataset/data/product_inventories/laptops/laptop_acer_predator_helios_neo_16_ai_ffc_usa_northgate_logistics_hub.json b/dataset/data/product_inventories/laptops/laptop_acer_predator_helios_neo_16_ai_ffc_usa_northgate_logistics_hub.json new file mode 100644 index 00000000..b0d2aeaf --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_acer_predator_helios_neo_16_ai_ffc_usa_northgate_logistics_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-acer-predator-helios-neo-16-ai", + "sku": "laptop-acer-predator-helios-neo-16-ai", + "productName": "Acer Predator Helios Neo 16 AI", + "fulfillmentCenterId": "ffc-usa-northgate-logistics-hub", + "fulfillmentCenterName": "NorthGate Logistics Hub - USA", + "inStockQuantity": 3644 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_1tb_ffc_canada_mapleroute_distribution_hub.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_1tb_ffc_canada_mapleroute_distribution_hub.json new file mode 100644 index 00000000..468699a1 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_1tb_ffc_canada_mapleroute_distribution_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-midnight-16gb-1tb", + "sku": "laptop-apple-macbook-air-15-midnight-16gb-1tb", + "productName": "Apple MacBook Air 15 Midnight RAM 16Gb SSD 1Tb", + "fulfillmentCenterId": "ffc-canada-mapleroute-distribution-hub", + "fulfillmentCenterName": "MapleRoute Distribution Hub - Canada", + "inStockQuantity": 3439 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_1tb_ffc_south_africa_transafrica_fulfillment_park.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_1tb_ffc_south_africa_transafrica_fulfillment_park.json new file mode 100644 index 00000000..4b65fdad --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_1tb_ffc_south_africa_transafrica_fulfillment_park.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-midnight-16gb-1tb", + "sku": "laptop-apple-macbook-air-15-midnight-16gb-1tb", + "productName": "Apple MacBook Air 15 Midnight RAM 16Gb SSD 1Tb", + "fulfillmentCenterId": "ffc-south-africa-transafrica-fulfillment-park", + "fulfillmentCenterName": "TransAfrica Fulfillment Park - South Africa", + "inStockQuantity": 1893 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_1tb_ffc_uae_gulflink_logistics_center.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_1tb_ffc_uae_gulflink_logistics_center.json new file mode 100644 index 00000000..e2f14386 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_1tb_ffc_uae_gulflink_logistics_center.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-midnight-16gb-1tb", + "sku": "laptop-apple-macbook-air-15-midnight-16gb-1tb", + "productName": "Apple MacBook Air 15 Midnight RAM 16Gb SSD 1Tb", + "fulfillmentCenterId": "ffc-uae-gulflink-logistics-center", + "fulfillmentCenterName": "GulfLink Logistics Center - UAE", + "inStockQuantity": 127 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_512gb_ffc_canada_mapleroute_distribution_hub.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_512gb_ffc_canada_mapleroute_distribution_hub.json new file mode 100644 index 00000000..f24ba2f6 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_512gb_ffc_canada_mapleroute_distribution_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-midnight-16gb-512gb", + "sku": "laptop-apple-macbook-air-15-midnight-16gb-512gb", + "productName": "Apple MacBook Air 15 Midnight RAM 16Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-canada-mapleroute-distribution-hub", + "fulfillmentCenterName": "MapleRoute Distribution Hub - Canada", + "inStockQuantity": 1799 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_512gb_ffc_south_africa_transafrica_fulfillment_park.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_512gb_ffc_south_africa_transafrica_fulfillment_park.json new file mode 100644 index 00000000..ad141c2e --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_512gb_ffc_south_africa_transafrica_fulfillment_park.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-midnight-16gb-512gb", + "sku": "laptop-apple-macbook-air-15-midnight-16gb-512gb", + "productName": "Apple MacBook Air 15 Midnight RAM 16Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-south-africa-transafrica-fulfillment-park", + "fulfillmentCenterName": "TransAfrica Fulfillment Park - South Africa", + "inStockQuantity": 1644 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_512gb_ffc_uae_gulflink_logistics_center.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_512gb_ffc_uae_gulflink_logistics_center.json new file mode 100644 index 00000000..c1f21e78 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_16gb_512gb_ffc_uae_gulflink_logistics_center.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-midnight-16gb-512gb", + "sku": "laptop-apple-macbook-air-15-midnight-16gb-512gb", + "productName": "Apple MacBook Air 15 Midnight RAM 16Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-uae-gulflink-logistics-center", + "fulfillmentCenterName": "GulfLink Logistics Center - UAE", + "inStockQuantity": 392 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_8gb_512gb_ffc_chile_andes_supply_node.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_8gb_512gb_ffc_chile_andes_supply_node.json new file mode 100644 index 00000000..26bb9a1f --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_8gb_512gb_ffc_chile_andes_supply_node.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-midnight-8gb-512gb", + "sku": "laptop-apple-macbook-air-15-midnight-8gb-512gb", + "productName": "Apple MacBook Air 15 Midnight RAM 8Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-chile-andes-supply-node", + "fulfillmentCenterName": "Andes Supply Node - Chile", + "inStockQuantity": 501 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_8gb_512gb_ffc_south_africa_transafrica_fulfillment_park.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_8gb_512gb_ffc_south_africa_transafrica_fulfillment_park.json new file mode 100644 index 00000000..b5ea7554 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_midnight_8gb_512gb_ffc_south_africa_transafrica_fulfillment_park.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-midnight-8gb-512gb", + "sku": "laptop-apple-macbook-air-15-midnight-8gb-512gb", + "productName": "Apple MacBook Air 15 Midnight RAM 8Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-south-africa-transafrica-fulfillment-park", + "fulfillmentCenterName": "TransAfrica Fulfillment Park - South Africa", + "inStockQuantity": 3576 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_australia_oceania_freightworks_center.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_australia_oceania_freightworks_center.json new file mode 100644 index 00000000..31f7af38 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_australia_oceania_freightworks_center.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-silver-16gb-1tb", + "sku": "laptop-apple-macbook-air-15-silver-16gb-1tb", + "productName": "Apple MacBook Air 15 Silver RAM 16Gb SSD 1Tb", + "fulfillmentCenterId": "ffc-australia-oceania-freightworks-center", + "fulfillmentCenterName": "Oceania FreightWorks Center - Australia", + "inStockQuantity": 1099 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_chile_andes_supply_node.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_chile_andes_supply_node.json new file mode 100644 index 00000000..5921f499 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_chile_andes_supply_node.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-silver-16gb-1tb", + "sku": "laptop-apple-macbook-air-15-silver-16gb-1tb", + "productName": "Apple MacBook Air 15 Silver RAM 16Gb SSD 1Tb", + "fulfillmentCenterId": "ffc-chile-andes-supply-node", + "fulfillmentCenterName": "Andes Supply Node - Chile", + "inStockQuantity": 1500 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_germany_euroflow_distribution_center.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_germany_euroflow_distribution_center.json new file mode 100644 index 00000000..da7ab790 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_germany_euroflow_distribution_center.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-silver-16gb-1tb", + "sku": "laptop-apple-macbook-air-15-silver-16gb-1tb", + "productName": "Apple MacBook Air 15 Silver RAM 16Gb SSD 1Tb", + "fulfillmentCenterId": "ffc-germany-euroflow-distribution-center", + "fulfillmentCenterName": "EuroFlow Distribution Center - Germany", + "inStockQuantity": 3924 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_india_bharatflow_distribution_hub.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_india_bharatflow_distribution_hub.json new file mode 100644 index 00000000..3b04e161 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_india_bharatflow_distribution_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-silver-16gb-1tb", + "sku": "laptop-apple-macbook-air-15-silver-16gb-1tb", + "productName": "Apple MacBook Air 15 Silver RAM 16Gb SSD 1Tb", + "fulfillmentCenterId": "ffc-india-bharatflow-distribution-hub", + "fulfillmentCenterName": "BharatFlow Distribution Hub - India", + "inStockQuantity": 3235 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_uae_gulflink_logistics_center.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_uae_gulflink_logistics_center.json new file mode 100644 index 00000000..0cc02e56 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_uae_gulflink_logistics_center.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-silver-16gb-1tb", + "sku": "laptop-apple-macbook-air-15-silver-16gb-1tb", + "productName": "Apple MacBook Air 15 Silver RAM 16Gb SSD 1Tb", + "fulfillmentCenterId": "ffc-uae-gulflink-logistics-center", + "fulfillmentCenterName": "GulfLink Logistics Center - UAE", + "inStockQuantity": 2199 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_usa_northgate_logistics_hub.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_usa_northgate_logistics_hub.json new file mode 100644 index 00000000..3e9dbe16 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb_ffc_usa_northgate_logistics_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-silver-16gb-1tb", + "sku": "laptop-apple-macbook-air-15-silver-16gb-1tb", + "productName": "Apple MacBook Air 15 Silver RAM 16Gb SSD 1Tb", + "fulfillmentCenterId": "ffc-usa-northgate-logistics-hub", + "fulfillmentCenterName": "NorthGate Logistics Hub - USA", + "inStockQuantity": 1814 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb_ffc_australia_oceania_freightworks_center.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb_ffc_australia_oceania_freightworks_center.json new file mode 100644 index 00000000..8069f921 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb_ffc_australia_oceania_freightworks_center.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-silver-16gb-512gb", + "sku": "laptop-apple-macbook-air-15-silver-16gb-512gb", + "productName": "Apple MacBook Air 15 Silver RAM 16Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-australia-oceania-freightworks-center", + "fulfillmentCenterName": "Oceania FreightWorks Center - Australia", + "inStockQuantity": 2309 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb_ffc_canada_mapleroute_distribution_hub.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb_ffc_canada_mapleroute_distribution_hub.json new file mode 100644 index 00000000..3e75d779 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb_ffc_canada_mapleroute_distribution_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-silver-16gb-512gb", + "sku": "laptop-apple-macbook-air-15-silver-16gb-512gb", + "productName": "Apple MacBook Air 15 Silver RAM 16Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-canada-mapleroute-distribution-hub", + "fulfillmentCenterName": "MapleRoute Distribution Hub - Canada", + "inStockQuantity": 1923 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb_ffc_germany_euroflow_distribution_center.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb_ffc_germany_euroflow_distribution_center.json new file mode 100644 index 00000000..e460b3e9 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb_ffc_germany_euroflow_distribution_center.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-silver-16gb-512gb", + "sku": "laptop-apple-macbook-air-15-silver-16gb-512gb", + "productName": "Apple MacBook Air 15 Silver RAM 16Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-germany-euroflow-distribution-center", + "fulfillmentCenterName": "EuroFlow Distribution Center - Germany", + "inStockQuantity": 374 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb_ffc_india_bharatflow_distribution_hub.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb_ffc_india_bharatflow_distribution_hub.json new file mode 100644 index 00000000..c3fce268 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb_ffc_india_bharatflow_distribution_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-silver-16gb-512gb", + "sku": "laptop-apple-macbook-air-15-silver-16gb-512gb", + "productName": "Apple MacBook Air 15 Silver RAM 16Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-india-bharatflow-distribution-hub", + "fulfillmentCenterName": "BharatFlow Distribution Hub - India", + "inStockQuantity": 253 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb_ffc_south_africa_transafrica_fulfillment_park.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb_ffc_south_africa_transafrica_fulfillment_park.json new file mode 100644 index 00000000..759a3def --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb_ffc_south_africa_transafrica_fulfillment_park.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-silver-16gb-512gb", + "sku": "laptop-apple-macbook-air-15-silver-16gb-512gb", + "productName": "Apple MacBook Air 15 Silver RAM 16Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-south-africa-transafrica-fulfillment-park", + "fulfillmentCenterName": "TransAfrica Fulfillment Park - South Africa", + "inStockQuantity": 2812 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_8gb_512gb_ffc_canada_mapleroute_distribution_hub.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_8gb_512gb_ffc_canada_mapleroute_distribution_hub.json new file mode 100644 index 00000000..f0f81ef4 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_8gb_512gb_ffc_canada_mapleroute_distribution_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-silver-8gb-512gb", + "sku": "laptop-apple-macbook-air-15-silver-8gb-512gb", + "productName": "Apple MacBook Air 15 Silver RAM 8Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-canada-mapleroute-distribution-hub", + "fulfillmentCenterName": "MapleRoute Distribution Hub - Canada", + "inStockQuantity": 1221 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_8gb_512gb_ffc_india_bharatflow_distribution_hub.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_8gb_512gb_ffc_india_bharatflow_distribution_hub.json new file mode 100644 index 00000000..7a00683a --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_8gb_512gb_ffc_india_bharatflow_distribution_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-silver-8gb-512gb", + "sku": "laptop-apple-macbook-air-15-silver-8gb-512gb", + "productName": "Apple MacBook Air 15 Silver RAM 8Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-india-bharatflow-distribution-hub", + "fulfillmentCenterName": "BharatFlow Distribution Hub - India", + "inStockQuantity": 1376 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_8gb_512gb_ffc_uae_gulflink_logistics_center.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_8gb_512gb_ffc_uae_gulflink_logistics_center.json new file mode 100644 index 00000000..fbaf9992 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_silver_8gb_512gb_ffc_uae_gulflink_logistics_center.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-silver-8gb-512gb", + "sku": "laptop-apple-macbook-air-15-silver-8gb-512gb", + "productName": "Apple MacBook Air 15 Silver RAM 8Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-uae-gulflink-logistics-center", + "fulfillmentCenterName": "GulfLink Logistics Center - UAE", + "inStockQuantity": 1151 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_1tb_ffc_canada_mapleroute_distribution_hub.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_1tb_ffc_canada_mapleroute_distribution_hub.json new file mode 100644 index 00000000..471882cd --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_1tb_ffc_canada_mapleroute_distribution_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-sky-blue-16gb-1tb", + "sku": "laptop-apple-macbook-air-15-sky-blue-16gb-1tb", + "productName": "Apple MacBook Air 15 Sky Blue RAM 16Gb SSD 1Tb", + "fulfillmentCenterId": "ffc-canada-mapleroute-distribution-hub", + "fulfillmentCenterName": "MapleRoute Distribution Hub - Canada", + "inStockQuantity": 928 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_1tb_ffc_india_bharatflow_distribution_hub.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_1tb_ffc_india_bharatflow_distribution_hub.json new file mode 100644 index 00000000..a3f13d69 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_1tb_ffc_india_bharatflow_distribution_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-sky-blue-16gb-1tb", + "sku": "laptop-apple-macbook-air-15-sky-blue-16gb-1tb", + "productName": "Apple MacBook Air 15 Sky Blue RAM 16Gb SSD 1Tb", + "fulfillmentCenterId": "ffc-india-bharatflow-distribution-hub", + "fulfillmentCenterName": "BharatFlow Distribution Hub - India", + "inStockQuantity": 697 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_1tb_ffc_uae_gulflink_logistics_center.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_1tb_ffc_uae_gulflink_logistics_center.json new file mode 100644 index 00000000..082e757a --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_1tb_ffc_uae_gulflink_logistics_center.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-sky-blue-16gb-1tb", + "sku": "laptop-apple-macbook-air-15-sky-blue-16gb-1tb", + "productName": "Apple MacBook Air 15 Sky Blue RAM 16Gb SSD 1Tb", + "fulfillmentCenterId": "ffc-uae-gulflink-logistics-center", + "fulfillmentCenterName": "GulfLink Logistics Center - UAE", + "inStockQuantity": 3816 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_512gb_ffc_canada_mapleroute_distribution_hub.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_512gb_ffc_canada_mapleroute_distribution_hub.json new file mode 100644 index 00000000..90503832 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_512gb_ffc_canada_mapleroute_distribution_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-sky-blue-16gb-512gb", + "sku": "laptop-apple-macbook-air-15-sky-blue-16gb-512gb", + "productName": "Apple MacBook Air 15 Sky Blue RAM 16Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-canada-mapleroute-distribution-hub", + "fulfillmentCenterName": "MapleRoute Distribution Hub - Canada", + "inStockQuantity": 96 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_512gb_ffc_chile_andes_supply_node.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_512gb_ffc_chile_andes_supply_node.json new file mode 100644 index 00000000..185416a4 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_512gb_ffc_chile_andes_supply_node.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-sky-blue-16gb-512gb", + "sku": "laptop-apple-macbook-air-15-sky-blue-16gb-512gb", + "productName": "Apple MacBook Air 15 Sky Blue RAM 16Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-chile-andes-supply-node", + "fulfillmentCenterName": "Andes Supply Node - Chile", + "inStockQuantity": 119 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_8gb_512gb_ffc_australia_oceania_freightworks_center.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_8gb_512gb_ffc_australia_oceania_freightworks_center.json new file mode 100644 index 00000000..efd1960e --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_8gb_512gb_ffc_australia_oceania_freightworks_center.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-sky-blue-8gb-512gb", + "sku": "laptop-apple-macbook-air-15-sky-blue-8gb-512gb", + "productName": "Apple MacBook Air 15 Sky Blue RAM 8Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-australia-oceania-freightworks-center", + "fulfillmentCenterName": "Oceania FreightWorks Center - Australia", + "inStockQuantity": 2361 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_8gb_512gb_ffc_japan_pacificbridge_fulfillment.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_8gb_512gb_ffc_japan_pacificbridge_fulfillment.json new file mode 100644 index 00000000..71c4b702 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_8gb_512gb_ffc_japan_pacificbridge_fulfillment.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-sky-blue-8gb-512gb", + "sku": "laptop-apple-macbook-air-15-sky-blue-8gb-512gb", + "productName": "Apple MacBook Air 15 Sky Blue RAM 8Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-japan-pacificbridge-fulfillment", + "fulfillmentCenterName": "PacificBridge Fulfillment - Japan", + "inStockQuantity": 3893 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_8gb_512gb_ffc_sweden_nordicstream_fulfillment.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_8gb_512gb_ffc_sweden_nordicstream_fulfillment.json new file mode 100644 index 00000000..a0bbef6c --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_sky_blue_8gb_512gb_ffc_sweden_nordicstream_fulfillment.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-sky-blue-8gb-512gb", + "sku": "laptop-apple-macbook-air-15-sky-blue-8gb-512gb", + "productName": "Apple MacBook Air 15 Sky Blue RAM 8Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-sweden-nordicstream-fulfillment", + "fulfillmentCenterName": "NordicStream Fulfillment - Sweden", + "inStockQuantity": 46 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_1tb_ffc_australia_oceania_freightworks_center.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_1tb_ffc_australia_oceania_freightworks_center.json new file mode 100644 index 00000000..bc3ae39f --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_1tb_ffc_australia_oceania_freightworks_center.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-starlight-16gb-1tb", + "sku": "laptop-apple-macbook-air-15-starlight-16gb-1tb", + "productName": "Apple MacBook Air 15 Starlight RAM 16Gb SSD 1Tb", + "fulfillmentCenterId": "ffc-australia-oceania-freightworks-center", + "fulfillmentCenterName": "Oceania FreightWorks Center - Australia", + "inStockQuantity": 1296 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_1tb_ffc_canada_mapleroute_distribution_hub.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_1tb_ffc_canada_mapleroute_distribution_hub.json new file mode 100644 index 00000000..81505a8b --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_1tb_ffc_canada_mapleroute_distribution_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-starlight-16gb-1tb", + "sku": "laptop-apple-macbook-air-15-starlight-16gb-1tb", + "productName": "Apple MacBook Air 15 Starlight RAM 16Gb SSD 1Tb", + "fulfillmentCenterId": "ffc-canada-mapleroute-distribution-hub", + "fulfillmentCenterName": "MapleRoute Distribution Hub - Canada", + "inStockQuantity": 2694 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_1tb_ffc_south_africa_transafrica_fulfillment_park.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_1tb_ffc_south_africa_transafrica_fulfillment_park.json new file mode 100644 index 00000000..6175b523 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_1tb_ffc_south_africa_transafrica_fulfillment_park.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-starlight-16gb-1tb", + "sku": "laptop-apple-macbook-air-15-starlight-16gb-1tb", + "productName": "Apple MacBook Air 15 Starlight RAM 16Gb SSD 1Tb", + "fulfillmentCenterId": "ffc-south-africa-transafrica-fulfillment-park", + "fulfillmentCenterName": "TransAfrica Fulfillment Park - South Africa", + "inStockQuantity": 3780 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_512gb_ffc_canada_mapleroute_distribution_hub.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_512gb_ffc_canada_mapleroute_distribution_hub.json new file mode 100644 index 00000000..5c9822ae --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_512gb_ffc_canada_mapleroute_distribution_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-starlight-16gb-512gb", + "sku": "laptop-apple-macbook-air-15-starlight-16gb-512gb", + "productName": "Apple MacBook Air 15 Starlight RAM 16Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-canada-mapleroute-distribution-hub", + "fulfillmentCenterName": "MapleRoute Distribution Hub - Canada", + "inStockQuantity": 1464 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_512gb_ffc_india_bharatflow_distribution_hub.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_512gb_ffc_india_bharatflow_distribution_hub.json new file mode 100644 index 00000000..f7c9d36d --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_512gb_ffc_india_bharatflow_distribution_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-starlight-16gb-512gb", + "sku": "laptop-apple-macbook-air-15-starlight-16gb-512gb", + "productName": "Apple MacBook Air 15 Starlight RAM 16Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-india-bharatflow-distribution-hub", + "fulfillmentCenterName": "BharatFlow Distribution Hub - India", + "inStockQuantity": 1026 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_512gb_ffc_japan_pacificbridge_fulfillment.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_512gb_ffc_japan_pacificbridge_fulfillment.json new file mode 100644 index 00000000..fa2e359c --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_16gb_512gb_ffc_japan_pacificbridge_fulfillment.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-starlight-16gb-512gb", + "sku": "laptop-apple-macbook-air-15-starlight-16gb-512gb", + "productName": "Apple MacBook Air 15 Starlight RAM 16Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-japan-pacificbridge-fulfillment", + "fulfillmentCenterName": "PacificBridge Fulfillment - Japan", + "inStockQuantity": 2020 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_germany_euroflow_distribution_center.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_germany_euroflow_distribution_center.json new file mode 100644 index 00000000..fd214a99 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_germany_euroflow_distribution_center.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-starlight-8gb-512gb", + "sku": "laptop-apple-macbook-air-15-starlight-8gb-512gb", + "productName": "Apple MacBook Air 15 Starlight RAM 8Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-germany-euroflow-distribution-center", + "fulfillmentCenterName": "EuroFlow Distribution Center - Germany", + "inStockQuantity": 2289 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_india_bharatflow_distribution_hub.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_india_bharatflow_distribution_hub.json new file mode 100644 index 00000000..8658d099 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_india_bharatflow_distribution_hub.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-starlight-8gb-512gb", + "sku": "laptop-apple-macbook-air-15-starlight-8gb-512gb", + "productName": "Apple MacBook Air 15 Starlight RAM 8Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-india-bharatflow-distribution-hub", + "fulfillmentCenterName": "BharatFlow Distribution Hub - India", + "inStockQuantity": 223 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_japan_pacificbridge_fulfillment.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_japan_pacificbridge_fulfillment.json new file mode 100644 index 00000000..ba03380d --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_japan_pacificbridge_fulfillment.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-starlight-8gb-512gb", + "sku": "laptop-apple-macbook-air-15-starlight-8gb-512gb", + "productName": "Apple MacBook Air 15 Starlight RAM 8Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-japan-pacificbridge-fulfillment", + "fulfillmentCenterName": "PacificBridge Fulfillment - Japan", + "inStockQuantity": 1417 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_south_africa_transafrica_fulfillment_park.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_south_africa_transafrica_fulfillment_park.json new file mode 100644 index 00000000..86a13ad3 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_south_africa_transafrica_fulfillment_park.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-starlight-8gb-512gb", + "sku": "laptop-apple-macbook-air-15-starlight-8gb-512gb", + "productName": "Apple MacBook Air 15 Starlight RAM 8Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-south-africa-transafrica-fulfillment-park", + "fulfillmentCenterName": "TransAfrica Fulfillment Park - South Africa", + "inStockQuantity": 988 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_sweden_nordicstream_fulfillment.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_sweden_nordicstream_fulfillment.json new file mode 100644 index 00000000..4fd30c79 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_sweden_nordicstream_fulfillment.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-starlight-8gb-512gb", + "sku": "laptop-apple-macbook-air-15-starlight-8gb-512gb", + "productName": "Apple MacBook Air 15 Starlight RAM 8Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-sweden-nordicstream-fulfillment", + "fulfillmentCenterName": "NordicStream Fulfillment - Sweden", + "inStockQuantity": 2682 +} diff --git a/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_uae_gulflink_logistics_center.json b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_uae_gulflink_logistics_center.json new file mode 100644 index 00000000..139e77f3 --- /dev/null +++ b/dataset/data/product_inventories/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb_ffc_uae_gulflink_logistics_center.json @@ -0,0 +1,8 @@ +{ + "productId": "laptop-apple-macbook-air-15-starlight-8gb-512gb", + "sku": "laptop-apple-macbook-air-15-starlight-8gb-512gb", + "productName": "Apple MacBook Air 15 Starlight RAM 8Gb SSD 512Gb", + "fulfillmentCenterId": "ffc-uae-gulflink-logistics-center", + "fulfillmentCenterName": "GulfLink Logistics Center - UAE", + "inStockQuantity": 3089 +} diff --git a/dataset/data/products/laptops/laptop_acer_predator_helios_neo_16_ai.json b/dataset/data/products/laptops/laptop_acer_predator_helios_neo_16_ai.json new file mode 100644 index 00000000..86ed0a6d --- /dev/null +++ b/dataset/data/products/laptops/laptop_acer_predator_helios_neo_16_ai.json @@ -0,0 +1,164 @@ +{ + "id": "laptop-acer-predator-helios-neo-16-ai", + "code": "laptop-acer-predator-helios-neo-16-ai", + "catalogId": "catalog-acme-electronics", + "categoryId": "category-acme-electronics-laptops", + "name": "Acer Predator Helios Neo 16 AI", + "vendor": "Acer", + "productType": "Physical", + "seoObjectType": "Product", + "seoInfos": [ + { + "id": "seo-info-laptop-acer-predator-helios-neo-16-ai", + "isActive": true, + "languageCode": "en-US", + "pageTitle": "Acer Predator Helios Neo 16 AI", + "semanticUrl": "acer-predator-helios-neo-16-ai", + "storeId": "store-acme" + } + ], + "properties": [ + { + "id": "catalog-property-general-brand", + "name": "Brand", + "valueType": "ShortText", + "values": [ + { + "value": "Acer" + } + ] + }, + { + "id": "catalog-property-general-release-year", + "name": "ReleaseYear", + "valueType": "ShortText", + "values": [ + { + "value": 2025 + } + ] + }, + { + "id": "catalog-property-general-color", + "name": "Color", + "valueType": "ShortText", + "values": [ + { + "value": "Black" + } + ] + }, + { + "id": "catalog-property-electronics-display-size", + "name": "DisplaySize", + "valueType": "Measure", + "measureId": "measure-display-size", + "values": [ + { + "value": 16, + "unitOfMeasureId": "measure-unit-display-size-inch" + } + ] + }, + { + "id": "catalog-property-electronics-display-resolution", + "name": "DisplayResolution", + "valueType": "ShortText", + "values": [ + { + "value": "2560x1600" + } + ] + }, + { + "id": "catalog-property-electronics-display-panel-technology", + "name": "DisplayPanelTechnology", + "valueType": "ShortText", + "values": [ + { + "value": "IPS" + } + ] + }, + { + "id": "catalog-property-electronics-display-brightness", + "name": "DisplayBrightness", + "valueType": "Measure", + "measureId": "measure-display-brightness", + "values": [ + { + "value": 500, + "unitOfMeasureId": "measure-unit-display-brightness-nit" + } + ] + }, + { + "id": "catalog-property-electronics-display-refresh-rate", + "name": "DisplayRefreshRate", + "valueType": "Measure", + "measureId": "measure-display-refresh-rate", + "values": [ + { + "value": 240, + "unitOfMeasureId": "measure-unit-refresh-rate-hertz" + } + ] + }, + { + "id": "catalog-property-electronics-processor-model", + "name": "ProcessorModel", + "valueType": "ShortText", + "values": [ + { + "value": "Intel Core Ultra 9 275HX" + } + ] + }, + { + "id": "catalog-property-electronics-processor-total-cores", + "name": "ProcessorTotalCores", + "valueType": "Integer", + "values": [ + { + "value": 24 + } + ] + }, + { + "id": "catalog-property-electronics-memory-installed-size", + "name": "MemoryInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 32, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-electronics-storage-installed-size", + "name": "StorageInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 2, + "unitOfMeasureId": "measure-unit-memory-tb" + } + ] + }, + { + "id": "catalog-property-general-weight", + "name": "Weight", + "valueType": "Measure", + "measureId": "measure-weight", + "values": [ + { + "value": 2.7, + "unitOfMeasureId": "measure-unit-weight-kg" + } + ] + } + ] +} diff --git a/dataset/data/products/laptops/laptop_apple_macbook_air_15_midnight_16gb_1tb.json b/dataset/data/products/laptops/laptop_apple_macbook_air_15_midnight_16gb_1tb.json new file mode 100644 index 00000000..054171df --- /dev/null +++ b/dataset/data/products/laptops/laptop_apple_macbook_air_15_midnight_16gb_1tb.json @@ -0,0 +1,165 @@ +{ + "id": "laptop-apple-macbook-air-15-midnight-16gb-1tb", + "code": "laptop-apple-macbook-air-15-midnight-16gb-1tb", + "catalogId": "catalog-acme-electronics", + "categoryId": "category-acme-electronics-laptops", + "mainProductId": "laptop-apple-macbook-air-15-sky-blue-16gb-1tb", + "name": "Apple MacBook Air 15 Midnight RAM 16Gb SSD 1Tb", + "vendor": "Apple", + "productType": "Physical", + "seoObjectType": "Product", + "seoInfos": [ + { + "id": "seo-info-laptop-apple-macbook-air-15-midnight-16gb-1tb", + "isActive": true, + "languageCode": "en-US", + "pageTitle": "Apple MacBook Air 15 Midnight RAM 16Gb SSD 1Tb", + "semanticUrl": "apple-macbook-air-15-midnight-16gb-1Tb", + "storeId": "store-acme" + } + ], + "properties": [ + { + "id": "catalog-property-general-brand", + "name": "Brand", + "valueType": "ShortText", + "values": [ + { + "value": "Apple" + } + ] + }, + { + "id": "catalog-property-general-release-year", + "name": "ReleaseYear", + "valueType": "ShortText", + "values": [ + { + "value": 2025 + } + ] + }, + { + "id": "catalog-property-general-color", + "name": "Color", + "valueType": "ShortText", + "values": [ + { + "value": "Midnight" + } + ] + }, + { + "id": "catalog-property-electronics-display-size", + "name": "DisplaySize", + "valueType": "Measure", + "measureId": "measure-display-size", + "values": [ + { + "value": 15.3, + "unitOfMeasureId": "measure-unit-display-size-inch" + } + ] + }, + { + "id": "catalog-property-electronics-display-resolution", + "name": "DisplayResolution", + "valueType": "ShortText", + "values": [ + { + "value": "2880x1864" + } + ] + }, + { + "id": "catalog-property-electronics-display-panel-technology", + "name": "DisplayPanelTechnology", + "valueType": "ShortText", + "values": [ + { + "value": "IPS" + } + ] + }, + { + "id": "catalog-property-electronics-display-brightness", + "name": "DisplayBrightness", + "valueType": "Measure", + "measureId": "measure-display-brightness", + "values": [ + { + "value": 500, + "unitOfMeasureId": "measure-unit-display-brightness-nit" + } + ] + }, + { + "id": "catalog-property-electronics-display-refresh-rate", + "name": "DisplayRefreshRate", + "valueType": "Measure", + "measureId": "measure-display-refresh-rate", + "values": [ + { + "value": 60, + "unitOfMeasureId": "measure-unit-refresh-rate-hertz" + } + ] + }, + { + "id": "catalog-property-electronics-processor-model", + "name": "ProcessorModel", + "valueType": "ShortText", + "values": [ + { + "value": "Apple M4 10-core" + } + ] + }, + { + "id": "catalog-property-electronics-processor-total-cores", + "name": "ProcessorTotalCores", + "valueType": "Integer", + "values": [ + { + "value": 10 + } + ] + }, + { + "id": "catalog-property-electronics-memory-installed-size", + "name": "MemoryInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 16, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-electronics-storage-installed-size", + "name": "StorageInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 1, + "unitOfMeasureId": "measure-unit-memory-tb" + } + ] + }, + { + "id": "catalog-property-general-weight", + "name": "Weight", + "valueType": "Measure", + "measureId": "measure-weight", + "values": [ + { + "value": 1.51, + "unitOfMeasureId": "measure-unit-weight-kg" + } + ] + } + ] +} diff --git a/dataset/data/products/laptops/laptop_apple_macbook_air_15_midnight_16gb_512gb.json b/dataset/data/products/laptops/laptop_apple_macbook_air_15_midnight_16gb_512gb.json new file mode 100644 index 00000000..f701b59f --- /dev/null +++ b/dataset/data/products/laptops/laptop_apple_macbook_air_15_midnight_16gb_512gb.json @@ -0,0 +1,165 @@ +{ + "id": "laptop-apple-macbook-air-15-midnight-16gb-512gb", + "code": "laptop-apple-macbook-air-15-midnight-16gb-512gb", + "catalogId": "catalog-acme-electronics", + "categoryId": "category-acme-electronics-laptops", + "mainProductId": "laptop-apple-macbook-air-15-sky-blue-16gb-512gb", + "name": "Apple MacBook Air 15 Midnight RAM 16Gb SSD 512Gb", + "vendor": "Apple", + "productType": "Physical", + "seoObjectType": "Product", + "seoInfos": [ + { + "id": "seo-info-laptop-apple-macbook-air-15-midnight-16gb-512gb", + "isActive": true, + "languageCode": "en-US", + "pageTitle": "Apple MacBook Air 15 Midnight RAM 16Gb SSD 16Gb", + "semanticUrl": "apple-macbook-air-15-midnight-16gb-512gb", + "storeId": "store-acme" + } + ], + "properties": [ + { + "id": "catalog-property-general-brand", + "name": "Brand", + "valueType": "ShortText", + "values": [ + { + "value": "Apple" + } + ] + }, + { + "id": "catalog-property-general-release-year", + "name": "ReleaseYear", + "valueType": "ShortText", + "values": [ + { + "value": 2025 + } + ] + }, + { + "id": "catalog-property-general-color", + "name": "Color", + "valueType": "ShortText", + "values": [ + { + "value": "Midnight" + } + ] + }, + { + "id": "catalog-property-electronics-display-size", + "name": "DisplaySize", + "valueType": "Measure", + "measureId": "measure-display-size", + "values": [ + { + "value": 15.3, + "unitOfMeasureId": "measure-unit-display-size-inch" + } + ] + }, + { + "id": "catalog-property-electronics-display-resolution", + "name": "DisplayResolution", + "valueType": "ShortText", + "values": [ + { + "value": "2880x1864" + } + ] + }, + { + "id": "catalog-property-electronics-display-panel-technology", + "name": "DisplayPanelTechnology", + "valueType": "ShortText", + "values": [ + { + "value": "IPS" + } + ] + }, + { + "id": "catalog-property-electronics-display-brightness", + "name": "DisplayBrightness", + "valueType": "Measure", + "measureId": "measure-display-brightness", + "values": [ + { + "value": 500, + "unitOfMeasureId": "measure-unit-display-brightness-nit" + } + ] + }, + { + "id": "catalog-property-electronics-display-refresh-rate", + "name": "DisplayRefreshRate", + "valueType": "Measure", + "measureId": "measure-display-refresh-rate", + "values": [ + { + "value": 60, + "unitOfMeasureId": "measure-unit-refresh-rate-hertz" + } + ] + }, + { + "id": "catalog-property-electronics-processor-model", + "name": "ProcessorModel", + "valueType": "ShortText", + "values": [ + { + "value": "Apple M4 10-core" + } + ] + }, + { + "id": "catalog-property-electronics-processor-total-cores", + "name": "ProcessorTotalCores", + "valueType": "Integer", + "values": [ + { + "value": 10 + } + ] + }, + { + "id": "catalog-property-electronics-memory-installed-size", + "name": "MemoryInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 16, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-electronics-storage-installed-size", + "name": "StorageInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 512, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-general-weight", + "name": "Weight", + "valueType": "Measure", + "measureId": "measure-weight", + "values": [ + { + "value": 1.51, + "unitOfMeasureId": "measure-unit-weight-kg" + } + ] + } + ] +} diff --git a/dataset/data/products/laptops/laptop_apple_macbook_air_15_midnight_8gb_512gb.json b/dataset/data/products/laptops/laptop_apple_macbook_air_15_midnight_8gb_512gb.json new file mode 100644 index 00000000..c98d1d0c --- /dev/null +++ b/dataset/data/products/laptops/laptop_apple_macbook_air_15_midnight_8gb_512gb.json @@ -0,0 +1,165 @@ +{ + "id": "laptop-apple-macbook-air-15-midnight-8gb-512gb", + "code": "laptop-apple-macbook-air-15-midnight-8gb-512gb", + "catalogId": "catalog-acme-electronics", + "categoryId": "category-acme-electronics-laptops", + "mainProductId": "laptop-apple-macbook-air-15-sky-blue-8gb-512gb", + "name": "Apple MacBook Air 15 Midnight RAM 8Gb SSD 512Gb", + "vendor": "Apple", + "productType": "Physical", + "seoObjectType": "Product", + "seoInfos": [ + { + "id": "seo-info-laptop-apple-macbook-air-15-midnight-8gb-512gb", + "isActive": true, + "languageCode": "en-US", + "pageTitle": "Apple MacBook Air 15 Midnight RAM 8Gb SSD 16Gb", + "semanticUrl": "apple-macbook-air-15-midnight-8gb-512gb", + "storeId": "store-acme" + } + ], + "properties": [ + { + "id": "catalog-property-general-brand", + "name": "Brand", + "valueType": "ShortText", + "values": [ + { + "value": "Apple" + } + ] + }, + { + "id": "catalog-property-general-release-year", + "name": "ReleaseYear", + "valueType": "ShortText", + "values": [ + { + "value": 2025 + } + ] + }, + { + "id": "catalog-property-general-color", + "name": "Color", + "valueType": "ShortText", + "values": [ + { + "value": "Midnight" + } + ] + }, + { + "id": "catalog-property-electronics-display-size", + "name": "DisplaySize", + "valueType": "Measure", + "measureId": "measure-display-size", + "values": [ + { + "value": 15.3, + "unitOfMeasureId": "measure-unit-display-size-inch" + } + ] + }, + { + "id": "catalog-property-electronics-display-resolution", + "name": "DisplayResolution", + "valueType": "ShortText", + "values": [ + { + "value": "2880x1864" + } + ] + }, + { + "id": "catalog-property-electronics-display-panel-technology", + "name": "DisplayPanelTechnology", + "valueType": "ShortText", + "values": [ + { + "value": "IPS" + } + ] + }, + { + "id": "catalog-property-electronics-display-brightness", + "name": "DisplayBrightness", + "valueType": "Measure", + "measureId": "measure-display-brightness", + "values": [ + { + "value": 500, + "unitOfMeasureId": "measure-unit-display-brightness-nit" + } + ] + }, + { + "id": "catalog-property-electronics-display-refresh-rate", + "name": "DisplayRefreshRate", + "valueType": "Measure", + "measureId": "measure-display-refresh-rate", + "values": [ + { + "value": 60, + "unitOfMeasureId": "measure-unit-refresh-rate-hertz" + } + ] + }, + { + "id": "catalog-property-electronics-processor-model", + "name": "ProcessorModel", + "valueType": "ShortText", + "values": [ + { + "value": "Apple M4 10-core" + } + ] + }, + { + "id": "catalog-property-electronics-processor-total-cores", + "name": "ProcessorTotalCores", + "valueType": "Integer", + "values": [ + { + "value": 10 + } + ] + }, + { + "id": "catalog-property-electronics-memory-installed-size", + "name": "MemoryInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 8, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-electronics-storage-installed-size", + "name": "StorageInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 512, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-general-weight", + "name": "Weight", + "valueType": "Measure", + "measureId": "measure-weight", + "values": [ + { + "value": 1.51, + "unitOfMeasureId": "measure-unit-weight-kg" + } + ] + } + ] +} diff --git a/dataset/data/products/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb.json b/dataset/data/products/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb.json new file mode 100644 index 00000000..5167d96d --- /dev/null +++ b/dataset/data/products/laptops/laptop_apple_macbook_air_15_silver_16gb_1tb.json @@ -0,0 +1,165 @@ +{ + "id": "laptop-apple-macbook-air-15-silver-16gb-1tb", + "code": "laptop-apple-macbook-air-15-silver-16gb-1tb", + "catalogId": "catalog-acme-electronics", + "categoryId": "category-acme-electronics-laptops", + "mainProductId": "laptop-apple-macbook-air-15-sky-blue-16gb-1tb", + "name": "Apple MacBook Air 15 Silver RAM 16Gb SSD 1Tb", + "vendor": "Apple", + "productType": "Physical", + "seoObjectType": "Product", + "seoInfos": [ + { + "id": "seo-info-laptop-apple-macbook-air-15-silver-16gb-1tb", + "isActive": true, + "languageCode": "en-US", + "pageTitle": "Apple MacBook Air 15 Silver RAM 16Gb SSD 1Tb", + "semanticUrl": "apple-macbook-air-15-silver-16gb-1tb", + "storeId": "store-acme" + } + ], + "properties": [ + { + "id": "catalog-property-general-brand", + "name": "Brand", + "valueType": "ShortText", + "values": [ + { + "value": "Apple" + } + ] + }, + { + "id": "catalog-property-general-release-year", + "name": "ReleaseYear", + "valueType": "ShortText", + "values": [ + { + "value": 2025 + } + ] + }, + { + "id": "catalog-property-general-color", + "name": "Color", + "valueType": "ShortText", + "values": [ + { + "value": "Silver" + } + ] + }, + { + "id": "catalog-property-electronics-display-size", + "name": "DisplaySize", + "valueType": "Measure", + "measureId": "measure-display-size", + "values": [ + { + "value": 15.3, + "unitOfMeasureId": "measure-unit-display-size-inch" + } + ] + }, + { + "id": "catalog-property-electronics-display-resolution", + "name": "DisplayResolution", + "valueType": "ShortText", + "values": [ + { + "value": "2880x1864" + } + ] + }, + { + "id": "catalog-property-electronics-display-panel-technology", + "name": "DisplayPanelTechnology", + "valueType": "ShortText", + "values": [ + { + "value": "IPS" + } + ] + }, + { + "id": "catalog-property-electronics-display-brightness", + "name": "DisplayBrightness", + "valueType": "Measure", + "measureId": "measure-display-brightness", + "values": [ + { + "value": 500, + "unitOfMeasureId": "measure-unit-display-brightness-nit" + } + ] + }, + { + "id": "catalog-property-electronics-display-refresh-rate", + "name": "DisplayRefreshRate", + "valueType": "Measure", + "measureId": "measure-display-refresh-rate", + "values": [ + { + "value": 60, + "unitOfMeasureId": "measure-unit-refresh-rate-hertz" + } + ] + }, + { + "id": "catalog-property-electronics-processor-model", + "name": "ProcessorModel", + "valueType": "ShortText", + "values": [ + { + "value": "Apple M4 10-core" + } + ] + }, + { + "id": "catalog-property-electronics-processor-total-cores", + "name": "ProcessorTotalCores", + "valueType": "Integer", + "values": [ + { + "value": 10 + } + ] + }, + { + "id": "catalog-property-electronics-memory-installed-size", + "name": "MemoryInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 16, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-electronics-storage-installed-size", + "name": "StorageInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 1, + "unitOfMeasureId": "measure-unit-memory-tb" + } + ] + }, + { + "id": "catalog-property-general-weight", + "name": "Weight", + "valueType": "Measure", + "measureId": "measure-weight", + "values": [ + { + "value": 1.51, + "unitOfMeasureId": "measure-unit-weight-kg" + } + ] + } + ] +} diff --git a/dataset/data/products/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb.json b/dataset/data/products/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb.json new file mode 100644 index 00000000..64a5253a --- /dev/null +++ b/dataset/data/products/laptops/laptop_apple_macbook_air_15_silver_16gb_512gb.json @@ -0,0 +1,165 @@ +{ + "id": "laptop-apple-macbook-air-15-silver-16gb-512gb", + "code": "laptop-apple-macbook-air-15-silver-16gb-512gb", + "catalogId": "catalog-acme-electronics", + "categoryId": "category-acme-electronics-laptops", + "mainProductId": "laptop-apple-macbook-air-15-sky-blue-16gb-512gb", + "name": "Apple MacBook Air 15 Silver RAM 16Gb SSD 512Gb", + "vendor": "Apple", + "productType": "Physical", + "seoObjectType": "Product", + "seoInfos": [ + { + "id": "seo-info-laptop-apple-macbook-air-15-silver-16gb-512gb", + "isActive": true, + "languageCode": "en-US", + "pageTitle": "Apple MacBook Air 15 Silver RAM 16Gb SSD 16Gb", + "semanticUrl": "apple-macbook-air-15-silver-16gb-512gb", + "storeId": "store-acme" + } + ], + "properties": [ + { + "id": "catalog-property-general-brand", + "name": "Brand", + "valueType": "ShortText", + "values": [ + { + "value": "Apple" + } + ] + }, + { + "id": "catalog-property-general-release-year", + "name": "ReleaseYear", + "valueType": "ShortText", + "values": [ + { + "value": 2025 + } + ] + }, + { + "id": "catalog-property-general-color", + "name": "Color", + "valueType": "ShortText", + "values": [ + { + "value": "Silver" + } + ] + }, + { + "id": "catalog-property-electronics-display-size", + "name": "DisplaySize", + "valueType": "Measure", + "measureId": "measure-display-size", + "values": [ + { + "value": 15.3, + "unitOfMeasureId": "measure-unit-display-size-inch" + } + ] + }, + { + "id": "catalog-property-electronics-display-resolution", + "name": "DisplayResolution", + "valueType": "ShortText", + "values": [ + { + "value": "2880x1864" + } + ] + }, + { + "id": "catalog-property-electronics-display-panel-technology", + "name": "DisplayPanelTechnology", + "valueType": "ShortText", + "values": [ + { + "value": "IPS" + } + ] + }, + { + "id": "catalog-property-electronics-display-brightness", + "name": "DisplayBrightness", + "valueType": "Measure", + "measureId": "measure-display-brightness", + "values": [ + { + "value": 500, + "unitOfMeasureId": "measure-unit-display-brightness-nit" + } + ] + }, + { + "id": "catalog-property-electronics-display-refresh-rate", + "name": "DisplayRefreshRate", + "valueType": "Measure", + "measureId": "measure-display-refresh-rate", + "values": [ + { + "value": 60, + "unitOfMeasureId": "measure-unit-refresh-rate-hertz" + } + ] + }, + { + "id": "catalog-property-electronics-processor-model", + "name": "ProcessorModel", + "valueType": "ShortText", + "values": [ + { + "value": "Apple M4 10-core" + } + ] + }, + { + "id": "catalog-property-electronics-processor-total-cores", + "name": "ProcessorTotalCores", + "valueType": "Integer", + "values": [ + { + "value": 10 + } + ] + }, + { + "id": "catalog-property-electronics-memory-installed-size", + "name": "MemoryInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 16, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-electronics-storage-installed-size", + "name": "StorageInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 512, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-general-weight", + "name": "Weight", + "valueType": "Measure", + "measureId": "measure-weight", + "values": [ + { + "value": 1.51, + "unitOfMeasureId": "measure-unit-weight-kg" + } + ] + } + ] +} diff --git a/dataset/data/products/laptops/laptop_apple_macbook_air_15_silver_8gb_512gb.json b/dataset/data/products/laptops/laptop_apple_macbook_air_15_silver_8gb_512gb.json new file mode 100644 index 00000000..5e48229f --- /dev/null +++ b/dataset/data/products/laptops/laptop_apple_macbook_air_15_silver_8gb_512gb.json @@ -0,0 +1,165 @@ +{ + "id": "laptop-apple-macbook-air-15-silver-8gb-512gb", + "code": "laptop-apple-macbook-air-15-silver-8gb-512gb", + "catalogId": "catalog-acme-electronics", + "categoryId": "category-acme-electronics-laptops", + "mainProductId": "laptop-apple-macbook-air-15-sky-blue-8gb-512gb", + "name": "Apple MacBook Air 15 Silver RAM 8Gb SSD 512Gb", + "vendor": "Apple", + "productType": "Physical", + "seoObjectType": "Product", + "seoInfos": [ + { + "id": "seo-info-laptop-apple-macbook-air-15-silver-8gb-512gb", + "isActive": true, + "languageCode": "en-US", + "pageTitle": "Apple MacBook Air 15 Silver RAM 8Gb SSD 16Gb", + "semanticUrl": "apple-macbook-air-15-silver-8gb-512gb", + "storeId": "store-acme" + } + ], + "properties": [ + { + "id": "catalog-property-general-brand", + "name": "Brand", + "valueType": "ShortText", + "values": [ + { + "value": "Apple" + } + ] + }, + { + "id": "catalog-property-general-release-year", + "name": "ReleaseYear", + "valueType": "ShortText", + "values": [ + { + "value": 2025 + } + ] + }, + { + "id": "catalog-property-general-color", + "name": "Color", + "valueType": "ShortText", + "values": [ + { + "value": "Silver" + } + ] + }, + { + "id": "catalog-property-electronics-display-size", + "name": "DisplaySize", + "valueType": "Measure", + "measureId": "measure-display-size", + "values": [ + { + "value": 15.3, + "unitOfMeasureId": "measure-unit-display-size-inch" + } + ] + }, + { + "id": "catalog-property-electronics-display-resolution", + "name": "DisplayResolution", + "valueType": "ShortText", + "values": [ + { + "value": "2880x1864" + } + ] + }, + { + "id": "catalog-property-electronics-display-panel-technology", + "name": "DisplayPanelTechnology", + "valueType": "ShortText", + "values": [ + { + "value": "IPS" + } + ] + }, + { + "id": "catalog-property-electronics-display-brightness", + "name": "DisplayBrightness", + "valueType": "Measure", + "measureId": "measure-display-brightness", + "values": [ + { + "value": 500, + "unitOfMeasureId": "measure-unit-display-brightness-nit" + } + ] + }, + { + "id": "catalog-property-electronics-display-refresh-rate", + "name": "DisplayRefreshRate", + "valueType": "Measure", + "measureId": "measure-display-refresh-rate", + "values": [ + { + "value": 60, + "unitOfMeasureId": "measure-unit-refresh-rate-hertz" + } + ] + }, + { + "id": "catalog-property-electronics-processor-model", + "name": "ProcessorModel", + "valueType": "ShortText", + "values": [ + { + "value": "Apple M4 10-core" + } + ] + }, + { + "id": "catalog-property-electronics-processor-total-cores", + "name": "ProcessorTotalCores", + "valueType": "Integer", + "values": [ + { + "value": 10 + } + ] + }, + { + "id": "catalog-property-electronics-memory-installed-size", + "name": "MemoryInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 8, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-electronics-storage-installed-size", + "name": "StorageInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 512, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-general-weight", + "name": "Weight", + "valueType": "Measure", + "measureId": "measure-weight", + "values": [ + { + "value": 1.51, + "unitOfMeasureId": "measure-unit-weight-kg" + } + ] + } + ] +} diff --git a/dataset/data/products/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_1tb.json b/dataset/data/products/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_1tb.json new file mode 100644 index 00000000..71dc3fef --- /dev/null +++ b/dataset/data/products/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_1tb.json @@ -0,0 +1,164 @@ +{ + "id": "laptop-apple-macbook-air-15-sky-blue-16gb-1tb", + "code": "laptop-apple-macbook-air-15-sky-blue-16gb-1tb", + "catalogId": "catalog-acme-electronics", + "categoryId": "category-acme-electronics-laptops", + "name": "Apple MacBook Air 15 Sky Blue RAM 16Gb SSD 1Tb", + "vendor": "Apple", + "productType": "Physical", + "seoObjectType": "Product", + "seoInfos": [ + { + "id": "seo-info-laptop-apple-macbook-air-15-sky-blue-16gb-1tb", + "isActive": true, + "languageCode": "en-US", + "pageTitle": "Apple MacBook Air 15 Sky Blue RAM 16Gb SSD 1Tb", + "semanticUrl": "apple-macbook-air-15-sky-blue-16gb-1tb", + "storeId": "store-acme" + } + ], + "properties": [ + { + "id": "catalog-property-general-brand", + "name": "Brand", + "valueType": "ShortText", + "values": [ + { + "value": "Apple" + } + ] + }, + { + "id": "catalog-property-general-release-year", + "name": "ReleaseYear", + "valueType": "ShortText", + "values": [ + { + "value": 2025 + } + ] + }, + { + "id": "catalog-property-general-color", + "name": "Color", + "valueType": "ShortText", + "values": [ + { + "value": "Sky Blue" + } + ] + }, + { + "id": "catalog-property-electronics-display-size", + "name": "DisplaySize", + "valueType": "Measure", + "measureId": "measure-display-size", + "values": [ + { + "value": 15.3, + "unitOfMeasureId": "measure-unit-display-size-inch" + } + ] + }, + { + "id": "catalog-property-electronics-display-resolution", + "name": "DisplayResolution", + "valueType": "ShortText", + "values": [ + { + "value": "2880x1864" + } + ] + }, + { + "id": "catalog-property-electronics-display-panel-technology", + "name": "DisplayPanelTechnology", + "valueType": "ShortText", + "values": [ + { + "value": "IPS" + } + ] + }, + { + "id": "catalog-property-electronics-display-brightness", + "name": "DisplayBrightness", + "valueType": "Measure", + "measureId": "measure-display-brightness", + "values": [ + { + "value": 500, + "unitOfMeasureId": "measure-unit-display-brightness-nit" + } + ] + }, + { + "id": "catalog-property-electronics-display-refresh-rate", + "name": "DisplayRefreshRate", + "valueType": "Measure", + "measureId": "measure-display-refresh-rate", + "values": [ + { + "value": 60, + "unitOfMeasureId": "measure-unit-refresh-rate-hertz" + } + ] + }, + { + "id": "catalog-property-electronics-processor-model", + "name": "ProcessorModel", + "valueType": "ShortText", + "values": [ + { + "value": "Apple M4 10-core" + } + ] + }, + { + "id": "catalog-property-electronics-processor-total-cores", + "name": "ProcessorTotalCores", + "valueType": "Integer", + "values": [ + { + "value": 10 + } + ] + }, + { + "id": "catalog-property-electronics-memory-installed-size", + "name": "MemoryInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 16, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-electronics-storage-installed-size", + "name": "StorageInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 1, + "unitOfMeasureId": "measure-unit-memory-tb" + } + ] + }, + { + "id": "catalog-property-general-weight", + "name": "Weight", + "valueType": "Measure", + "measureId": "measure-weight", + "values": [ + { + "value": 1.51, + "unitOfMeasureId": "measure-unit-weight-kg" + } + ] + } + ] +} diff --git a/dataset/data/products/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_512gb.json b/dataset/data/products/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_512gb.json new file mode 100644 index 00000000..1ef27db6 --- /dev/null +++ b/dataset/data/products/laptops/laptop_apple_macbook_air_15_sky_blue_16gb_512gb.json @@ -0,0 +1,164 @@ +{ + "id": "laptop-apple-macbook-air-15-sky-blue-16gb-512gb", + "code": "laptop-apple-macbook-air-15-sky-blue-16gb-512gb", + "catalogId": "catalog-acme-electronics", + "categoryId": "category-acme-electronics-laptops", + "name": "Apple MacBook Air 15 Sky Blue RAM 16Gb SSD 512Gb", + "vendor": "Apple", + "productType": "Physical", + "seoObjectType": "Product", + "seoInfos": [ + { + "id": "seo-info-laptop-apple-macbook-air-15-sky-blue-16gb-512gb", + "isActive": true, + "languageCode": "en-US", + "pageTitle": "Apple MacBook Air 15 Sky Blue RAM 16Gb SSD 512Gb", + "semanticUrl": "apple-macbook-air-15-sky-blue-16gb-512gb", + "storeId": "store-acme" + } + ], + "properties": [ + { + "id": "catalog-property-general-brand", + "name": "Brand", + "valueType": "ShortText", + "values": [ + { + "value": "Apple" + } + ] + }, + { + "id": "catalog-property-general-release-year", + "name": "ReleaseYear", + "valueType": "ShortText", + "values": [ + { + "value": 2025 + } + ] + }, + { + "id": "catalog-property-general-color", + "name": "Color", + "valueType": "ShortText", + "values": [ + { + "value": "Sky Blue" + } + ] + }, + { + "id": "catalog-property-electronics-display-size", + "name": "DisplaySize", + "valueType": "Measure", + "measureId": "measure-display-size", + "values": [ + { + "value": 15.3, + "unitOfMeasureId": "measure-unit-display-size-inch" + } + ] + }, + { + "id": "catalog-property-electronics-display-resolution", + "name": "DisplayResolution", + "valueType": "ShortText", + "values": [ + { + "value": "2880x1864" + } + ] + }, + { + "id": "catalog-property-electronics-display-panel-technology", + "name": "DisplayPanelTechnology", + "valueType": "ShortText", + "values": [ + { + "value": "IPS" + } + ] + }, + { + "id": "catalog-property-electronics-display-brightness", + "name": "DisplayBrightness", + "valueType": "Measure", + "measureId": "measure-display-brightness", + "values": [ + { + "value": 500, + "unitOfMeasureId": "measure-unit-display-brightness-nit" + } + ] + }, + { + "id": "catalog-property-electronics-display-refresh-rate", + "name": "DisplayRefreshRate", + "valueType": "Measure", + "measureId": "measure-display-refresh-rate", + "values": [ + { + "value": 60, + "unitOfMeasureId": "measure-unit-refresh-rate-hertz" + } + ] + }, + { + "id": "catalog-property-electronics-processor-model", + "name": "ProcessorModel", + "valueType": "ShortText", + "values": [ + { + "value": "Apple M4 10-core" + } + ] + }, + { + "id": "catalog-property-electronics-processor-total-cores", + "name": "ProcessorTotalCores", + "valueType": "Integer", + "values": [ + { + "value": 10 + } + ] + }, + { + "id": "catalog-property-electronics-memory-installed-size", + "name": "MemoryInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 16, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-electronics-storage-installed-size", + "name": "StorageInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 512, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-general-weight", + "name": "Weight", + "valueType": "Measure", + "measureId": "measure-weight", + "values": [ + { + "value": 1.51, + "unitOfMeasureId": "measure-unit-weight-kg" + } + ] + } + ] +} diff --git a/dataset/data/products/laptops/laptop_apple_macbook_air_15_sky_blue_8gb_512gb.json b/dataset/data/products/laptops/laptop_apple_macbook_air_15_sky_blue_8gb_512gb.json new file mode 100644 index 00000000..98f441b4 --- /dev/null +++ b/dataset/data/products/laptops/laptop_apple_macbook_air_15_sky_blue_8gb_512gb.json @@ -0,0 +1,164 @@ +{ + "id": "laptop-apple-macbook-air-15-sky-blue-8gb-512gb", + "code": "laptop-apple-macbook-air-15-sky-blue-8gb-512gb", + "catalogId": "catalog-acme-electronics", + "categoryId": "category-acme-electronics-laptops", + "name": "Apple MacBook Air 15 Sky Blue RAM 8Gb SSD 512Gb", + "vendor": "Apple", + "productType": "Physical", + "seoObjectType": "Product", + "seoInfos": [ + { + "id": "seo-info-laptop-apple-macbook-air-15-sky-blue-8gb-512gb", + "isActive": true, + "languageCode": "en-US", + "pageTitle": "Apple MacBook Air 15 Sky Blue RAM 8Gb SSD 16Gb", + "semanticUrl": "apple-macbook-air-15-sky-blue-8gb-512gb", + "storeId": "store-acme" + } + ], + "properties": [ + { + "id": "catalog-property-general-brand", + "name": "Brand", + "valueType": "ShortText", + "values": [ + { + "value": "Apple" + } + ] + }, + { + "id": "catalog-property-general-release-year", + "name": "ReleaseYear", + "valueType": "ShortText", + "values": [ + { + "value": 2025 + } + ] + }, + { + "id": "catalog-property-general-color", + "name": "Color", + "valueType": "ShortText", + "values": [ + { + "value": "Sky Blue" + } + ] + }, + { + "id": "catalog-property-electronics-display-size", + "name": "DisplaySize", + "valueType": "Measure", + "measureId": "measure-display-size", + "values": [ + { + "value": 15.3, + "unitOfMeasureId": "measure-unit-display-size-inch" + } + ] + }, + { + "id": "catalog-property-electronics-display-resolution", + "name": "DisplayResolution", + "valueType": "ShortText", + "values": [ + { + "value": "2880x1864" + } + ] + }, + { + "id": "catalog-property-electronics-display-panel-technology", + "name": "DisplayPanelTechnology", + "valueType": "ShortText", + "values": [ + { + "value": "IPS" + } + ] + }, + { + "id": "catalog-property-electronics-display-brightness", + "name": "DisplayBrightness", + "valueType": "Measure", + "measureId": "measure-display-brightness", + "values": [ + { + "value": 500, + "unitOfMeasureId": "measure-unit-display-brightness-nit" + } + ] + }, + { + "id": "catalog-property-electronics-display-refresh-rate", + "name": "DisplayRefreshRate", + "valueType": "Measure", + "measureId": "measure-display-refresh-rate", + "values": [ + { + "value": 60, + "unitOfMeasureId": "measure-unit-refresh-rate-hertz" + } + ] + }, + { + "id": "catalog-property-electronics-processor-model", + "name": "ProcessorModel", + "valueType": "ShortText", + "values": [ + { + "value": "Apple M4 10-core" + } + ] + }, + { + "id": "catalog-property-electronics-processor-total-cores", + "name": "ProcessorTotalCores", + "valueType": "Integer", + "values": [ + { + "value": 10 + } + ] + }, + { + "id": "catalog-property-electronics-memory-installed-size", + "name": "MemoryInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 8, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-electronics-storage-installed-size", + "name": "StorageInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 512, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-general-weight", + "name": "Weight", + "valueType": "Measure", + "measureId": "measure-weight", + "values": [ + { + "value": 1.51, + "unitOfMeasureId": "measure-unit-weight-kg" + } + ] + } + ] +} diff --git a/dataset/data/products/laptops/laptop_apple_macbook_air_15_starlight_16gb_1tb.json b/dataset/data/products/laptops/laptop_apple_macbook_air_15_starlight_16gb_1tb.json new file mode 100644 index 00000000..4b0ae50d --- /dev/null +++ b/dataset/data/products/laptops/laptop_apple_macbook_air_15_starlight_16gb_1tb.json @@ -0,0 +1,165 @@ +{ + "id": "laptop-apple-macbook-air-15-starlight-16gb-1tb", + "code": "laptop-apple-macbook-air-15-starlight-16gb-1tb", + "catalogId": "catalog-acme-electronics", + "categoryId": "category-acme-electronics-laptops", + "mainProductId": "laptop-apple-macbook-air-15-sky-blue-16gb-1tb", + "name": "Apple MacBook Air 15 Starlight RAM 16Gb SSD 1Tb", + "vendor": "Apple", + "productType": "Physical", + "seoObjectType": "Product", + "seoInfos": [ + { + "id": "seo-info-laptop-apple-macbook-air-15-starlight-16gb-1tb", + "isActive": true, + "languageCode": "en-US", + "pageTitle": "Apple MacBook Air 15 Starlight RAM 16Gb SSD 1Tb", + "semanticUrl": "apple-macbook-air-15-starlight-16gb-1tb", + "storeId": "store-acme" + } + ], + "properties": [ + { + "id": "catalog-property-general-brand", + "name": "Brand", + "valueType": "ShortText", + "values": [ + { + "value": "Apple" + } + ] + }, + { + "id": "catalog-property-general-release-year", + "name": "ReleaseYear", + "valueType": "ShortText", + "values": [ + { + "value": 2025 + } + ] + }, + { + "id": "catalog-property-general-color", + "name": "Color", + "valueType": "ShortText", + "values": [ + { + "value": "Starlight" + } + ] + }, + { + "id": "catalog-property-electronics-display-size", + "name": "DisplaySize", + "valueType": "Measure", + "measureId": "measure-display-size", + "values": [ + { + "value": 15.3, + "unitOfMeasureId": "measure-unit-display-size-inch" + } + ] + }, + { + "id": "catalog-property-electronics-display-resolution", + "name": "DisplayResolution", + "valueType": "ShortText", + "values": [ + { + "value": "2880x1864" + } + ] + }, + { + "id": "catalog-property-electronics-display-panel-technology", + "name": "DisplayPanelTechnology", + "valueType": "ShortText", + "values": [ + { + "value": "IPS" + } + ] + }, + { + "id": "catalog-property-electronics-display-brightness", + "name": "DisplayBrightness", + "valueType": "Measure", + "measureId": "measure-display-brightness", + "values": [ + { + "value": 500, + "unitOfMeasureId": "measure-unit-display-brightness-nit" + } + ] + }, + { + "id": "catalog-property-electronics-display-refresh-rate", + "name": "DisplayRefreshRate", + "valueType": "Measure", + "measureId": "measure-display-refresh-rate", + "values": [ + { + "value": 60, + "unitOfMeasureId": "measure-unit-refresh-rate-hertz" + } + ] + }, + { + "id": "catalog-property-electronics-processor-model", + "name": "ProcessorModel", + "valueType": "ShortText", + "values": [ + { + "value": "Apple M4 10-core" + } + ] + }, + { + "id": "catalog-property-electronics-processor-total-cores", + "name": "ProcessorTotalCores", + "valueType": "Integer", + "values": [ + { + "value": 10 + } + ] + }, + { + "id": "catalog-property-electronics-memory-installed-size", + "name": "MemoryInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 16, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-electronics-storage-installed-size", + "name": "StorageInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 1, + "unitOfMeasureId": "measure-unit-memory-tb" + } + ] + }, + { + "id": "catalog-property-general-weight", + "name": "Weight", + "valueType": "Measure", + "measureId": "measure-weight", + "values": [ + { + "value": 1.51, + "unitOfMeasureId": "measure-unit-weight-kg" + } + ] + } + ] +} diff --git a/dataset/data/products/laptops/laptop_apple_macbook_air_15_starlight_16gb_512gb.json b/dataset/data/products/laptops/laptop_apple_macbook_air_15_starlight_16gb_512gb.json new file mode 100644 index 00000000..394c8662 --- /dev/null +++ b/dataset/data/products/laptops/laptop_apple_macbook_air_15_starlight_16gb_512gb.json @@ -0,0 +1,165 @@ +{ + "id": "laptop-apple-macbook-air-15-starlight-16gb-512gb", + "code": "laptop-apple-macbook-air-15-starlight-16gb-512gb", + "catalogId": "catalog-acme-electronics", + "categoryId": "category-acme-electronics-laptops", + "mainProductId": "laptop-apple-macbook-air-15-sky-blue-16gb-512gb", + "name": "Apple MacBook Air 15 Starlight RAM 16Gb SSD 512Gb", + "vendor": "Apple", + "productType": "Physical", + "seoObjectType": "Product", + "seoInfos": [ + { + "id": "seo-info-laptop-apple-macbook-air-15-starlight-16gb-512gb", + "isActive": true, + "languageCode": "en-US", + "pageTitle": "Apple MacBook Air 15 Starlight RAM 16Gb SSD 512Gb", + "semanticUrl": "apple-macbook-air-15-starlight-16gb-512gb", + "storeId": "store-acme" + } + ], + "properties": [ + { + "id": "catalog-property-general-brand", + "name": "Brand", + "valueType": "ShortText", + "values": [ + { + "value": "Apple" + } + ] + }, + { + "id": "catalog-property-general-release-year", + "name": "ReleaseYear", + "valueType": "ShortText", + "values": [ + { + "value": 2025 + } + ] + }, + { + "id": "catalog-property-general-color", + "name": "Color", + "valueType": "ShortText", + "values": [ + { + "value": "Starlight" + } + ] + }, + { + "id": "catalog-property-electronics-display-size", + "name": "DisplaySize", + "valueType": "Measure", + "measureId": "measure-display-size", + "values": [ + { + "value": 15.3, + "unitOfMeasureId": "measure-unit-display-size-inch" + } + ] + }, + { + "id": "catalog-property-electronics-display-resolution", + "name": "DisplayResolution", + "valueType": "ShortText", + "values": [ + { + "value": "2880x1864" + } + ] + }, + { + "id": "catalog-property-electronics-display-panel-technology", + "name": "DisplayPanelTechnology", + "valueType": "ShortText", + "values": [ + { + "value": "IPS" + } + ] + }, + { + "id": "catalog-property-electronics-display-brightness", + "name": "DisplayBrightness", + "valueType": "Measure", + "measureId": "measure-display-brightness", + "values": [ + { + "value": 500, + "unitOfMeasureId": "measure-unit-display-brightness-nit" + } + ] + }, + { + "id": "catalog-property-electronics-display-refresh-rate", + "name": "DisplayRefreshRate", + "valueType": "Measure", + "measureId": "measure-display-refresh-rate", + "values": [ + { + "value": 60, + "unitOfMeasureId": "measure-unit-refresh-rate-hertz" + } + ] + }, + { + "id": "catalog-property-electronics-processor-model", + "name": "ProcessorModel", + "valueType": "ShortText", + "values": [ + { + "value": "Apple M4 10-core" + } + ] + }, + { + "id": "catalog-property-electronics-processor-total-cores", + "name": "ProcessorTotalCores", + "valueType": "Integer", + "values": [ + { + "value": 10 + } + ] + }, + { + "id": "catalog-property-electronics-memory-installed-size", + "name": "MemoryInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 16, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-electronics-storage-installed-size", + "name": "StorageInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 512, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-general-weight", + "name": "Weight", + "valueType": "Measure", + "measureId": "measure-weight", + "values": [ + { + "value": 1.51, + "unitOfMeasureId": "measure-unit-weight-kg" + } + ] + } + ] +} diff --git a/dataset/data/products/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb.json b/dataset/data/products/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb.json new file mode 100644 index 00000000..4d421e68 --- /dev/null +++ b/dataset/data/products/laptops/laptop_apple_macbook_air_15_starlight_8gb_512gb.json @@ -0,0 +1,165 @@ +{ + "id": "laptop-apple-macbook-air-15-starlight-8gb-512gb", + "code": "laptop-apple-macbook-air-15-starlight-8gb-512gb", + "catalogId": "catalog-acme-electronics", + "categoryId": "category-acme-electronics-laptops", + "mainProductId": "laptop-apple-macbook-air-15-sky-blue-8gb-512gb", + "name": "Apple MacBook Air 15 Starlight RAM 8Gb SSD 512Gb", + "vendor": "Apple", + "productType": "Physical", + "seoObjectType": "Product", + "seoInfos": [ + { + "id": "seo-info-laptop-apple-macbook-air-15-starlight-8gb-512gb", + "isActive": true, + "languageCode": "en-US", + "pageTitle": "Apple MacBook Air 15 Starlight RAM 8Gb SSD 512Gb", + "semanticUrl": "apple-macbook-air-15-starlight-8gb-512gb", + "storeId": "store-acme" + } + ], + "properties": [ + { + "id": "catalog-property-general-brand", + "name": "Brand", + "valueType": "ShortText", + "values": [ + { + "value": "Apple" + } + ] + }, + { + "id": "catalog-property-general-release-year", + "name": "ReleaseYear", + "valueType": "ShortText", + "values": [ + { + "value": 2025 + } + ] + }, + { + "id": "catalog-property-general-color", + "name": "Color", + "valueType": "ShortText", + "values": [ + { + "value": "Starlight" + } + ] + }, + { + "id": "catalog-property-electronics-display-size", + "name": "DisplaySize", + "valueType": "Measure", + "measureId": "measure-display-size", + "values": [ + { + "value": 15.3, + "unitOfMeasureId": "measure-unit-display-size-inch" + } + ] + }, + { + "id": "catalog-property-electronics-display-resolution", + "name": "DisplayResolution", + "valueType": "ShortText", + "values": [ + { + "value": "2880x1864" + } + ] + }, + { + "id": "catalog-property-electronics-display-panel-technology", + "name": "DisplayPanelTechnology", + "valueType": "ShortText", + "values": [ + { + "value": "IPS" + } + ] + }, + { + "id": "catalog-property-electronics-display-brightness", + "name": "DisplayBrightness", + "valueType": "Measure", + "measureId": "measure-display-brightness", + "values": [ + { + "value": 500, + "unitOfMeasureId": "measure-unit-display-brightness-nit" + } + ] + }, + { + "id": "catalog-property-electronics-display-refresh-rate", + "name": "DisplayRefreshRate", + "valueType": "Measure", + "measureId": "measure-display-refresh-rate", + "values": [ + { + "value": 60, + "unitOfMeasureId": "measure-unit-refresh-rate-hertz" + } + ] + }, + { + "id": "catalog-property-electronics-processor-model", + "name": "ProcessorModel", + "valueType": "ShortText", + "values": [ + { + "value": "Apple M4 10-core" + } + ] + }, + { + "id": "catalog-property-electronics-processor-total-cores", + "name": "ProcessorTotalCores", + "valueType": "Integer", + "values": [ + { + "value": 10 + } + ] + }, + { + "id": "catalog-property-electronics-memory-installed-size", + "name": "MemoryInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 8, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-electronics-storage-installed-size", + "name": "StorageInstalledSize", + "valueType": "Measure", + "measureId": "measure-memory-size", + "values": [ + { + "value": 512, + "unitOfMeasureId": "measure-unit-memory-gb" + } + ] + }, + { + "id": "catalog-property-general-weight", + "name": "Weight", + "valueType": "Measure", + "measureId": "measure-weight", + "values": [ + { + "value": 1.51, + "unitOfMeasureId": "measure-unit-weight-kg" + } + ] + } + ] +} diff --git a/gql/fragments/cart_configuration_item.graphql b/gql/fragments/cart_configuration_item.graphql new file mode 100644 index 00000000..ea6b1445 --- /dev/null +++ b/gql/fragments/cart_configuration_item.graphql @@ -0,0 +1,12 @@ +fragment CartConfigurationItemFragment on CartConfigurationItemType { + id + sectionId + type + productId + name + sku + imageUrl + quantity + customText + selectedForCheckout +} diff --git a/gql/fragments/line_item.graphql b/gql/fragments/line_item.graphql index 5b7ac310..22204397 100644 --- a/gql/fragments/line_item.graphql +++ b/gql/fragments/line_item.graphql @@ -31,4 +31,7 @@ fragment LineItemFragment on LineItemType { objectType objectId } + configurationItems { + ...CartConfigurationItemFragment + } } diff --git a/gql/operations/cart_operations.py b/gql/operations/cart_operations.py index 23d01323..6e28c067 100644 --- a/gql/operations/cart_operations.py +++ b/gql/operations/cart_operations.py @@ -3,6 +3,7 @@ from gql.operations.base_operations import BaseOperations, gql from gql.types.cart import Cart from gql.types.cart_item_input import CartItemInput +from gql.types.configuration_section_input import ConfigurationSectionInput from gql.types.order import Order from gql.types.payment_input import PaymentInput from gql.types.shipment_input import ShipmentInput @@ -184,7 +185,9 @@ def add_items_to_cart( command = { "storeId": store_id, "userId": user_id, - "cartItems": [i.model_dump(by_alias=True) for i in items], + "cartItems": [ + i.model_dump(by_alias=True, exclude_none=True) for i in items + ], **({"currencyCode": currency_code} if currency_code else {}), **({"cultureName": culture_name} if culture_name else {}), } @@ -214,7 +217,9 @@ def update_cart_quantity( command = { "storeId": store_id, "userId": user_id, - "items": [i.model_dump(by_alias=True) for i in items], + "items": [ + i.model_dump(by_alias=True, exclude_none=True) for i in items + ], **({"currencyCode": currency_code} if currency_code else {}), **({"cultureName": culture_name} if culture_name else {}), } @@ -538,6 +543,46 @@ def remove_cart_item( ) return Cart.model_validate(result["data"]["removeCartItem"]) + def change_cart_configured_item( + self, + store_id: str, + user_id: str, + line_item_id: str, + configuration_sections: list[ConfigurationSectionInput], + quantity: int | None = None, + cart_id: str | None = None, + currency_code: str | None = None, + culture_name: str | None = None, + ) -> Cart: + # fmt: off + mutation = gql(""" + mutation ChangeCartConfiguredItem($command: InputChangeCartConfiguredItemType!) { + changeCartConfiguredItem(command: $command) { + ...CartFragment + } + } + """) + # fmt: on + result = self._client.execute( + self._build_query(mutation), + variables={ + "command": { + "storeId": store_id, + "userId": user_id, + "lineItemId": line_item_id, + "configurationSections": [ + s.model_dump(by_alias=True, exclude_none=True) + for s in configuration_sections + ], + **({"quantity": quantity} if quantity is not None else {}), + **({"cartId": cart_id} if cart_id else {}), + **({"currencyCode": currency_code} if currency_code else {}), + **({"cultureName": culture_name} if culture_name else {}), + } + }, + ) + return Cart.model_validate(result["data"]["changeCartConfiguredItem"]) + def delete_cart(self, cart_id: str, user_id: str) -> bool: # fmt: off mutation = gql(""" diff --git a/gql/operations/shopping_list_operations.py b/gql/operations/shopping_list_operations.py index 72606b64..2fd7c4f4 100644 --- a/gql/operations/shopping_list_operations.py +++ b/gql/operations/shopping_list_operations.py @@ -151,7 +151,9 @@ def add_items_to_shopping_list(self, list_id: str, items: list[CartItemInput]) - variables={ "command": { "listId": list_id, - "listItems": [i.model_dump(by_alias=True) for i in items], + "listItems": [ + i.model_dump(by_alias=True, exclude_none=True) for i in items + ], } }, ) diff --git a/gql/types/__init__.py b/gql/types/__init__.py index bf45f0eb..840cfcfa 100644 --- a/gql/types/__init__.py +++ b/gql/types/__init__.py @@ -6,6 +6,7 @@ from .configuration_section_input import ConfigurationSectionInput from .contact import Contact from .cart_address import CartAddress +from .cart_configuration_item import CartConfigurationItem from .cart_item_input import CartItemInput from .coupon import Coupon from .coupon_input import CouponInput @@ -41,6 +42,7 @@ __all__ = [ "Cart", "CartAddress", + "CartConfigurationItem", "ConfigurableProductOptionInput", "ConfigurationLineItem", "ConfigurationSection", diff --git a/gql/types/cart_configuration_item.py b/gql/types/cart_configuration_item.py new file mode 100644 index 00000000..3a5e7c54 --- /dev/null +++ b/gql/types/cart_configuration_item.py @@ -0,0 +1,14 @@ +from .base import GqlModel + + +class CartConfigurationItem(GqlModel): + id: str | None = None + section_id: str | None = None + type: str | None = None + product_id: str | None = None + name: str | None = None + sku: str | None = None + image_url: str | None = None + quantity: int | None = None + custom_text: str | None = None + selected_for_checkout: bool | None = None diff --git a/gql/types/cart_item_input.py b/gql/types/cart_item_input.py index 4ddc7d11..e5dbfc91 100644 --- a/gql/types/cart_item_input.py +++ b/gql/types/cart_item_input.py @@ -1,6 +1,7 @@ from pydantic import ConfigDict, Field from gql.types.base import GqlModel +from gql.types.configuration_section_input import ConfigurationSectionInput class CartItemInput(GqlModel): @@ -8,3 +9,6 @@ class CartItemInput(GqlModel): product_id: str = Field(serialization_alias="productId") quantity: int = 1 + configuration_sections: list[ConfigurationSectionInput] | None = Field( + default=None, serialization_alias="configurationSections" + ) diff --git a/gql/types/line_item.py b/gql/types/line_item.py index d780e0ee..c9fc4d1a 100644 --- a/gql/types/line_item.py +++ b/gql/types/line_item.py @@ -1,4 +1,5 @@ from gql.types.base import GqlModel +from gql.types.cart_configuration_item import CartConfigurationItem from gql.types.money import Money from gql.types.validation_error import ValidationError @@ -17,3 +18,4 @@ class LineItem(GqlModel): selected_for_checkout: bool = True is_valid: bool | None = None validation_errors: list[ValidationError] = [] + configuration_items: list[CartConfigurationItem] = [] diff --git a/page_objects/components/__init__.py b/page_objects/components/__init__.py index 10b77b89..d4943f69 100644 --- a/page_objects/components/__init__.py +++ b/page_objects/components/__init__.py @@ -21,6 +21,9 @@ from .pickup_location_section import PickupLocationSection from .pickup_locations_modal import PickupLocationsModal from .product_card import ProductCard +from .product_configuration_area import ProductConfigurationArea +from .product_configuration_option import ProductConfigurationOption +from .product_configuration_section import ProductConfigurationSection from .quantity_stepper import QuantityStepper from .remove_shopping_list_item_modal import RemoveShoppingListItemModal from .select_address_modal import SelectAddressModal @@ -55,6 +58,9 @@ "PickupLocationSection", "PickupLocationsModal", "ProductCard", + "ProductConfigurationArea", + "ProductConfigurationOption", + "ProductConfigurationSection", "RemoveShoppingListItemModal", "QuantityStepper", "SelectAddressModal", diff --git a/page_objects/components/line_item.py b/page_objects/components/line_item.py index 22abfdad..2709b134 100644 --- a/page_objects/components/line_item.py +++ b/page_objects/components/line_item.py @@ -27,3 +27,14 @@ def save_for_later_desktop_button(self) -> Locator: return self._root.locator( "[data-test-id='cart-item-actions-after-title'] [data-test-id='save-for-later-button']" ) + + @property + def components_list_toggle(self) -> Locator: + return self._root.locator("button.configuration-items__toggle") + + @property + def edit_configuration_link(self) -> Locator: + return self._root.locator(".configuration-items__edit") + + def expand_components_list(self) -> None: + self.components_list_toggle.click() diff --git a/page_objects/components/product_card.py b/page_objects/components/product_card.py index 4f2b1856..82608b57 100644 --- a/page_objects/components/product_card.py +++ b/page_objects/components/product_card.py @@ -27,6 +27,10 @@ def add_to_cart_button(self) -> AddToCartButton: def add_to_list_button(self) -> Locator: return self._root.locator("[data-test-id='add-to-list-button']") + @property + def configurations_button(self) -> Locator: + return self._root.locator("[data-test-id='product-card-configurations-button']") + @property def variations_button(self) -> Locator: return self._root.locator( diff --git a/page_objects/components/product_configuration_area.py b/page_objects/components/product_configuration_area.py new file mode 100644 index 00000000..b2e916f3 --- /dev/null +++ b/page_objects/components/product_configuration_area.py @@ -0,0 +1,26 @@ +from playwright.sync_api import Locator + +from .component import Component +from page_objects.components.product_configuration_option import ProductConfigurationOption +from page_objects.components.product_configuration_section import ProductConfigurationSection + +class ProductConfigurationArea(Component): + @property + def sections(self) -> Locator: + return self.root.locator("[data-test-id='section']") + + def find_section_by_name(self, name: str) -> ProductConfigurationSection: + return ProductConfigurationSection( + root=self.sections.filter( + has=self.root.page.locator( + "[data-test-id='section-title']", has_text=name + ) + ).first + ) + + def select_option( + self, section_name: str, option_name: str + ) -> ProductConfigurationOption: + return self.find_section_by_name(name=section_name).select_option( + name=option_name + ) diff --git a/page_objects/components/product_configuration_option.py b/page_objects/components/product_configuration_option.py new file mode 100644 index 00000000..2f3db647 --- /dev/null +++ b/page_objects/components/product_configuration_option.py @@ -0,0 +1,27 @@ +from playwright.sync_api import Locator + +from .component import Component + + +class ProductConfigurationOption(Component): + @property + def _radio(self) -> Locator: + return self.root.locator("input[type='radio']") + + @property + def name(self) -> str | None: + return self.root.locator("a").first.text_content() + + @property + def product_id(self) -> str | None: + return self._radio.get_attribute("value") + + @property + def price(self) -> Locator: + return self.root.locator(".vc-product-price__actual").first + + def is_selected(self) -> bool: + return self._radio.is_checked() + + def select(self) -> None: + self.root.locator(".vc-radio-button__container").click() diff --git a/page_objects/components/product_configuration_section.py b/page_objects/components/product_configuration_section.py new file mode 100644 index 00000000..5c772f69 --- /dev/null +++ b/page_objects/components/product_configuration_section.py @@ -0,0 +1,54 @@ +from playwright.sync_api import Locator + +from .component import Component +from .product_configuration_option import ProductConfigurationOption + +_COLLAPSED_CLASS = "vc-widget--collapsed" + + +class ProductConfigurationSection(Component): + @property + def _header(self) -> Locator: + return self.root.locator(".vc-widget__header-container") + + @property + def name(self) -> str | None: + title = self.root.locator("[data-test-id='section-title']").text_content() + return title.replace("*", "").strip() if title else title + + @property + def selected_option_name(self) -> str | None: + return self.root.locator("[data-test-id='section-subtitle']").text_content() + + @property + def is_required(self) -> bool: + return self.root.locator(".product-configuration__required").count() > 0 + + @property + def options(self) -> Locator: + return self.root.locator("[data-test-id='product-option']") + + def is_expanded(self) -> bool: + classes = self.root.get_attribute("class") or "" + return _COLLAPSED_CLASS not in classes + + def expand(self) -> None: + if not self.is_expanded(): + self._header.click() + + def collapse(self) -> None: + if self.is_expanded(): + self._header.click() + + def find_option_by_name(self, name: str) -> ProductConfigurationOption: + return ProductConfigurationOption( + root=self.options.filter( + has=self.root.page.locator("a", has_text=name) + ).first + ) + + def select_option(self, name: str) -> ProductConfigurationOption: + self.expand() + option = self.find_option_by_name(name=name) + option.select() + return option diff --git a/page_objects/pages/cart.py b/page_objects/pages/cart.py index f6b5a267..51673c40 100644 --- a/page_objects/pages/cart.py +++ b/page_objects/pages/cart.py @@ -46,5 +46,19 @@ def shipping_cost_label(self) -> Locator: def find_line_item(self, sku: str) -> LineItem: return LineItem(root=self._page.locator(f"[data-product-sku='{sku}']")) + def configured_line_items(self, product_id: str) -> Locator: + return self._page.locator( + f"[data-product-sku='Configuration-{product_id}']" + ) + + def find_configured_line_item( + self, product_id: str, contains_text: str + ) -> LineItem: + return LineItem( + root=self.configured_line_items(product_id) + .filter(has_text=contains_text) + .first + ) + def navigate(self) -> None: self._page.goto(url=self.url, wait_until="load") diff --git a/page_objects/pages/product.py b/page_objects/pages/product.py index 2ac1ef06..4bd0f2eb 100644 --- a/page_objects/pages/product.py +++ b/page_objects/pages/product.py @@ -1,6 +1,7 @@ from playwright.sync_api import Locator, Page from core.global_settings import GlobalSettings +from page_objects.components.product_configuration_area import ProductConfigurationArea from page_objects.layouts.main import MainLayout @@ -9,18 +10,46 @@ def __init__( self, global_settings: GlobalSettings, page: Page, - product_id: str, + path: str, ) -> None: super().__init__(global_settings=global_settings, page=page) - self._product_id = product_id + self._path = path @property def url(self) -> str: - return f"{self._global_settings.frontend_base_url}/product/{self._product_id}" + return f"{self._global_settings.frontend_base_url}/{self._path}" @property def add_to_list_button(self) -> Locator: return self.root.locator("[data-test-id='add-to-list-button']") + @property + def product_configuration_area(self) -> ProductConfigurationArea: + return ProductConfigurationArea( + root=self.root.locator(".product-configuration") + ) + + @property + def total_price(self) -> Locator: + return self.root.locator(".product-price__value .price__value") + + @property + def add_to_cart_button(self) -> Locator: + return self.root.locator( + ".product-price__actions button[title='Add to cart']" + ) + + @property + def update_cart_button(self) -> Locator: + return self.root.locator( + ".product-price__actions button[title='Update cart']" + ) + + def add_to_cart(self) -> None: + self.add_to_cart_button.click() + + def update_cart(self) -> None: + self.update_cart_button.click() + def navigate(self) -> None: self._page.goto(url=self.url, wait_until="load") diff --git a/pyproject.toml b/pyproject.toml index 476c81df..99bfcacc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,14 @@ dependencies = [ testpaths = ["tests"] pythonpath = ["."] addopts = "--alluredir=allure-results" +filterwarnings = [ + # SSL verification is intentionally disabled for the local test env + # (verify_ssl defaults to False), so this warning is expected noise. + "ignore::urllib3.exceptions.InsecureRequestWarning", + # The pytest cache is optional; suppress the warning when its directory + # cannot be created (e.g. restricted permissions on the repo root). + "ignore::pytest.PytestCacheWarning", +] markers = [ "graphql: GraphQL API tests", "e2e: end-to-end UI tests using Playwright (require a running frontend)", diff --git a/tests/conftest.py b/tests/conftest.py index 882f511c..5244e804 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -15,7 +15,7 @@ from gql.types.cart import Cart from gql.types.cart_item_input import CartItemInput from page_objects.browser_storage import BrowserStorage -from playwright.sync_api import Page +from playwright.sync_api import Page, expect from tests.context import Context from dataset.dataset_manager import DatasetManager @@ -139,6 +139,29 @@ def har_recorder(request: pytest.FixtureRequest) -> Generator[HARRecorder, None, ) +@pytest.fixture(autouse=True) +def _playwright_timeouts( + request: pytest.FixtureRequest, global_settings: GlobalSettings +) -> None: + """Apply a generous default timeout to Playwright actions, navigation, and + web-first assertions for e2e tests. + + Playwright's assertion/action default is only 5s, which is fine against a + local frontend but too tight against slower remote environments (e.g. the + shared demo backend used on CI), where the UI settles later. This is the + main reason e2e tests pass locally but flake on CI. + """ + if not request.node.get_closest_marker("e2e"): + return + if "page" not in request.fixturenames: + return + timeout = global_settings.playwright_timeout + page: Page = request.getfixturevalue("page") + page.set_default_timeout(timeout) + page.set_default_navigation_timeout(timeout) + expect.set_options(timeout=timeout) + + @pytest.fixture def browser_context_args( browser_context_args: dict[Any, Any], request: pytest.FixtureRequest diff --git a/tests/e2e/test_cart_configuration.py b/tests/e2e/test_cart_configuration.py new file mode 100644 index 00000000..18441c33 --- /dev/null +++ b/tests/e2e/test_cart_configuration.py @@ -0,0 +1,132 @@ +import allure +import pytest +from playwright.sync_api import Page, Response, expect + +from core.global_settings import GlobalSettings +from page_objects.pages import CartPage, ProductPage + +_PRODUCT_ID = "laptop-acer-predator-helios-neo-16-ai" +_PATH = "laptops/acer-predator-helios-neo-16-ai" +_CONFIGURED_SKU = f"Configuration-{_PRODUCT_ID}" +_MEMORY_SECTION_NAME = "Memory" +_MEMORY_OPTION_A = "Samsung DDR5-4800 8GB" +_MEMORY_OPTION_B = "Crucial DDR5-4800 16GB" + + +def _is_change_configured_mutation(response: Response) -> bool: + post = response.request.post_data + return bool( + post and "/graphql" in response.url and "ChangeCartConfiguredItem" in post + ) + + +def _add_configuration(product_page: ProductPage, memory_option: str) -> None: + """Configure the product with a memory option and add it to the cart.""" + product_page.navigate() + expect(product_page.product_configuration_area.root).to_be_visible() + product_page.product_configuration_area.select_option( + section_name=_MEMORY_SECTION_NAME, option_name=memory_option + ) + product_page.add_to_cart() + + +@pytest.mark.e2e +@pytest.mark.delete_cart_after +@allure.feature("Cart / Configurable product (E2E)") +@allure.title("Save two different configurations of the same product as separate cart line items") +def test_cart_configuration_save_multiple( + global_settings: GlobalSettings, page: Page +) -> None: + product_page = ProductPage(global_settings=global_settings, page=page, path=_PATH) + cart_page = CartPage(global_settings=global_settings, page=page) + + with allure.step(f"Configure with '{_MEMORY_OPTION_A}' and add to cart"): + _add_configuration(product_page, _MEMORY_OPTION_A) + expect(product_page.cart_quantity_label).to_have_text("1") + + with allure.step(f"Create a new configuration with '{_MEMORY_OPTION_B}' and add to cart"): + _add_configuration(product_page, _MEMORY_OPTION_B) + expect(product_page.cart_quantity_label).to_have_text("2") + + with allure.step("Open the cart and verify both configurations exist as separate line items"): + cart_page.navigate() + configured_items = cart_page.configured_line_items(_PRODUCT_ID) + expect(configured_items).to_have_count(2) + + with allure.step("Expand each components list and verify the distinct memory options"): + configured_items.nth(0).locator("button.configuration-items__toggle").click() + configured_items.nth(1).locator("button.configuration-items__toggle").click() + expect( + cart_page.find_configured_line_item(_PRODUCT_ID, _MEMORY_OPTION_A).root + ).to_be_visible() + expect( + cart_page.find_configured_line_item(_PRODUCT_ID, _MEMORY_OPTION_B).root + ).to_be_visible() + + +@pytest.mark.e2e +@pytest.mark.delete_cart_after +@allure.feature("Cart / Configurable product (E2E)") +@allure.title("Remove a configured product line item from the cart") +def test_cart_configuration_remove( + global_settings: GlobalSettings, page: Page +) -> None: + product_page = ProductPage(global_settings=global_settings, page=page, path=_PATH) + cart_page = CartPage(global_settings=global_settings, page=page) + + with allure.step("Configure a product and add it to the cart"): + _add_configuration(product_page, _MEMORY_OPTION_A) + expect(product_page.cart_quantity_label).to_have_text("1") + + with allure.step("Open the cart and locate the configured line item"): + cart_page.navigate() + line_item = cart_page.find_line_item(sku=_CONFIGURED_SKU) + expect(line_item.root).to_be_visible() + expect(line_item.remove_button).to_be_visible() + + with allure.step("Remove the configured line item and verify the cart is empty"): + line_item.remove_button.click() + expect(cart_page.line_items).to_have_count(0) + + +@pytest.mark.e2e +@pytest.mark.delete_cart_after +@allure.feature("Cart / Configurable product (E2E)") +@allure.title("Edit a configured product from the cart and see the updated configuration") +def test_cart_configuration_change_in_cart( + global_settings: GlobalSettings, page: Page +) -> None: + product_page = ProductPage(global_settings=global_settings, page=page, path=_PATH) + cart_page = CartPage(global_settings=global_settings, page=page) + + with allure.step(f"Configure with '{_MEMORY_OPTION_A}' and add to cart"): + _add_configuration(product_page, _MEMORY_OPTION_A) + expect(product_page.cart_quantity_label).to_have_text("1") + + with allure.step("Open the cart and start editing the configuration"): + cart_page.navigate() + line_item = cart_page.find_line_item(sku=_CONFIGURED_SKU) + expect(line_item.root).to_be_visible() + expect(line_item.root).to_contain_text(_MEMORY_OPTION_A) + line_item.expand_components_list() + expect(line_item.edit_configuration_link).to_be_visible() + line_item.edit_configuration_link.click() + + with allure.step(f"Change the memory option to '{_MEMORY_OPTION_B}' and update the cart"): + expect(product_page.product_configuration_area.root).to_be_visible() + product_page.product_configuration_area.select_option( + section_name=_MEMORY_SECTION_NAME, option_name=_MEMORY_OPTION_B + ) + expect(product_page.update_cart_button).to_be_enabled() + # Wait for the update mutation to complete before leaving the page; + # navigating away too early aborts it and the change is lost. + with page.expect_response(_is_change_configured_mutation): + product_page.update_cart() + + with allure.step("Verify the cart still has one configured item with the new configuration"): + cart_page.navigate() + expect(cart_page.configured_line_items(_PRODUCT_ID)).to_have_count(1) + line_item = cart_page.find_line_item(sku=_CONFIGURED_SKU) + expect(line_item.root).to_be_visible() + expect(line_item.root).to_contain_text(_MEMORY_OPTION_B) + expect(line_item.root).not_to_contain_text(_MEMORY_OPTION_A) diff --git a/tests/e2e/test_cart_merge_configuration.py b/tests/e2e/test_cart_merge_configuration.py new file mode 100644 index 00000000..2da14234 --- /dev/null +++ b/tests/e2e/test_cart_merge_configuration.py @@ -0,0 +1,152 @@ +import time +from typing import Any + +import allure +import pytest +from core.auth import AuthProvider +from core.clients import GraphQLClient +from core.global_settings import GlobalSettings +from gql.operations import CartOperations +from gql.types.cart_item_input import CartItemInput +from page_objects.pages import CartPage, ProductPage, SignInPage +from playwright.sync_api import Page, expect +from tests.context import Context + +_REGULAR_PRODUCT_ID = "smartphone-samsung-galaxy-a57-5g" +_REGULAR_QUANTITY = 2 +_CONFIGURABLE_PRODUCT_ID = "laptop-acer-predator-helios-neo-16-ai" +_CONFIGURABLE_PRODUCT_PATH = "laptops/acer-predator-helios-neo-16-ai" +_CONFIGURED_SKU = f"Configuration-{_CONFIGURABLE_PRODUCT_ID}" +_MEMORY_SECTION_NAME = "Memory" +_MEMORY_OPTION_NAME = "Samsung DDR5-4800 8GB" +_USERNAME = "acme_store_employee_1@acme.com" + + +def _user_provider(global_settings: GlobalSettings) -> AuthProvider: + provider = AuthProvider(global_settings.backend_base_url) + provider.sign_in(_USERNAME, global_settings.users_password) + return provider + + +def _delete_user_cart(global_settings: GlobalSettings, user_ctx: Context) -> None: + """Delete the registered user's cart via the user's own auth. + + Admin auth cannot read this user's storefront cart, so cleanup must run + as the user to reliably find and remove the cart between runs. + """ + provider = _user_provider(global_settings) + try: + with GraphQLClient(auth=provider, global_settings=global_settings) as client: + cart_ops = CartOperations(client) + cart = cart_ops.get_cart( + store_id=user_ctx.store_id, + user_id=user_ctx.user_id, + currency_code=user_ctx.currency_code, + culture_name=user_ctx.culture_name, + ) + if cart: + cart_ops.delete_cart(cart_id=cart.id, user_id=user_ctx.user_id) + finally: + if provider.is_authenticated: + provider.sign_out() + + +def _seed_user_cart(global_settings: GlobalSettings, user_ctx: Context) -> None: + """Seed the user's cart with a regular product and wait until it is + read-back-visible so the later storefront merge includes it.""" + provider = _user_provider(global_settings) + try: + with GraphQLClient(auth=provider, global_settings=global_settings) as client: + cart_ops = CartOperations(client) + cart_ops.add_items_to_cart( + store_id=user_ctx.store_id, + user_id=user_ctx.user_id, + items=[ + CartItemInput( + product_id=_REGULAR_PRODUCT_ID, quantity=_REGULAR_QUANTITY + ) + ], + currency_code=user_ctx.currency_code, + culture_name=user_ctx.culture_name, + ) + for _ in range(global_settings.poll_attempts): + cart = cart_ops.get_cart( + store_id=user_ctx.store_id, + user_id=user_ctx.user_id, + currency_code=user_ctx.currency_code, + culture_name=user_ctx.culture_name, + ) + items = cart.items if cart else None + if items and any(i.sku == _REGULAR_PRODUCT_ID for i in items): + break + time.sleep(global_settings.poll_interval) + finally: + if provider.is_authenticated: + provider.sign_out() + + +@pytest.mark.e2e +@allure.feature("Cart / Merge (E2E)") +@allure.title( + "Anonymous configured product merges into the signed-in cart holding a regular product" +) +def test_cart_merge_configured_and_regular( + global_settings: GlobalSettings, + page: Page, + dataset: dict[str, list[dict[str, Any]]], +) -> None: + user_ctx = Context.from_dataset(dataset, global_settings.store_id, _USERNAME) + try: + with allure.step("Ensure the registered user starts with an empty cart"): + _delete_user_cart(global_settings, user_ctx) + + with allure.step( + f"Seed the registered user's cart with regular product '{_REGULAR_PRODUCT_ID}'" + ): + _seed_user_cart(global_settings, user_ctx) + + with allure.step( + "As anonymous user, configure a product and add it to the cart" + ): + product_page = ProductPage( + global_settings=global_settings, + page=page, + path=_CONFIGURABLE_PRODUCT_PATH, + ) + product_page.navigate() + expect(product_page.product_configuration_area.root).to_be_visible() + product_page.product_configuration_area.select_option( + section_name=_MEMORY_SECTION_NAME, option_name=_MEMORY_OPTION_NAME + ) + product_page.add_to_cart() + expect(product_page.cart_quantity_label).to_have_text("1") + + with allure.step(f"Sign in as {_USERNAME}"): + sign_in_page = SignInPage(global_settings=global_settings, page=page) + sign_in_page.navigate() + sign_in_page.email_input.fill(_USERNAME) + sign_in_page.password_input.fill( + global_settings.users_password.get_secret_value() + ) + sign_in_page.sign_in_button.click() + # Sign-in redirects away from the form; wait for it so the anonymous + # cart has been merged into the user cart before we assert on it. + page.wait_for_url(lambda url: "/sign-in" not in url, timeout=15000) + + with allure.step( + "Open the cart and verify both the regular and configured products are present" + ): + cart_page = CartPage(global_settings=global_settings, page=page) + cart_page.navigate() + + # The storefront merges the carts a moment after sign-in; wait for the + # merged state (both line items present) before asserting on each one. + expect(cart_page.line_items).to_have_count(2, timeout=15000) + + regular_item = cart_page.find_line_item(sku=_REGULAR_PRODUCT_ID) + expect(regular_item.root).to_be_visible() + + configured_item = cart_page.find_line_item(sku=_CONFIGURED_SKU) + expect(configured_item.root).to_be_visible() + finally: + _delete_user_cart(global_settings, user_ctx) diff --git a/tests/e2e/test_category_configurable_product_card.py b/tests/e2e/test_category_configurable_product_card.py new file mode 100644 index 00000000..1a796634 --- /dev/null +++ b/tests/e2e/test_category_configurable_product_card.py @@ -0,0 +1,71 @@ +import re + +import allure +import pytest +from playwright.sync_api import Page, expect + +from core.global_settings import GlobalSettings +from page_objects.pages import CategoryPage, ProductPage + +_CATEGORY_PATH = "laptops" +_CONFIGURABLE_PRODUCT_CODE = "laptop-acer-predator-helios-neo-16-ai" +_CONFIGURABLE_PRODUCT_SEMANTIC_URL = "acer-predator-helios-neo-16-ai" + + +@pytest.mark.e2e +@allure.feature("Category / Configurable product (E2E)") +@allure.title("Configurable product card exposes a customize action") +def test_category_configurable_product_card( + global_settings: GlobalSettings, page: Page +) -> None: + category_page = CategoryPage( + global_settings=global_settings, page=page, path=_CATEGORY_PATH + ) + + with allure.step( + f"Navigate to category '{_CATEGORY_PATH}' and find a product card " + f"'{_CONFIGURABLE_PRODUCT_CODE}'" + ): + category_page.navigate() + product_card = category_page.scroll_to_product(sku=_CONFIGURABLE_PRODUCT_CODE) + expect(product_card.root).to_be_visible() + + with allure.step("Verify the card offers a customize action for the configurable product"): + expect(product_card.configurations_button).to_be_visible() + + +@pytest.mark.e2e +@allure.feature("Category / Configurable product (E2E)") +@allure.title("Customize action navigates to the configurable product page") +def test_category_configurable_product_navigation( + global_settings: GlobalSettings, page: Page +) -> None: + category_page = CategoryPage( + global_settings=global_settings, page=page, path=_CATEGORY_PATH + ) + + with allure.step(f"Navigate to category '{_CATEGORY_PATH}'"): + category_page.navigate() + + with allure.step( + f"Read the customize action target on card '{_CONFIGURABLE_PRODUCT_CODE}'" + ): + product_card = category_page.scroll_to_product(sku=_CONFIGURABLE_PRODUCT_CODE) + customize_action = product_card.configurations_button + expect(customize_action).to_be_visible() + # The customize action is a router link. Clicking it in the product grid + # can be swallowed before the SPA hydrates on slow CI, so follow its + # href directly — this still asserts the action targets the product page. + expect(customize_action).to_have_attribute("href", re.compile(r"\S")) + target = customize_action.get_attribute("href") + assert target is not None + assert _CONFIGURABLE_PRODUCT_SEMANTIC_URL in target + + with allure.step( + "Verify the customize action opens the configurable product page" + ): + product_page = ProductPage( + global_settings=global_settings, page=page, path=target.lstrip("/") + ) + product_page.navigate() + expect(product_page.product_configuration_area.root).to_be_visible() diff --git a/tests/e2e/test_product_configuration_add_to_cart.py b/tests/e2e/test_product_configuration_add_to_cart.py new file mode 100644 index 00000000..8d0938f7 --- /dev/null +++ b/tests/e2e/test_product_configuration_add_to_cart.py @@ -0,0 +1,73 @@ +import re + +import allure +import pytest +from playwright.sync_api import Page, expect + +from core.global_settings import GlobalSettings +from page_objects.pages import CartPage, ProductPage + +_PRODUCT_ID = "laptop-acer-predator-helios-neo-16-ai" +_PATH = f"laptops/{_PRODUCT_ID.replace('laptop-', '')}" +_CONFIGURED_SKU = f"Configuration-{_PRODUCT_ID}" +_MEMORY_SECTION_NAME = "Memory" +_STORAGE_SECTION_NAME = "Storage" +_MEMORY_OPTION_NAME = "Samsung DDR5-4800 8GB" +_STORAGE_OPTION_NAME = "Kingston FURY Renegade G5 PCIe 5.0 NVMe M.2 SSD 1024GB" + + +@pytest.mark.e2e +@pytest.mark.delete_cart_after +@allure.feature("Product / Configuration (E2E)") +@allure.title("Configure a configurable product and add it to the cart") +def test_product_configuration_add_to_cart( + global_settings: GlobalSettings, page: Page +) -> None: + product_page = ProductPage(global_settings=global_settings, page=page, path=_PATH) + + with allure.step("Open the configurable product page"): + product_page.navigate() + expect(product_page.product_configuration_area.root).to_be_visible() + + with allure.step("Verify the required configuration sections are present"): + memory_section = product_page.product_configuration_area.find_section_by_name( + name=_MEMORY_SECTION_NAME + ) + expect(memory_section.root).to_be_visible() + assert memory_section.is_required + + storage_section = product_page.product_configuration_area.find_section_by_name( + name=_STORAGE_SECTION_NAME + ) + expect(storage_section.root).to_be_visible() + assert storage_section.is_required + + with allure.step(f"Select memory option '{_MEMORY_OPTION_NAME}'"): + memory_section.select_option(name=_MEMORY_OPTION_NAME) + expect(memory_section.root).to_contain_text(_MEMORY_OPTION_NAME) + assert memory_section.selected_option_name == _MEMORY_OPTION_NAME + + with allure.step(f"Select storage option '{_STORAGE_OPTION_NAME}'"): + storage_section.select_option(name=_STORAGE_OPTION_NAME) + expect(storage_section.root).to_contain_text(_STORAGE_OPTION_NAME) + assert storage_section.selected_option_name == _STORAGE_OPTION_NAME + + with allure.step("Verify the configuration total price is shown"): + # Assert a real monetary total is rendered rather than comparing against + # the default: the default-selected options (and therefore the default + # total) are data-dependent across DB providers, so a before/after + # comparison is not reliable when the chosen options match the defaults. + expect(product_page.total_price).to_be_visible() + expect(product_page.total_price).to_have_text(re.compile(r"\d")) + + with allure.step("Add the configured product to the cart"): + expect(product_page.add_to_cart_button).to_be_enabled() + product_page.add_to_cart() + expect(product_page.cart_quantity_label).to_have_text("1") + + with allure.step("Open the cart and verify the configured line item is present"): + cart_page = CartPage(global_settings=global_settings, page=page) + cart_page.navigate() + configured_item = cart_page.find_line_item(sku=_CONFIGURED_SKU) + expect(configured_item.root).to_be_visible() + expect(cart_page.line_items).to_have_count(1) diff --git a/tests/e2e/test_wishlist_add_product.py b/tests/e2e/test_wishlist_add_product.py index 16bb57af..0b871846 100644 --- a/tests/e2e/test_wishlist_add_product.py +++ b/tests/e2e/test_wishlist_add_product.py @@ -47,7 +47,7 @@ def _open_from_list_view(page: Page, global_settings: GlobalSettings) -> str: def _open_from_pdp(page: Page, global_settings: GlobalSettings) -> str: - product_page = ProductPage(global_settings=global_settings, page=page, product_id=_VARIATION_PRODUCT_ID) + product_page = ProductPage(global_settings=global_settings, page=page, path=f"product/{_VARIATION_PRODUCT_ID}") product_page.navigate() expect(product_page.add_to_list_button).to_be_visible() product_page.add_to_list_button.click() diff --git a/tests/graphql/test_cart_configuration.py b/tests/graphql/test_cart_configuration.py new file mode 100644 index 00000000..6397832b --- /dev/null +++ b/tests/graphql/test_cart_configuration.py @@ -0,0 +1,219 @@ +import allure +import pytest +from core.clients import GraphQLClient +from gql.operations import CartOperations, ProductOperations +from gql.types import ( + CartConfigurationItem, + CartItemInput, + ConfigurableProductOptionInput, + ConfigurationSectionInput, + ProductConfiguration, +) +from tests.context import Context + +_PRODUCT_ID = "laptop-acer-predator-helios-neo-16-ai" +_CONFIGURED_SKU = f"Configuration-{_PRODUCT_ID}" +# Index used to pick a distinct option per section (each section has 3 options). +_LAST_OPTION_INDEX = 99 + + +def _selection( + config: ProductConfiguration, index: int +) -> list[ConfigurationSectionInput]: + """Build a strongly typed selection picking one option per section. + + ``index`` beyond a section's option count falls back to the last option, + which makes it easy to build two distinct selections for the same product. + """ + sections: list[ConfigurationSectionInput] = [] + for section in config.configuration_sections: + if not section.options: + continue + option = ( + section.options[index] + if index < len(section.options) + else section.options[-1] + ) + assert option.product is not None + sections.append( + ConfigurationSectionInput( + section_id=section.id, + type=section.type, + option=ConfigurableProductOptionInput( + product_id=option.product.id, + quantity=option.quantity, + ), + ) + ) + return sections + + +def _get_configuration( + product_ops: ProductOperations, ctx: Context +) -> ProductConfiguration: + config = product_ops.get_product_configuration( + configurable_product_id=_PRODUCT_ID, + store_id=ctx.store_id, + user_id=ctx.user_id, + culture_name=ctx.culture_name, + currency_code=ctx.currency_code, + ) + assert config is not None + assert len(config.configuration_sections) > 0 + return config + + +@pytest.mark.graphql +@allure.feature("Cart / Configurable product (GraphQL)") +@allure.title("Add a configured product to the cart") +def test_cart_add_configured_item( + graphql_client: GraphQLClient, ctx: Context +) -> None: + product_ops = ProductOperations(client=graphql_client) + cart_ops = CartOperations(client=graphql_client) + + with allure.step(f"Get configuration for {_PRODUCT_ID}"): + config = _get_configuration(product_ops, ctx) + selection = _selection(config, 0) + + cart = None + try: + with allure.step("Add the configured product to the cart"): + cart = cart_ops.add_items_to_cart( + store_id=ctx.store_id, + user_id=ctx.user_id, + items=[ + CartItemInput( + product_id=_PRODUCT_ID, + quantity=1, + configuration_sections=selection, + ) + ], + currency_code=ctx.currency_code, + culture_name=ctx.culture_name, + ) + + with allure.step("Verify a configured line item was created"): + assert cart.items_count == 1 + line_item = cart.items[0] + assert line_item.product_id == _PRODUCT_ID + assert line_item.sku == _CONFIGURED_SKU + assert len(line_item.configuration_items) == len(selection) + + with allure.step("Verify the configured components match the selection"): + selected_ids = {c.product_id for c in line_item.configuration_items} + expected_ids = {s.option.product_id for s in selection if s.option} + assert selected_ids == expected_ids + for item in line_item.configuration_items: + assert isinstance(item, CartConfigurationItem) + assert item.section_id + assert item.name + finally: + if cart: + cart_ops.delete_cart(cart_id=cart.id, user_id=ctx.user_id) + + +@pytest.mark.graphql +@allure.feature("Cart / Configurable product (GraphQL)") +@allure.title("Change the configuration of a cart line item") +def test_cart_change_configured_item( + graphql_client: GraphQLClient, ctx: Context +) -> None: + product_ops = ProductOperations(client=graphql_client) + cart_ops = CartOperations(client=graphql_client) + + with allure.step(f"Get configuration for {_PRODUCT_ID}"): + config = _get_configuration(product_ops, ctx) + first_selection = _selection(config, 0) + second_selection = _selection(config, _LAST_OPTION_INDEX) + + cart = None + try: + with allure.step("Add the configured product with the first selection"): + cart = cart_ops.add_items_to_cart( + store_id=ctx.store_id, + user_id=ctx.user_id, + items=[ + CartItemInput( + product_id=_PRODUCT_ID, + quantity=1, + configuration_sections=first_selection, + ) + ], + currency_code=ctx.currency_code, + culture_name=ctx.culture_name, + ) + line_item = cart.items[0] + original_ids = {c.product_id for c in line_item.configuration_items} + + with allure.step("Change the configuration to the second selection"): + updated_cart = cart_ops.change_cart_configured_item( + store_id=ctx.store_id, + user_id=ctx.user_id, + line_item_id=line_item.id, + configuration_sections=second_selection, + cart_id=cart.id, + currency_code=ctx.currency_code, + culture_name=ctx.culture_name, + ) + + with allure.step("Verify the same line item now reflects the new configuration"): + assert updated_cart.items_count == 1 + updated_item = updated_cart.items[0] + assert updated_item.id == line_item.id + updated_ids = {c.product_id for c in updated_item.configuration_items} + assert updated_ids == { + s.option.product_id for s in second_selection if s.option + } + assert updated_ids != original_ids + finally: + if cart: + cart_ops.delete_cart(cart_id=cart.id, user_id=ctx.user_id) + + +@pytest.mark.graphql +@allure.feature("Cart / Configurable product (GraphQL)") +@allure.title("Remove a configured line item from the cart") +def test_cart_remove_configured_item( + graphql_client: GraphQLClient, ctx: Context +) -> None: + product_ops = ProductOperations(client=graphql_client) + cart_ops = CartOperations(client=graphql_client) + + with allure.step(f"Get configuration for {_PRODUCT_ID}"): + config = _get_configuration(product_ops, ctx) + selection = _selection(config, 0) + + cart = None + try: + with allure.step("Add the configured product to the cart"): + cart = cart_ops.add_items_to_cart( + store_id=ctx.store_id, + user_id=ctx.user_id, + items=[ + CartItemInput( + product_id=_PRODUCT_ID, + quantity=1, + configuration_sections=selection, + ) + ], + currency_code=ctx.currency_code, + culture_name=ctx.culture_name, + ) + assert cart.items_count == 1 + line_item = cart.items[0] + + with allure.step("Remove the configured line item"): + updated_cart = cart_ops.remove_cart_item( + store_id=ctx.store_id, + user_id=ctx.user_id, + line_item_id=line_item.id, + cart_id=cart.id, + ) + + with allure.step("Verify the configured line item is gone"): + assert updated_cart.items_count == 0 + assert not any(i.id == line_item.id for i in updated_cart.items) + finally: + if cart: + cart_ops.delete_cart(cart_id=cart.id, user_id=ctx.user_id) diff --git a/tests/graphql/test_cart_merge.py b/tests/graphql/test_cart_merge.py index 0601e2a9..aa144945 100644 --- a/tests/graphql/test_cart_merge.py +++ b/tests/graphql/test_cart_merge.py @@ -5,7 +5,13 @@ from core.auth import AuthProvider from core.clients import GraphQLClient from core.global_settings import GlobalSettings -from gql.operations import CartOperations +from gql.operations import CartOperations, ProductOperations +from gql.types import ( + CartItemInput, + ConfigurableProductOptionInput, + ConfigurationSectionInput, + ProductConfiguration, +) from gql.types.cart import Cart from tests.context import Context @@ -17,6 +23,33 @@ _QTY_1 = 2 _QTY_2 = 1 +_REGULAR_PRODUCT_ID = "smartphone-apple-iphone-17-256gb-black" +_REGULAR_QTY = 2 +_CONFIGURABLE_PRODUCT_ID = "laptop-acer-predator-helios-neo-16-ai" +_CONFIGURED_SKU = f"Configuration-{_CONFIGURABLE_PRODUCT_ID}" + + +def _first_option_selection( + config: ProductConfiguration, +) -> list[ConfigurationSectionInput]: + sections: list[ConfigurationSectionInput] = [] + for section in config.configuration_sections: + if not section.options: + continue + option = section.options[0] + assert option.product is not None + sections.append( + ConfigurationSectionInput( + section_id=section.id, + type=section.type, + option=ConfigurableProductOptionInput( + product_id=option.product.id, + quantity=option.quantity, + ), + ) + ) + return sections + @pytest.mark.graphql @pytest.mark.with_cart([(_PRODUCT_ID_1, _QTY_1), (_PRODUCT_ID_2, _QTY_2)]) @@ -56,3 +89,99 @@ def test_cart_merge( finally: with allure.step(f"Teardown: delete cart {merged_cart.id}"): cart_ops.delete_cart(cart_id=merged_cart.id, user_id=user_id) + + +@pytest.mark.graphql +@allure.feature("Cart / Merge (GraphQL)") +@allure.title( + "Merge an anonymous cart with a configured item into a user's cart with a regular item" +) +def test_cart_merge_configured_and_regular( + with_user: AuthProvider, + graphql_client: GraphQLClient, + ctx: Context, + dataset: dict[str, list[dict[str, Any]]], + global_settings: GlobalSettings, +) -> None: + product_ops = ProductOperations(client=graphql_client) + cart_ops = CartOperations(client=graphql_client) + + with allure.step("As anonymous user, build a cart with a configured product"): + config = product_ops.get_product_configuration( + configurable_product_id=_CONFIGURABLE_PRODUCT_ID, + store_id=ctx.store_id, + user_id=ctx.user_id, + culture_name=ctx.culture_name, + currency_code=ctx.currency_code, + ) + assert config is not None + selection = _first_option_selection(config) + anon_cart = cart_ops.add_items_to_cart( + store_id=ctx.store_id, + user_id=ctx.user_id, + items=[ + CartItemInput( + product_id=_CONFIGURABLE_PRODUCT_ID, + quantity=1, + configuration_sections=selection, + ) + ], + currency_code=ctx.currency_code, + culture_name=ctx.culture_name, + ) + assert anon_cart.items_count == 1 + + user = next(u for u in dataset["users"] if u["userName"] == _USER) + user_id = user["id"] + + with allure.step(f"Sign in as {_USER}"): + with_user.sign_in(_USER, global_settings.users_password) + + merged_cart = None + try: + with allure.step("Seed the registered user's cart with a regular product"): + cart_ops.add_items_to_cart( + store_id=ctx.store_id, + user_id=user_id, + items=[ + CartItemInput( + product_id=_REGULAR_PRODUCT_ID, quantity=_REGULAR_QTY + ) + ], + currency_code=ctx.currency_code, + culture_name=ctx.culture_name, + ) + + with allure.step( + f"Merge anonymous cart {anon_cart.id} into the user's cart" + ): + merged_cart = cart_ops.merge_cart( + store_id=ctx.store_id, + user_id=user_id, + second_cart_id=anon_cart.id, + currency_code=ctx.currency_code, + culture_name=ctx.culture_name, + ) + + with allure.step( + "Verify the merged cart contains both the regular and configured items" + ): + assert merged_cart.items_count == 2 + assert has_line_item( + merged_cart.items, _REGULAR_PRODUCT_ID, _REGULAR_QTY + ) + configured_item = next( + (i for i in merged_cart.items if i.sku == _CONFIGURED_SKU), None + ) + assert configured_item is not None + assert configured_item.product_id == _CONFIGURABLE_PRODUCT_ID + assert len(configured_item.configuration_items) == len(selection) + selected_ids = { + c.product_id for c in configured_item.configuration_items + } + expected_ids = {s.option.product_id for s in selection if s.option} + assert selected_ids == expected_ids + finally: + if merged_cart: + with allure.step(f"Teardown: delete cart {merged_cart.id}"): + cart_ops.delete_cart(cart_id=merged_cart.id, user_id=user_id) diff --git a/tests/graphql/test_product_configurable.py b/tests/graphql/test_product_configurable.py index 9a9326ef..b0eb54d8 100644 --- a/tests/graphql/test_product_configurable.py +++ b/tests/graphql/test_product_configurable.py @@ -5,11 +5,10 @@ from gql.types import ConfigurableProductOptionInput, ConfigurationSectionInput from tests.context import Context -_PRODUCT_ID = "product-acme-laptop-hp-omnibook-x-flip-16" +_PRODUCT_ID = "laptop-acer-predator-helios-neo-16-ai" @pytest.mark.graphql -@pytest.mark.skip @allure.feature("Product / Variations (GraphQL)") @allure.title("Configure a configurable product and create a line item") def test_product_configurable(graphql_client: GraphQLClient, ctx: Context) -> None: