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:
Philip Korsholm
2023-10-31 10:55:30 +01:00
committed by GitHub
parent ca05436fc1
commit 9ff22110a6
19 changed files with 370 additions and 77 deletions

View File

@@ -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()

View File

@@ -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({})
)
})
})
})

View File

@@ -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: [