fix(core-flows): refresh payment collections upon shipping changes (#10673)

* fix(core-flows): refresh payment collections upon shipping changes

* chore: fix spec
This commit is contained in:
Riqwan Thamir
2024-12-19 16:31:17 +01:00
committed by GitHub
parent 3efd25d06d
commit 5d1098ceb9
4 changed files with 120 additions and 47 deletions

View File

@@ -0,0 +1,5 @@
---
"@medusajs/core-flows": patch
---
fix(core-flows): refresh payment collections upon shipping changes

View File

@@ -302,7 +302,7 @@ medusaIntegrationTestRunner({
})
describe("POST /store/carts/:id/line-items", () => {
let shippingOption
let shippingOption, shippingOptionExpensive
beforeEach(async () => {
const stockLocation = (
@@ -358,25 +358,63 @@ medusaIntegrationTestRunner({
adminHeaders
)
const shippingOptionPayload = {
name: `Shipping`,
service_zone_id: fulfillmentSet.service_zones[0].id,
shipping_profile_id: shippingProfile.id,
provider_id: "manual_test-provider",
price_type: "flat",
type: {
label: "Test type",
description: "Test description",
code: "test-code",
},
prices: [
{ currency_code: "usd", amount: 1000 },
{
currency_code: "usd",
amount: 0,
rules: [
{
attribute: "item_total",
operator: "gt",
value: 5000,
},
],
},
],
rules: [
{
attribute: "enabled_in_store",
value: '"true"',
operator: "eq",
},
{
attribute: "is_return",
value: "false",
operator: "eq",
},
],
}
shippingOption = (
await api.post(
`/admin/shipping-options`,
shippingOptionPayload,
adminHeaders
)
).data.shipping_option
shippingOptionExpensive = (
await api.post(
`/admin/shipping-options`,
{
name: `Shipping`,
service_zone_id: fulfillmentSet.service_zones[0].id,
shipping_profile_id: shippingProfile.id,
provider_id: "manual_test-provider",
price_type: "flat",
type: {
label: "Test type",
description: "Test description",
code: "test-code",
},
...shippingOptionPayload,
prices: [
{ currency_code: "usd", amount: 1000 },
{ currency_code: "usd", amount: 10000 },
{
currency_code: "usd",
amount: 0,
amount: 5000,
rules: [
{
attribute: "item_total",
@@ -386,18 +424,6 @@ medusaIntegrationTestRunner({
],
},
],
rules: [
{
attribute: "enabled_in_store",
value: '"true"',
operator: "eq",
},
{
attribute: "is_return",
value: "false",
operator: "eq",
},
],
},
adminHeaders
)
@@ -555,6 +581,61 @@ medusaIntegrationTestRunner({
})
)
})
it("should update payment collection upon changing shipping option", async () => {
await api.post(
`/store/carts/${cart.id}/shipping-methods`,
{ option_id: shippingOption.id },
storeHeaders
)
await api.post(
`/store/payment-collections`,
{ cart_id: cart.id },
storeHeaders
)
const cartAfterCollection = (
await api.get(`/store/carts/${cart.id}`, storeHeaders)
).data.cart
expect(cartAfterCollection).toEqual(
expect.objectContaining({
id: cart.id,
shipping_methods: expect.arrayContaining([
expect.objectContaining({
shipping_option_id: shippingOption.id,
}),
]),
payment_collection: expect.objectContaining({
amount: 2398,
}),
})
)
let cartAfterExpensiveShipping = (
await api.post(
`/store/carts/${cart.id}/shipping-methods`,
{ option_id: shippingOptionExpensive.id },
storeHeaders
)
).data.cart
expect(cartAfterExpensiveShipping).toEqual(
expect.objectContaining({
id: cartAfterExpensiveShipping.id,
shipping_methods: expect.arrayContaining([
expect.objectContaining({
shipping_option_id: shippingOptionExpensive.id,
amount: 5000,
}),
]),
payment_collection: expect.objectContaining({
amount: 6398,
}),
})
)
})
})
it("should add item to cart with tax lines multiple times", async () => {

View File

@@ -17,8 +17,7 @@ import { validateAndReturnShippingMethodsDataStep } from "../steps/validate-ship
import { validateCartShippingOptionsPriceStep } from "../steps/validate-shipping-options-price"
import { cartFieldsForRefreshSteps } from "../utils/fields"
import { listShippingOptionsForCartWithPricingWorkflow } from "./list-shipping-options-for-cart-with-pricing"
import { updateCartPromotionsWorkflow } from "./update-cart-promotions"
import { updateTaxLinesWorkflow } from "./update-tax-lines"
import { refreshCartItemsWorkflow } from "./refresh-cart-items"
export interface AddShippingMethodToCartWorkflowInput {
cart_id: string
@@ -132,9 +131,9 @@ export const addShippingMethodToCartWorkflow = createWorkflow(
}
)
const currentShippingMethods = transform({ cart }, ({ cart }) => {
return cart.shipping_methods.map((sm) => sm.id)
})
const currentShippingMethods = transform({ cart }, ({ cart }) =>
cart.shipping_methods.map((sm) => sm.id)
)
parallelize(
removeShippingMethodFromCartStep({
@@ -149,16 +148,8 @@ export const addShippingMethodToCartWorkflow = createWorkflow(
})
)
updateTaxLinesWorkflow.runAsStep({
input: {
cart_id: input.cart_id,
},
})
updateCartPromotionsWorkflow.runAsStep({
input: {
cart_id: input.cart_id,
},
refreshCartItemsWorkflow.runAsStep({
input: { cart_id: cart.id },
})
}
)

View File

@@ -28,16 +28,15 @@ export const defaultStoreCartFields = [
"original_shipping_subtotal",
"original_shipping_total",
"metadata",
"sales_channel_id",
"promotions.id",
"promotions.code",
"promotions.is_automatic",
"promotions.application_method.value",
"promotions.application_method.type",
"promotions.application_method.currency_code",
"items",
"items.thumbnail",
"region",
"items.id",
"items.thumbnail",
"items.product",
"items.product.id",
"items.variant",
@@ -118,10 +117,7 @@ export const defaultStoreCartFields = [
"region.currency_code",
"region.automatic_taxes",
"*region.countries",
"sales_channel_id",
"payment_collection.id",
"payment_collection.amount",
"*payment_collection",
"*payment_collection.payment_sessions",
]