feat(medusa): handle product categories in import/export strategies (#3842)

**What**
- add ProductCategories to import and export strategies
- refactor ProductCategoriesService methods to use "retrieve_" pattern

---

RESOLVES CORE-1275
This commit is contained in:
Frane Polić
2023-05-08 08:58:11 +00:00
committed by GitHub
parent 0c58ead6d8
commit a8e73942e6
10 changed files with 553 additions and 107 deletions
@@ -1,3 +1,4 @@
import { ProductCategory } from "@medusajs/medusa"
import path from "path"
import startServerWithEnvironment from "../../../helpers/start-server-with-environment"
@@ -56,7 +57,7 @@ describe("/store/product-categories", () => {
parent_category: productCategory,
is_active: true,
is_internal: false,
rank: 3
rank: 3,
})
productCategoryChild2 = await simpleProductCategoryFactory(dbConnection, {
@@ -80,7 +81,7 @@ describe("/store/product-categories", () => {
parent_category: productCategory,
is_active: true,
is_internal: false,
rank: 2
rank: 2,
})
})
@@ -94,7 +95,7 @@ describe("/store/product-categories", () => {
const api = useApi()
const response = await api.get(
`/store/product-categories/${productCategory.id}?fields=handle,name,description`,
`/store/product-categories/${productCategory.id}?fields=handle,name,description`
)
expect(response.data.product_category).toEqual(
@@ -107,7 +108,7 @@ describe("/store/product-categories", () => {
id: productCategoryParent.id,
handle: productCategoryParent.handle,
name: productCategoryParent.name,
description: "test description"
description: "test description",
}),
category_children: [
expect.objectContaining({
@@ -120,7 +121,7 @@ describe("/store/product-categories", () => {
handle: productCategoryChild.handle,
name: productCategoryChild.name,
}),
]
],
})
)
@@ -130,40 +131,42 @@ describe("/store/product-categories", () => {
it("throws error on querying not allowed fields", async () => {
const api = useApi()
const error = await api.get(
`/store/product-categories/${productCategory.id}?fields=mpath`,
).catch(e => e)
const error = await api
.get(`/store/product-categories/${productCategory.id}?fields=mpath`)
.catch((e) => e)
expect(error.response.status).toEqual(400)
expect(error.response.data.type).toEqual('invalid_data')
expect(error.response.data.message).toEqual('Fields [mpath] are not valid')
expect(error.response.data.type).toEqual("invalid_data")
expect(error.response.data.message).toEqual(
"Fields [mpath] are not valid"
)
})
it("throws error on querying for internal product category", async () => {
const api = useApi()
const error = await api.get(
`/store/product-categories/${productCategoryChild2.id}`,
).catch(e => e)
const error = await api
.get(`/store/product-categories/${productCategoryChild2.id}`)
.catch((e) => e)
expect(error.response.status).toEqual(404)
expect(error.response.data.type).toEqual('not_found')
expect(error.response.data.type).toEqual("not_found")
expect(error.response.data.message).toEqual(
`ProductCategory with id: ${productCategoryChild2.id} was not found`
`ProductCategory with id: ${productCategoryChild2.id}, is_internal: false, is_active: true was not found`
)
})
it("throws error on querying for inactive product category", async () => {
const api = useApi()
const error = await api.get(
`/store/product-categories/${productCategoryChild3.id}`,
).catch(e => e)
const error = await api
.get(`/store/product-categories/${productCategoryChild3.id}`)
.catch((e) => e)
expect(error.response.status).toEqual(404)
expect(error.response.data.type).toEqual('not_found')
expect(error.response.data.type).toEqual("not_found")
expect(error.response.data.message).toEqual(
`ProductCategory with id: ${productCategoryChild3.id} was not found`
`ProductCategory with id: ${productCategoryChild3.id}, is_internal: false, is_active: true was not found`
)
})
})
@@ -186,60 +189,58 @@ describe("/store/product-categories", () => {
expect(response.data.offset).toEqual(0)
expect(response.data.limit).toEqual(10)
expect(response.data.product_categories).toEqual(
[
expect.objectContaining({
id: productCategory.id,
rank: 0,
parent_category: expect.objectContaining({
id: productCategoryParent.id,
}),
category_children: [
expect.objectContaining({
id: productCategoryChild4.id,
rank: 2,
}),
expect.objectContaining({
id: productCategoryChild.id,
rank: 3,
}),
],
}),
expect.objectContaining({
expect(response.data.product_categories).toEqual([
expect.objectContaining({
id: productCategory.id,
rank: 0,
parent_category: expect.objectContaining({
id: productCategoryParent.id,
parent_category: null,
rank: 0,
category_children: [
expect.objectContaining({
id: productCategory.id,
})
],
}),
expect.objectContaining({
id: productCategoryChild4.id,
rank: 2,
parent_category: expect.objectContaining({
category_children: [
expect.objectContaining({
id: productCategoryChild4.id,
rank: 2,
}),
expect.objectContaining({
id: productCategoryChild.id,
rank: 3,
}),
],
}),
expect.objectContaining({
id: productCategoryParent.id,
parent_category: null,
rank: 0,
category_children: [
expect.objectContaining({
id: productCategory.id,
}),
category_children: [],
],
}),
expect.objectContaining({
id: productCategoryChild4.id,
rank: 2,
parent_category: expect.objectContaining({
id: productCategory.id,
}),
expect.objectContaining({
id: productCategoryChild.id,
rank: 3,
parent_category: expect.objectContaining({
id: productCategory.id,
}),
category_children: [],
category_children: [],
}),
expect.objectContaining({
id: productCategoryChild.id,
rank: 3,
parent_category: expect.objectContaining({
id: productCategory.id,
}),
]
)
category_children: [],
}),
])
})
it("gets list of product category with all childrens when include_descendants_tree=true", async () => {
const api = useApi()
const response = await api.get(
`/store/product-categories?parent_category_id=null&include_descendants_tree=true&limit=10`,
`/store/product-categories?parent_category_id=null&include_descendants_tree=true&limit=10`
)
expect(response.status).toEqual(200)
@@ -260,7 +261,7 @@ describe("/store/product-categories", () => {
id: productCategoryChild4.id,
parent_category_id: productCategory.id,
category_children: [],
rank: 2
rank: 2,
}),
expect.objectContaining({
id: productCategoryChild.id,
@@ -279,32 +280,36 @@ describe("/store/product-categories", () => {
it("throws error when querying not allowed fields", async () => {
const api = useApi()
const error = await api.get(
`/store/product-categories?is_internal=true&limit=10`,
).catch(e => e)
const error = await api
.get(`/store/product-categories?is_internal=true&limit=10`)
.catch((e) => e)
expect(error.response.status).toEqual(400)
expect(error.response.data.type).toEqual('invalid_data')
expect(error.response.data.message).toEqual('property is_internal should not exist')
expect(error.response.data.type).toEqual("invalid_data")
expect(error.response.data.message).toEqual(
"property is_internal should not exist"
)
})
it("filters based on free text on name and handle columns", async () => {
const api = useApi()
const response = await api.get(
`/store/product-categories?q=category-parent&limit=10`,
`/store/product-categories?q=category-parent&limit=10`
)
expect(response.status).toEqual(200)
expect(response.data.count).toEqual(1)
expect(response.data.product_categories[0].id).toEqual(productCategoryParent.id)
expect(response.data.product_categories[0].id).toEqual(
productCategoryParent.id
)
})
it("filters based on handle attribute of the data model", async () => {
const api = useApi()
const response = await api.get(
`/store/product-categories?handle=${productCategory.handle}&limit=10`,
`/store/product-categories?handle=${productCategory.handle}&limit=10`
)
expect(response.status).toEqual(200)
@@ -316,39 +321,39 @@ describe("/store/product-categories", () => {
const api = useApi()
const response = await api.get(
`/store/product-categories?parent_category_id=${productCategory.id}&limit=10`,
`/store/product-categories?parent_category_id=${productCategory.id}&limit=10`
)
expect(response.status).toEqual(200)
expect(response.data.count).toEqual(2)
expect(response.data.product_categories).toEqual(
[
expect.objectContaining({
id: productCategoryChild4.id,
category_children: [],
parent_category: expect.objectContaining({
id: productCategory.id,
}),
rank: 2
expect(response.data.product_categories).toEqual([
expect.objectContaining({
id: productCategoryChild4.id,
category_children: [],
parent_category: expect.objectContaining({
id: productCategory.id,
}),
expect.objectContaining({
id: productCategoryChild.id,
category_children: [],
parent_category: expect.objectContaining({
id: productCategory.id,
}),
rank: 3
rank: 2,
}),
expect.objectContaining({
id: productCategoryChild.id,
category_children: [],
parent_category: expect.objectContaining({
id: productCategory.id,
}),
]
)
rank: 3,
}),
])
const nullCategoryResponse = await api.get(
`/store/product-categories?parent_category_id=null`,
).catch(e => e)
const nullCategoryResponse = await api
.get(`/store/product-categories?parent_category_id=null`)
.catch((e) => e)
expect(nullCategoryResponse.status).toEqual(200)
expect(nullCategoryResponse.data.count).toEqual(1)
expect(nullCategoryResponse.data.product_categories[0].id).toEqual(productCategoryParent.id)
expect(nullCategoryResponse.data.product_categories[0].id).toEqual(
productCategoryParent.id
)
})
})
})