fix(core-flows): reservation management on order edit and draft order confirm (#12546)

This commit is contained in:
Frane Polić authored and GitHub committed 2025-05-28 09:52:01 +02:00
1 parent fb6167eed2
commit c4dd290461
5 files changed
+543 -85

No files matched your search

@@ -13,7 +13,7 @@ import {
} from "../../../helpers/create-admin-user"
import { medusaTshirtProduct } from "../../__fixtures__/product"
jest.setTimeout(30000)
jest.setTimeout(300000)
medusaIntegrationTestRunner({
testSuite: ({ dbConnection, getContainer, api }) => {
@@ -510,6 +510,358 @@ medusaIntegrationTestRunner({
})
})
describe("Order Edit Inventory", () => {
let product
let inventoryItemLarge
let inventoryItemMedium
let inventoryItemSmall
beforeEach(async () => {
const container = getContainer()
inventoryItemLarge = (
await api.post(
`/admin/inventory-items`,
{ sku: "shirt-large" },
adminHeaders
)
).data.inventory_item
inventoryItemMedium = (
await api.post(
`/admin/inventory-items`,
{ sku: "shirt-medium" },
adminHeaders
)
).data.inventory_item
inventoryItemSmall = (
await api.post(
`/admin/inventory-items`,
{ sku: "shirt-small" },
adminHeaders
)
).data.inventory_item
location = (
await api.post(
`/admin/stock-locations`,
{
name: "Test location",
},
adminHeaders
)
).data.stock_location
await api.post(
`/admin/inventory-items/${inventoryItemLarge.id}/location-levels`,
{
location_id: location.id,
stocked_quantity: 10,
},
adminHeaders
)
await api.post(
`/admin/inventory-items/${inventoryItemMedium.id}/location-levels`,
{
location_id: location.id,
stocked_quantity: 10,
},
adminHeaders
)
await api.post(
`/admin/inventory-items/${inventoryItemSmall.id}/location-levels`,
{
location_id: location.id,
stocked_quantity: 10,
},
adminHeaders
)
product = (
await api.post(
"/admin/products",
{
title: "Shirt",
options: [
{ title: "size", values: ["large", "medium", "small"] },
],
variants: [
{
title: "L shirt",
options: { size: "large" },
manage_inventory: true,
inventory_items: [
{
inventory_item_id: inventoryItemLarge.id,
required_quantity: 1,
},
],
prices: [
{
currency_code: "usd",
amount: 10,
},
],
},
{
title: "M shirt",
options: { size: "medium" },
manage_inventory: true,
inventory_items: [
{
inventory_item_id: inventoryItemMedium.id,
required_quantity: 1,
},
],
prices: [
{
currency_code: "usd",
amount: 10,
},
],
},
{
title: "S shirt",
options: { size: "small" },
manage_inventory: true,
inventory_items: [
{
inventory_item_id: inventoryItemSmall.id,
required_quantity: 1,
},
],
prices: [
{
currency_code: "usd",
amount: 10,
},
],
},
],
},
adminHeaders
)
).data.product
const region = (
await api.post(
"/admin/regions",
{
name: "test-region",
currency_code: "usd",
},
adminHeaders
)
).data.region
const customer = (
await api.post(
"/admin/customers",
{
first_name: "joe2",
email: "joe2@admin.com",
},
adminHeaders
)
).data.customer
const taxRegion = (
await api.post(
"/admin/tax-regions",
{
provider_id: "tp_system",
country_code: "UK",
},
adminHeaders
)
).data.tax_region
taxLine = (
await api.post(
"/admin/tax-rates",
{
rate: 10,
code: "standard",
name: "Taxation is theft",
is_default: true,
tax_region_id: taxRegion.id,
},
adminHeaders
)
).data.tax_rate
const salesChannel = (
await api.post(
"/admin/sales-channels",
{
name: "Test channel",
},
adminHeaders
)
).data.sales_channel
const orderModule = container.resolve(Modules.ORDER)
order = await orderModule.createOrders({
region_id: region.id,
email: "foo@bar.com",
items: [
{
title: "Medusa T-shirt",
subtitle: "L shirt",
variant_id: product.variants.find((v) => v.title === "L shirt")
.id,
quantity: 2,
unit_price: 25,
},
{
title: "Medusa T-shirt",
subtitle: "M shirt",
variant_id: product.variants.find((v) => v.title === "M shirt")
.id,
quantity: 2,
unit_price: 25,
},
],
sales_channel_id: salesChannel.id,
shipping_address: {
first_name: "Test",
last_name: "Test",
address_1: "Test",
city: "Test",
country_code: "US",
postal_code: "12345",
phone: "12345",
},
billing_address: {
first_name: "Test",
last_name: "Test",
address_1: "Test",
city: "Test",
country_code: "US",
postal_code: "12345",
},
shipping_methods: [
{
name: "Test shipping method",
amount: 10,
},
],
currency_code: "usd",
customer_id: customer.id,
})
const remoteLink = container.resolve(
ContainerRegistrationKeys.REMOTE_LINK
)
await remoteLink.create([
{
[Modules.SALES_CHANNEL]: {
sales_channel_id: salesChannel.id,
},
[Modules.STOCK_LOCATION]: {
stock_location_id: location.id,
},
},
])
})
it("should manage reservations on order edit", async () => {
let edit = (
await api.post(
`/admin/order-edits`,
{ order_id: order.id },
adminHeaders
)
).data.order_change
// Add item
await api.post(
`/admin/order-edits/${order.id}/items`,
{
items: [
{
variant_id: product.variants.find((v) => v.title === "S shirt")
.id,
quantity: 1,
},
],
},
adminHeaders
)
// Remove item
await api.post(
`/admin/order-edits/${order.id}/items/item/${
order.items.find((i) => i.subtitle === "M shirt").id
}`,
{ quantity: 0 },
adminHeaders
)
// Update item
await api.post(
`/admin/order-edits/${order.id}/items/item/${
order.items.find((i) => i.subtitle === "L shirt").id
}`,
{ quantity: 2 },
adminHeaders
)
edit = (
await api.post(
`/admin/order-edits/${order.id}/request`,
{},
adminHeaders
)
).data.order_change
edit = (
await api.post(
`/admin/order-edits/${order.id}/confirm`,
{},
adminHeaders
)
).data.order_change
order = (await api.get(`/admin/orders/${order.id}`, adminHeaders)).data
.order
expect(order.items.length).toBe(2)
expect(order.items).toEqual(
expect.arrayContaining([
expect.objectContaining({
subtitle: "L shirt",
quantity: 2,
}),
expect.objectContaining({
subtitle: "S shirt",
quantity: 1,
}),
])
)
let reservations = (await api.get(`/admin/reservations`, adminHeaders))
.data.reservations
expect(reservations.length).toBe(2)
expect(reservations).toEqual(
expect.arrayContaining([
expect.objectContaining({
inventory_item_id: inventoryItemLarge.id,
quantity: 2,
}),
expect.objectContaining({
inventory_item_id: inventoryItemSmall.id,
quantity: 1,
}),
])
)
})
})
describe("Order Edit Shipping Methods", () => {
it("should add a shipping method through an order edit", async () => {
await api.post(