fix(medusa): Throw on line item generation if variant does not have a price (#3766)
This commit is contained in:
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@medusajs/medusa": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix(medusa): Throw upon draft order creation if a variant does not have any prices
|
||||||
@@ -80,6 +80,41 @@ describe("/admin/draft-orders", () => {
|
|||||||
expect(response.status).toEqual(200)
|
expect(response.status).toEqual(200)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it("creates a draft order cart containing variant without prices should fail", async () => {
|
||||||
|
const api = useApi()
|
||||||
|
|
||||||
|
const payload = {
|
||||||
|
email: "oli@test.dk",
|
||||||
|
shipping_address: "oli-shipping",
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
variant_id: "test-variant-without-prices",
|
||||||
|
quantity: 2,
|
||||||
|
metadata: {},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
region_id: "test-region",
|
||||||
|
customer_id: "oli-test",
|
||||||
|
shipping_methods: [
|
||||||
|
{
|
||||||
|
option_id: "test-option",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
const response = await api
|
||||||
|
.post("/admin/draft-orders", payload, adminReqConfig)
|
||||||
|
.catch((err) => {
|
||||||
|
return err.response
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(response.status).toEqual(400)
|
||||||
|
expect(response.data.type).toEqual("invalid_data")
|
||||||
|
expect(response.data.message).toEqual(
|
||||||
|
`Cannot generate line item for variant "test variant without prices" without a price`
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
it("creates a draft order with a custom shipping option price", async () => {
|
it("creates a draft order with a custom shipping option price", async () => {
|
||||||
const api = useApi()
|
const api = useApi()
|
||||||
|
|
||||||
|
|||||||
@@ -59,6 +59,19 @@ module.exports = async (dataSource, data = {}) => {
|
|||||||
`insert into product_sales_channel values ('test-product-2', '${salesChannel.id}');`
|
`insert into product_sales_channel values ('test-product-2', '${salesChannel.id}');`
|
||||||
)
|
)
|
||||||
|
|
||||||
|
await manager.insert(ProductVariant, {
|
||||||
|
id: "test-variant-without-prices",
|
||||||
|
title: "test variant without prices",
|
||||||
|
product_id: "test-product",
|
||||||
|
inventory_quantity: 1,
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
option_id: "test-option",
|
||||||
|
value: "no prices",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
|
||||||
await manager.insert(ProductVariant, {
|
await manager.insert(ProductVariant, {
|
||||||
id: "test-variant",
|
id: "test-variant",
|
||||||
title: "test variant",
|
title: "test variant",
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ const validRegionId = IdMap.getId("region-france")
|
|||||||
describe("POST /admin/discounts", () => {
|
describe("POST /admin/discounts", () => {
|
||||||
const adminSession = {
|
const adminSession = {
|
||||||
jwt: {
|
jwt: {
|
||||||
userId: IdMap.getId("admin_user")
|
userId: IdMap.getId("admin_user"),
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
describe("successful creation", () => {
|
describe("successful creation", () => {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { isDefined, MedusaError } from "medusa-core-utils"
|
import { MedusaError } from "medusa-core-utils"
|
||||||
import {
|
import {
|
||||||
EntityManager,
|
EntityManager,
|
||||||
FindOptionsWhere,
|
FindOptionsWhere,
|
||||||
@@ -29,6 +29,7 @@ import EventBusService from "./event-bus"
|
|||||||
import LineItemService from "./line-item"
|
import LineItemService from "./line-item"
|
||||||
import ProductVariantService from "./product-variant"
|
import ProductVariantService from "./product-variant"
|
||||||
import ShippingOptionService from "./shipping-option"
|
import ShippingOptionService from "./shipping-option"
|
||||||
|
import { isDefined } from "@medusajs/utils"
|
||||||
|
|
||||||
type InjectedDependencies = {
|
type InjectedDependencies = {
|
||||||
manager: EntityManager
|
manager: EntityManager
|
||||||
|
|||||||
@@ -332,6 +332,15 @@ class LineItemService extends TransactionBaseService {
|
|||||||
unit_price = context.variantPricing?.calculated_price ?? undefined
|
unit_price = context.variantPricing?.calculated_price ?? undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (unit_price == null) {
|
||||||
|
throw new MedusaError(
|
||||||
|
MedusaError.Types.INVALID_DATA,
|
||||||
|
`Cannot generate line item for variant "${
|
||||||
|
variant.title ?? variant.product.title ?? variant.id
|
||||||
|
}" without a price`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
const rawLineItem: Partial<LineItem> = {
|
const rawLineItem: Partial<LineItem> = {
|
||||||
unit_price: unit_price,
|
unit_price: unit_price,
|
||||||
title: variant.product.title,
|
title: variant.product.title,
|
||||||
|
|||||||
Reference in New Issue
Block a user