fix(medusa): Throw on line item generation if variant does not have a price (#3766)
This commit is contained in:
committed by
GitHub
parent
d533caa4c2
commit
1a60c6f58d
5
.changeset/dry-kids-hear.md
Normal file
5
.changeset/dry-kids-hear.md
Normal file
@@ -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)
|
||||
})
|
||||
|
||||
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 () => {
|
||||
const api = useApi()
|
||||
|
||||
|
||||
@@ -59,6 +59,19 @@ module.exports = async (dataSource, data = {}) => {
|
||||
`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, {
|
||||
id: "test-variant",
|
||||
title: "test variant",
|
||||
|
||||
@@ -7,8 +7,8 @@ const validRegionId = IdMap.getId("region-france")
|
||||
describe("POST /admin/discounts", () => {
|
||||
const adminSession = {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user")
|
||||
}
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
}
|
||||
|
||||
describe("successful creation", () => {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { isDefined, MedusaError } from "medusa-core-utils"
|
||||
import { MedusaError } from "medusa-core-utils"
|
||||
import {
|
||||
EntityManager,
|
||||
FindOptionsWhere,
|
||||
@@ -29,6 +29,7 @@ import EventBusService from "./event-bus"
|
||||
import LineItemService from "./line-item"
|
||||
import ProductVariantService from "./product-variant"
|
||||
import ShippingOptionService from "./shipping-option"
|
||||
import { isDefined } from "@medusajs/utils"
|
||||
|
||||
type InjectedDependencies = {
|
||||
manager: EntityManager
|
||||
|
||||
@@ -332,6 +332,15 @@ class LineItemService extends TransactionBaseService {
|
||||
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> = {
|
||||
unit_price: unit_price,
|
||||
title: variant.product.title,
|
||||
|
||||
Reference in New Issue
Block a user