diff --git a/.changeset/heavy-pears-mix.md b/.changeset/heavy-pears-mix.md new file mode 100644 index 0000000000..13a8fec2b4 --- /dev/null +++ b/.changeset/heavy-pears-mix.md @@ -0,0 +1,7 @@ +--- +"@medusajs/medusa": patch +"@medusajs/core-flows": patch +"@medusajs/types": patch +--- + +fix(core-flows,medusa): Include region_id in shipping option retrieval diff --git a/integration-tests/modules/__tests__/shipping-options/store/shipping-options.spec.ts b/integration-tests/modules/__tests__/shipping-options/store/shipping-options.spec.ts index b86e3a7800..8faf838655 100644 --- a/integration-tests/modules/__tests__/shipping-options/store/shipping-options.spec.ts +++ b/integration-tests/modules/__tests__/shipping-options/store/shipping-options.spec.ts @@ -1,9 +1,9 @@ +import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { IFulfillmentModuleService, IRegionModuleService, } from "@medusajs/types" import { ContainerRegistrationKeys, Modules } from "@medusajs/utils" -import { medusaIntegrationTestRunner } from "@medusajs/test-utils" import { createAdminUser, generatePublishableKey, @@ -25,6 +25,7 @@ medusaIntegrationTestRunner({ let salesChannel let region + let regionTwo let product let stockLocation let shippingProfile @@ -37,11 +38,12 @@ medusaIntegrationTestRunner({ appContainer = getContainer() fulfillmentModule = appContainer.resolve(Modules.FULFILLMENT) regionService = appContainer.resolve(Modules.REGION) - const publishableKey = await generatePublishableKey(appContainer) - storeHeaders = generateStoreHeaders({ publishableKey }) }) beforeEach(async () => { + const publishableKey = await generatePublishableKey(appContainer) + storeHeaders = generateStoreHeaders({ publishableKey }) + await createAdminUser(dbConnection, adminHeaders, appContainer) const remoteLinkService = appContainer.resolve( ContainerRegistrationKeys.REMOTE_LINK @@ -53,6 +55,22 @@ medusaIntegrationTestRunner({ currency_code: "usd", }) + regionTwo = await regionService.createRegions({ + name: "Test region two", + countries: ["DK"], + currency_code: "dkk", + }) + + await api.post( + "/admin/price-preferences", + { + attribute: "region_id", + value: regionTwo.id, + is_tax_inclusive: true, + }, + adminHeaders + ) + salesChannel = ( await api.post( "/admin/sales-channels", @@ -79,6 +97,10 @@ medusaIntegrationTestRunner({ currency_code: "usd", amount: 100, }, + { + currency_code: "dkk", + amount: 100, + }, ], options: { size: "large", @@ -91,7 +113,7 @@ medusaIntegrationTestRunner({ ) ).data.product - const stockLocation = ( + stockLocation = ( await api.post( `/admin/stock-locations`, { @@ -112,7 +134,10 @@ medusaIntegrationTestRunner({ service_zones: [ { name: "Test", - geo_zones: [{ type: "country", country_code: "us" }], + geo_zones: [ + { type: "country", country_code: "us" }, + { type: "country", country_code: "dk" }, + ], }, ], }) @@ -165,35 +190,39 @@ medusaIntegrationTestRunner({ region_id: region.id, amount: 1100, }, + { + region_id: regionTwo.id, + amount: 500, + }, ], rules: [], }, adminHeaders ) ).data.shipping_option - - cart = ( - await api.post( - `/store/carts`, - { - region_id: region.id, - sales_channel_id: salesChannel.id, - currency_code: "usd", - email: "test@admin.com", - items: [ - { - variant_id: product.variants[0].id, - quantity: 1, - }, - ], - }, - storeHeaders - ) - ).data.cart }) - describe("GET /admin/shipping-options?cart_id=", () => { - it("should get all shipping options for a cart successfully", async () => { + describe("GET /store/shipping-options?cart_id=", () => { + it("should get shipping options for a cart successfully", async () => { + cart = ( + await api.post( + `/store/carts`, + { + region_id: region.id, + sales_channel_id: salesChannel.id, + currency_code: "usd", + email: "test@admin.com", + items: [ + { + variant_id: product.variants[0].id, + quantity: 1, + }, + ], + }, + storeHeaders + ) + ).data.cart + const resp = await api.get( `/store/shipping-options?cart_id=${cart.id}`, storeHeaders @@ -206,10 +235,36 @@ medusaIntegrationTestRunner({ expect.objectContaining({ id: shippingOption.id, name: "Test shipping option", - amount: 1000, + amount: 1100, price_type: "flat", }) ) + + cart = ( + await api.post( + `/store/carts/${cart.id}`, + { + region_id: regionTwo.id, + }, + storeHeaders + ) + ).data.cart + + const secondResp = await api.get( + `/store/shipping-options?cart_id=${cart.id}`, + storeHeaders + ) + + expect(secondResp.data.shipping_options).toHaveLength(1) + expect(secondResp.data.shipping_options[0]).toEqual( + expect.objectContaining({ + id: shippingOption.id, + name: "Test shipping option", + amount: 500, + price_type: "flat", + is_tax_inclusive: true, + }) + ) }) }) }) diff --git a/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart.ts b/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart.ts index 8d242a338f..b2190a948b 100644 --- a/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart.ts +++ b/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart.ts @@ -86,6 +86,7 @@ export const listShippingOptionsForCartWorkflow = createWorkflow( calculated_price: { context: { currency_code: input.currency_code, + region_id: input.region_id, }, }, }, diff --git a/packages/core/types/src/cart/workflows.ts b/packages/core/types/src/cart/workflows.ts index 86bc65a8e4..92b8d6282b 100644 --- a/packages/core/types/src/cart/workflows.ts +++ b/packages/core/types/src/cart/workflows.ts @@ -112,6 +112,7 @@ export interface ListShippingOptionsForCartWorkflowInputDTO { cart_id: string is_return: boolean sales_channel_id?: string + region_id?: string currency_code: string shipping_address: { city?: string diff --git a/packages/medusa/src/api/store/shipping-options/route.ts b/packages/medusa/src/api/store/shipping-options/route.ts index 1c50c1cc2c..41a3e416ff 100644 --- a/packages/medusa/src/api/store/shipping-options/route.ts +++ b/packages/medusa/src/api/store/shipping-options/route.ts @@ -1,7 +1,7 @@ import { listShippingOptionsForCartWorkflow } from "@medusajs/core-flows" +import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" import { HttpTypes, ICartModuleService } from "@medusajs/framework/types" import { MedusaError, Modules } from "@medusajs/framework/utils" -import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" import { StoreGetShippingOptionsType } from "./validators" export const GET = async ( @@ -25,6 +25,7 @@ export const GET = async ( "id", "sales_channel_id", "currency_code", + "region_id", "shipping_address.city", "shipping_address.country_code", "shipping_address.province", @@ -37,6 +38,7 @@ export const GET = async ( cart_id: cart.id, sales_channel_id: cart.sales_channel_id, currency_code: cart.currency_code, + region_id: cart.region_id, is_return: !!is_return, shipping_address: { city: cart.shipping_address?.city,