fix(medusa): Add inventory decoration for cart endpoints (#5187)
**What** - decorate item totals for `cart.item.variant` when adding a line-item and retrieving a cart closes #5181
This commit is contained in:
@@ -234,6 +234,54 @@ describe("/store/carts", () => {
|
||||
expect(count).toEqual(0)
|
||||
})
|
||||
|
||||
it("should decorate line item variant inventory_quantity when creating a line-item", async () => {
|
||||
const api = useApi()
|
||||
|
||||
const cartId = "test-cart"
|
||||
|
||||
// Add standard line item to cart
|
||||
const addCart = await api
|
||||
.post(
|
||||
`/store/carts/${cartId}/line-items`,
|
||||
{
|
||||
variant_id: variantId,
|
||||
quantity: 3,
|
||||
},
|
||||
{ withCredentials: true }
|
||||
)
|
||||
.catch((e) => e)
|
||||
|
||||
expect(addCart.status).toEqual(200)
|
||||
expect(addCart.data.cart.items[0].variant.inventory_quantity).toEqual(5)
|
||||
})
|
||||
|
||||
it("should decorate line item variant inventory_quantity when getting cart", async () => {
|
||||
const api = useApi()
|
||||
|
||||
const cartId = "test-cart"
|
||||
|
||||
// Add standard line item to cart
|
||||
await api
|
||||
.post(
|
||||
`/store/carts/${cartId}/line-items`,
|
||||
{
|
||||
variant_id: variantId,
|
||||
quantity: 3,
|
||||
},
|
||||
{ withCredentials: true }
|
||||
)
|
||||
.catch((e) => e)
|
||||
|
||||
const cartResponse = await api
|
||||
.get(`/store/carts/${cartId}`, { withCredentials: true })
|
||||
.catch((e) => e)
|
||||
|
||||
expect(cartResponse.status).toEqual(200)
|
||||
expect(
|
||||
cartResponse.data.cart.items[0].variant.inventory_quantity
|
||||
).toEqual(5)
|
||||
})
|
||||
|
||||
it("fails to add a item on the cart if the inventory isn't enough", async () => {
|
||||
const api = useApi()
|
||||
|
||||
|
||||
@@ -10,7 +10,10 @@ const adminSeeder = require("../../../../helpers/admin-seeder")
|
||||
|
||||
jest.setTimeout(30000)
|
||||
|
||||
const { simpleProductFactory } = require("../../../../factories")
|
||||
const {
|
||||
simpleProductFactory,
|
||||
simpleSalesChannelFactory,
|
||||
} = require("../../../../factories")
|
||||
|
||||
const adminHeaders = { headers: { "x-medusa-access-token": "test_token" } }
|
||||
|
||||
@@ -53,7 +56,17 @@ describe("Get products", () => {
|
||||
"productVariantInventoryService"
|
||||
)
|
||||
const inventoryService = appContainer.resolve("inventoryService")
|
||||
const locationService = appContainer.resolve("stockLocationService")
|
||||
const salesChannelService = appContainer.resolve("salesChannelService")
|
||||
const salesChannelLocationService = appContainer.resolve(
|
||||
"salesChannelLocationService"
|
||||
)
|
||||
|
||||
const salesChannel = await simpleSalesChannelFactory(dbConnection, {
|
||||
is_default: true,
|
||||
})
|
||||
|
||||
const location = await locationService.create({ name: "test-location" })
|
||||
await simpleProductFactory(
|
||||
dbConnection,
|
||||
{
|
||||
@@ -63,7 +76,11 @@ describe("Get products", () => {
|
||||
},
|
||||
100
|
||||
)
|
||||
|
||||
await salesChannelService.addProducts(salesChannel.id, [productId])
|
||||
await salesChannelLocationService.associateLocation(
|
||||
salesChannel.id,
|
||||
location.id
|
||||
)
|
||||
invItem = await inventoryService.createInventoryItem({
|
||||
sku: "test-sku",
|
||||
})
|
||||
@@ -72,33 +89,62 @@ describe("Get products", () => {
|
||||
variantId,
|
||||
invItem.id
|
||||
)
|
||||
|
||||
await inventoryService.createInventoryLevel({
|
||||
inventory_item_id: invItem.id,
|
||||
location_id: location.id,
|
||||
stocked_quantity: 100,
|
||||
})
|
||||
})
|
||||
|
||||
it("Expands inventory items when getting product with expand parameters", async () => {
|
||||
const api = useApi()
|
||||
describe("/store/products/:id", () => {
|
||||
it("Expands inventory items when getting product with expand parameters", async () => {
|
||||
const api = useApi()
|
||||
|
||||
const res = await api.get(
|
||||
`/store/products/${productId}?expand=variants,variants.inventory_items`,
|
||||
adminHeaders
|
||||
)
|
||||
const res = await api.get(
|
||||
`/store/products/${productId}?expand=variants,variants.inventory_items`
|
||||
)
|
||||
|
||||
expect(res.status).toEqual(200)
|
||||
expect(res.data.product).toEqual(
|
||||
expect.objectContaining({
|
||||
id: productId,
|
||||
variants: [
|
||||
expect.objectContaining({
|
||||
id: variantId,
|
||||
inventory_items: [
|
||||
expect.objectContaining({
|
||||
inventory_item_id: invItem.id,
|
||||
variant_id: variantId,
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
expect.objectContaining({})
|
||||
)
|
||||
expect(res.status).toEqual(200)
|
||||
expect(res.data.product).toEqual(
|
||||
expect.objectContaining({
|
||||
id: productId,
|
||||
variants: [
|
||||
expect.objectContaining({
|
||||
id: variantId,
|
||||
inventory_items: [
|
||||
expect.objectContaining({
|
||||
inventory_item_id: invItem.id,
|
||||
variant_id: variantId,
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
expect.objectContaining({})
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
describe("/admin/products/:id", () => {
|
||||
it("should get inventory quantity for products fetched through the admin api", async () => {
|
||||
const api = useApi()
|
||||
|
||||
const res = await api.get(`/admin/products/${productId}`, adminHeaders)
|
||||
|
||||
expect(res.status).toEqual(200)
|
||||
expect(res.data.product).toEqual(
|
||||
expect.objectContaining({
|
||||
id: productId,
|
||||
variants: [
|
||||
expect.objectContaining({
|
||||
id: variantId,
|
||||
inventory_quantity: 100,
|
||||
}),
|
||||
],
|
||||
}),
|
||||
expect.objectContaining({})
|
||||
)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -11,6 +11,7 @@ import path from "path"
|
||||
import adminSeeder from "../../../../helpers/admin-seeder"
|
||||
import { createDefaultRuleTypes } from "../../../helpers/create-default-rule-types"
|
||||
import { createVariantPriceSet } from "../../../helpers/create-variant-price-set"
|
||||
import { AxiosInstance } from "axios"
|
||||
|
||||
jest.setTimeout(50000)
|
||||
|
||||
@@ -80,7 +81,7 @@ describe("[Product & Pricing Module] POST /admin/products/:id/variants/:id", ()
|
||||
})
|
||||
|
||||
it("should create product variant price sets and prices", async () => {
|
||||
const api = useApi()
|
||||
const api = useApi()! as AxiosInstance
|
||||
const data = {
|
||||
title: "test variant update",
|
||||
prices: [
|
||||
@@ -144,7 +145,7 @@ describe("[Product & Pricing Module] POST /admin/products/:id/variants/:id", ()
|
||||
|
||||
const moneyAmountToUpdate = priceSet.money_amounts?.[0]
|
||||
|
||||
const api = useApi()
|
||||
const api = useApi()! as AxiosInstance
|
||||
const data = {
|
||||
title: "test variant update",
|
||||
prices: [
|
||||
@@ -202,7 +203,7 @@ describe("[Product & Pricing Module] POST /admin/products/:id/variants/:id", ()
|
||||
prices: [],
|
||||
})
|
||||
|
||||
const api = useApi()
|
||||
const api = useApi()! as AxiosInstance
|
||||
const data = {
|
||||
title: "test variant update",
|
||||
prices: [
|
||||
|
||||
Reference in New Issue
Block a user