feat(medusa-js, medusa-react, medusa): Prepare API for admin implementations (#3110)

********What********
Add `joinSalesChannels util to stock locations

Add the following endpoints to medusa-react
- inventory items
    - mutations
        - update
        - delete
        - update location level
        - delete location level
        - create location level
    - queries
        - list inventory items
        - get inventory item
        - list location levels
- Stock locations
    - mutations
        - create stock location
        - update stock location
        - delete stock location
    - queries
        - list stock locations
        - get stock locatoin
- Variants
    - queries
        - get inventory
- Reservations
    - mutations
        - create reservation
        - update reservation
        - delete reservation
    - queries
        - list reservations
        - get reservation
- sales channels 
  - mutations
    - associate location with sc
    - remove location association

**Why**
- Update clients to reflect new api endpoints in the core with inventory modules

Co-authored-by: Philip Korsholm <88927411+pKorsholm@users.noreply.github.com>
This commit is contained in:
Rares Stefan
2023-02-16 08:49:48 +00:00
committed by GitHub
co-authored by Philip Korsholm
parent 121b42acfe
commit 12d304307a
48 changed files with 1756 additions and 57 deletions
@@ -0,0 +1,144 @@
import {
useAdminUpdateInventoryItem,
useAdminDeleteInventoryItem,
useAdminUpdateLocationLevel,
useAdminDeleteLocationLevel,
useAdminCreateLocationLevel,
} from "../../../../src/"
import { renderHook } from "@testing-library/react-hooks"
import { createWrapper } from "../../../utils"
describe("useAdminUpdateInventoryItem hook", () => {
test("updates an inventory item", async () => {
const payload = {
sku: "test-sku",
}
const { result, waitFor } = renderHook(
() => useAdminUpdateInventoryItem("inventory-item-id"),
{
wrapper: createWrapper(),
}
)
result.current.mutate(payload)
await waitFor(() => result.current.isSuccess)
expect(result.current.data.response.status).toEqual(200)
expect(result.current.data.inventory_item).toEqual(
expect.objectContaining({
id: "inventory-item-id",
sku: "test-sku",
})
)
})
})
describe("useAdminDeleteInventoryItem hook", () => {
test("Deletes an inventory item", async () => {
const { result, waitFor } = renderHook(
() => useAdminDeleteInventoryItem("inventory-item-id"),
{
wrapper: createWrapper(),
}
)
result.current.mutate()
await waitFor(() => result.current.isSuccess)
expect(result.current.data.response.status).toEqual(200)
expect(result.current.data).toEqual(
expect.objectContaining({
id: "inventory-item-id",
deleted: true,
})
)
})
})
describe("useAdminUpdateLocationLevel hook", () => {
test("Updates a location level", async () => {
const payload = {
incoming_quantity: 10,
}
const { result, waitFor } = renderHook(
() => useAdminUpdateLocationLevel("inventory-item-id"),
{
wrapper: createWrapper(),
}
)
result.current.mutate({ ...payload, stockLocationId: "location_id"})
await waitFor(() => result.current.isSuccess)
expect(result.current.data.response.status).toEqual(200)
expect(result.current.data.inventory_item).toEqual(
expect.objectContaining({
id: "inventory-item-id",
location_levels: [
expect.objectContaining({
incoming_quantity: 10,
}),
],
})
)
})
})
describe("useAdminDeleteLocationLevel hook", () => {
test("removes a location level", async () => {
const { result, waitFor } = renderHook(
() => useAdminDeleteLocationLevel("inventory-item-id"),
{
wrapper: createWrapper(),
}
)
result.current.mutate("location_id")
await waitFor(() => result.current.isSuccess)
expect(result.current.data.response.status).toEqual(200)
expect(result.current.data.inventory_item).toEqual(
expect.objectContaining({
id: "inventory-item-id",
location_levels: [],
})
)
})
})
describe("useAdminCreateLocationLevel hook", () => {
test("creates a location level", async () => {
const payload = {
location_id: "loc_1",
incoming_quantity: 10,
stocked_quantity: 10,
}
const { result, waitFor } = renderHook(
() => useAdminCreateLocationLevel("inventory-item-id"),
{
wrapper: createWrapper(),
}
)
result.current.mutate(payload)
await waitFor(() => result.current.isSuccess)
expect(result.current.data.response.status).toEqual(200)
expect(result.current.data.inventory_item).toEqual(
expect.objectContaining({
id: "inventory-item-id",
location_levels: expect.arrayContaining([
expect.objectContaining({ ...payload }),
]),
})
)
})
})
@@ -0,0 +1,75 @@
import {
useAdminInventoryItem,
useAdminInventoryItemLocationLevels,
useAdminInventoryItems,
useAdminPriceList,
useAdminPriceLists,
} from "../../../../src"
import { renderHook } from "@testing-library/react-hooks"
import { fixtures } from "../../../../mocks/data"
import { createWrapper } from "../../../utils"
describe("useAdminInventoryItems hook", () => {
test("returns a list of inventory items", async () => {
const inventoryItems = fixtures.list("inventory_item")
const { result, waitFor } = renderHook(() => useAdminInventoryItems(), {
wrapper: createWrapper(),
})
await waitFor(() => result.current.isSuccess)
expect(result.current.response.status).toEqual(200)
expect(result.current.inventory_items).toEqual(inventoryItems)
})
})
describe("useAdminInventoryItem hook", () => {
test("returns a single inventory item", async () => {
const inventoryItem = fixtures.get("inventory_item")
const { result, waitFor } = renderHook(
() => useAdminInventoryItem(inventoryItem.id),
{
wrapper: createWrapper(),
}
)
await waitFor(() => result.current.isSuccess)
expect(result.current.response.status).toEqual(200)
expect(result.current.inventory_item).toEqual(inventoryItem)
})
})
describe("useAdminInventoryItem hook", () => {
test("returns a location levels for an inventory item", async () => {
const inventoryItem = fixtures.get("inventory_item")
const { result, waitFor } = renderHook(
() => useAdminInventoryItemLocationLevels(inventoryItem.id),
{
wrapper: createWrapper(),
}
)
await waitFor(() => result.current.isSuccess)
expect(result.current.response.status).toEqual(200)
expect(result.current.inventory_item).toEqual(inventoryItem)
})
})
describe("useAdminPriceList hook", () => {
test("returns a price list", async () => {
const priceList = fixtures.get("price_list")
const { result, waitFor } = renderHook(
() => useAdminPriceList(priceList.id),
{
wrapper: createWrapper(),
}
)
await waitFor(() => result.current.isSuccess)
expect(result.current.response.status).toEqual(200)
expect(result.current.price_list).toEqual(priceList)
})
})
@@ -0,0 +1,88 @@
import {
useAdminCreateShippingProfile,
useAdminUpdateShippingProfile,
useAdminDeleteShippingProfile,
useAdminCreateReservation,
useAdminUpdateReservation,
useAdminDeleteReservation,
} from "../../../../src/"
import { renderHook } from "@testing-library/react-hooks"
import { fixtures } from "../../../../mocks/data"
import { createWrapper } from "../../../utils"
describe("useAdminCreateShippingProfile hook", () => {
test("creates a shipping profile and returns it", async () => {
const reservationPayload = {
location_id: "loc_1",
inventory_item_id: "inv_1",
quantity: 2,
}
const { result, waitFor } = renderHook(() => useAdminCreateReservation(), {
wrapper: createWrapper(),
})
result.current.mutate(reservationPayload)
await waitFor(() => result.current.isSuccess)
expect(result.current.data.response.status).toEqual(200)
expect(result.current.data.reservation).toEqual(
expect.objectContaining({
...fixtures.get("reservation"),
...reservationPayload,
})
)
})
})
describe("useAdminUpdateShippingProfile hook", () => {
test("updates a shipping profile and returns it", async () => {
const reservationPayload = {
quantity: 3,
}
const { result, waitFor } = renderHook(
() => useAdminUpdateReservation(fixtures.get("reservation").id),
{
wrapper: createWrapper(),
}
)
result.current.mutate(reservationPayload)
await waitFor(() => result.current.isSuccess)
expect(result.current.data.response.status).toEqual(200)
expect(result.current.data.reservation).toEqual(
expect.objectContaining({
...fixtures.get("reservation"),
quantity: 3,
})
)
})
})
describe("useAdminDeleteShippingProfile hook", () => {
test("deletes a shipping profile", async () => {
const { result, waitFor } = renderHook(
() => useAdminDeleteReservation(fixtures.get("reservation").id),
{
wrapper: createWrapper(),
}
)
result.current.mutate()
await waitFor(() => result.current.isSuccess)
expect(result.current.data.response.status).toEqual(200)
expect(result.current.data).toEqual(
expect.objectContaining({
id: fixtures.get("reservation").id,
object: "reservation",
deleted: true,
})
)
})
})
@@ -0,0 +1,35 @@
import { useAdminReservation, useAdminReservations } from "../../../../src"
import { renderHook } from "@testing-library/react-hooks"
import { fixtures } from "../../../../mocks/data"
import { createWrapper } from "../../../utils"
describe("useAdminShippingProfiles hook", () => {
test("returns a list of shipping profiles", async () => {
const reservations = fixtures.list("reservation")
const { result, waitFor } = renderHook(() => useAdminReservations(), {
wrapper: createWrapper(),
})
await waitFor(() => result.current.isSuccess)
expect(result.current.response.status).toEqual(200)
expect(result.current.reservations).toEqual(reservations)
})
})
describe("useAdminShippingProfile hook", () => {
test("returns a shipping profile", async () => {
const reservation = fixtures.get("reservation")
const { result, waitFor } = renderHook(
() => useAdminReservation(reservation.id),
{
wrapper: createWrapper(),
}
)
await waitFor(() => result.current.isSuccess)
expect(result.current.response.status).toEqual(200)
expect(result.current.reservation).toEqual(reservation)
})
})
@@ -97,15 +97,15 @@ describe("useAdminDeleteProductsFromSalesChannel hook", () => {
{ wrapper: createWrapper() }
)
result.current.mutate({ product_ids: [
{ id: productId }
]})
result.current.mutate({ product_ids: [{ id: productId }] })
await waitFor(() => result.current.isSuccess)
expect(result.current.data).toEqual(expect.objectContaining({
sales_channel: fixtures.get("sales_channel"),
}))
expect(result.current.data).toEqual(
expect.objectContaining({
sales_channel: fixtures.get("sales_channel"),
})
)
})
})
@@ -119,14 +119,14 @@ describe("useAdminAddProductsToSalesChannel hook", () => {
{ wrapper: createWrapper() }
)
result.current.mutate({ product_ids: [
{ id: productId }
]})
result.current.mutate({ product_ids: [{ id: productId }] })
await waitFor(() => result.current.isSuccess)
expect(result.current.data).toEqual(expect.objectContaining({
sales_channel: fixtures.get("sales_channel"),
}))
expect(result.current.data).toEqual(
expect.objectContaining({
sales_channel: fixtures.get("sales_channel"),
})
)
})
})
@@ -0,0 +1,87 @@
import { renderHook } from "@testing-library/react-hooks"
import { fixtures } from "../../../../mocks/data"
import {
useAdminCreateStockLocation,
useAdminDeleteStockLocation,
useAdminUpdateStockLocation,
} from "../../../../src"
import { createWrapper } from "../../../utils"
describe("useAdminUpdateStockLocation hook", () => {
test("updates a stock location", async () => {
const payload = {
name: "updated name",
}
const { result, waitFor } = renderHook(
() => useAdminUpdateStockLocation("stock-location-id"),
{
wrapper: createWrapper(),
}
)
result.current.mutate(payload)
await waitFor(() => result.current.isSuccess)
expect(result.current.data.response.status).toEqual(200)
expect(result.current.data.stock_location).toEqual(
expect.objectContaining({
id: "stock-location-id",
name: "updated name",
})
)
})
})
describe("useAdminCreateStockLocation hook", () => {
test("creates a stock location", async () => {
const locationFixture = fixtures.get("stock_location")
const payload = {
name: "updated name",
}
const { result, waitFor } = renderHook(
() => useAdminCreateStockLocation(),
{
wrapper: createWrapper(),
}
)
result.current.mutate(payload)
await waitFor(() => result.current.isSuccess)
expect(result.current.data.response.status).toEqual(200)
expect(result.current.data.stock_location).toEqual(
expect.objectContaining({
...locationFixture,
...payload,
})
)
})
})
describe("useAdminDeleteStockLocation hook", () => {
test("deletes a stock location", async () => {
const { result, waitFor } = renderHook(
() => useAdminDeleteStockLocation("stock-location-id"),
{
wrapper: createWrapper(),
}
)
result.current.mutate()
await waitFor(() => result.current.isSuccess)
expect(result.current.data.response.status).toEqual(200)
expect(result.current.data).toEqual(
expect.objectContaining({
id: "stock-location-id",
object: "stock_location",
deleted: true,
})
)
})
})
@@ -0,0 +1,40 @@
import { renderHook } from "@testing-library/react-hooks"
import { fixtures } from "../../../../mocks/data"
import { useAdminStockLocation, useAdminStockLocations } from "../../../../src"
import { createWrapper } from "../../../utils"
describe("useAdminUpdateStockLocation hook", () => {
test("gets a stock location", async () => {
const stockLocation = fixtures.get("stock_location")
const { result, waitFor } = renderHook(
() => useAdminStockLocation("stock-location-id"),
{
wrapper: createWrapper(),
}
)
await waitFor(() => result.current.isSuccess)
expect(result.current.response.status).toEqual(200)
expect(result.current.stock_location).toEqual(
expect.objectContaining({
...stockLocation,
id: "stock-location-id",
})
)
})
})
describe("useAdminUpdateStockLocations hook", () => {
test("lists stock locations", async () => {
const stockLocation = fixtures.list("stock_location")
const { result, waitFor } = renderHook(() => useAdminStockLocations(), {
wrapper: createWrapper(),
})
await waitFor(() => result.current.isSuccess)
expect(result.current.response.status).toEqual(200)
expect(result.current.stock_locations).toEqual(stockLocation)
})
})
@@ -1,4 +1,4 @@
import { useAdminVariants } from "../../../../src"
import { useAdminVariants, useAdminVariantsInventory } from "../../../../src"
import { renderHook } from "@testing-library/react-hooks"
import { fixtures } from "../../../../mocks/data"
import { createWrapper } from "../../../utils"
@@ -16,3 +16,29 @@ describe("useAdminVariants hook", () => {
expect(result.current.variants).toEqual(variants)
})
})
describe("useAdminVariants hook", () => {
test("returns a variant with saleschannel locations", async () => {
const variant = fixtures.get("product_variant")
const { result, waitFor } = renderHook(
() => useAdminVariantsInventory(variant.id),
{
wrapper: createWrapper(),
}
)
await waitFor(() => result.current.isSuccess)
expect(result.current.response.status).toEqual(200)
expect(result.current.variant).toEqual({
...variant,
sales_channel_availability: [
{
channel_name: "default channel",
channel_id: "1",
available_quantity: 10,
},
],
})
})
})