fix(core-flows): Access orderItem.variant safely inside convertDraftOrderWorkflow when containing custom items (#14233)

* Access orderItem variant safely on convert draft order workflow

* Tests

* Add changest

* Remove .only from test
This commit is contained in:
Nicolas Gorga
2025-12-08 08:56:05 -03:00
committed by GitHub
parent b53d63d6c8
commit fea3d4ec49
3 changed files with 105 additions and 2 deletions

View File

@@ -0,0 +1,5 @@
---
"@medusajs/core-flows": patch
---
fix(core-flows): Access orderItem.variant safely inside convertDraftOrderWorkflow when containing custom items

View File

@@ -416,6 +416,102 @@ medusaIntegrationTestRunner({
expect(response.status).toBe(200)
expect(response.data.order.status).toBe("pending")
})
it("should convert a draft order with a custom item (without variant_id) to an order", async () => {
await api.post(
`/admin/draft-orders/${testDraftOrder.id}/edit`,
{},
adminHeaders
)
await api.post(
`/admin/draft-orders/${testDraftOrder.id}/edit/items`,
{
items: [
{
title: "Custom Item",
quantity: 2,
unit_price: 1500,
},
],
},
adminHeaders
)
await api.post(
`/admin/draft-orders/${testDraftOrder.id}/edit/confirm`,
{},
adminHeaders
)
const response = await api.post(
`/admin/draft-orders/${testDraftOrder.id}/convert-to-order`,
{},
adminHeaders
)
expect(response.status).toBe(200)
expect(response.data.order.status).toBe("pending")
})
it("should convert a draft order with both variant items and custom items to an order", async () => {
await api.post(
`/admin/draft-orders/${testDraftOrder.id}/edit`,
{},
adminHeaders
)
await api.post(
`/admin/draft-orders/${testDraftOrder.id}/edit/items`,
{
items: [
{
variant_id: product.variants.find((v) => v.title === "L shirt")
.id,
quantity: 1,
},
{
title: "Custom Item",
quantity: 1,
unit_price: 2000,
},
],
},
adminHeaders
)
await api.post(
`/admin/draft-orders/${testDraftOrder.id}/edit/confirm`,
{},
adminHeaders
)
let reservations = (await api.get(`/admin/reservations`, adminHeaders))
.data.reservations
expect(reservations.length).toBe(0)
const response = await api.post(
`/admin/draft-orders/${testDraftOrder.id}/convert-to-order`,
{},
adminHeaders
)
reservations = (await api.get(`/admin/reservations`, adminHeaders)).data
.reservations
expect(reservations).toEqual(
expect.arrayContaining([
expect.objectContaining({
inventory_item_id: inventoryItemLarge.id,
quantity: 1,
}),
])
)
expect(response.status).toBe(200)
expect(response.data.order.status).toBe("pending")
})
})
describe("POST /draft-orders/:id/edit/items/:item_id", () => {

View File

@@ -143,11 +143,13 @@ export const convertDraftOrderWorkflow = createWorkflow(
for (const orderItem of orderItems.items ?? []) {
items.push({
variant_id: orderItem.variant.id,
variant_id: orderItem.variant?.id,
quantity: orderItem.quantity,
id: orderItem.id,
})
variants.push(orderItem.variant)
if (orderItem.variant) {
variants.push(orderItem.variant)
}
}
return {