feat(medusa): Create/update Product Sales Channels (#1870)

* feat(medusa): Allow to create/update object sales channels assignment

* feat(medusa): cleanup

* feat(medusa): Update oas

* feat(medusa): Only add relation if required

* feat(medusa): Add feature flag decorators

* style(medusa): PR feedback

* feat(medusa): Remove circular by moving sales channel product existence check to the repo layer

* feat(medusa): Reduce selected column as they are not necessary

* feat(medusa): Refactor repository and usage

* feat(medusa): Improve entity name formatting

* feat(medusa): Add feature flag to the service

* fix(medusa): typo

* test(medusa): fix unit tests

* feat(medusa): include feedback

* feat(medusa): Adds validator pipe for Sales Channel existence (#1930)

* feat(medusa): Allow to create/update object sales channels assignment

* feat(medusa): cleanup

* feat(medusa): Update oas

* feat(medusa): Only add relation if required

* feat(medusa): Add feature flag decorators

* style(medusa): PR feedback

* feat(medusa): Remove circular by moving sales channel product existence check to the repo layer

* feat(medusa): Reduce selected column as they are not necessary

* feat(medusa): Refactor repository and usage

* feat(medusa): Improve entity name formatting

* feat(medusa): Add feature flag to the service

* fix(medusa): typo

* test(medusa): fix unit tests

* feat(medusa): Adds validator pipe for Sales Channel existence

* feat: Move product payload classes to types file

* fix unit tests

* fix integration test

Co-authored-by: adrien2p <adrien.deperetti@gmail.com>

* feat(medusa): Revert base repository and related

* feat(medusa): cleanup

* remove base repo export

Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com>
This commit is contained in:
Adrien de Peretti
2022-07-28 20:19:30 +02:00
committed by GitHub
co-authored by Oliver Windall Juhl
parent 5ce8839c54
commit 3b28998421
18 changed files with 533 additions and 146 deletions
@@ -895,5 +895,223 @@ describe("sales channels", () => {
)
})
})
describe("POST /admin/products", () => {
let salesChannel
beforeEach(async () => {
try {
await productSeeder(dbConnection)
await adminSeeder(dbConnection)
salesChannel = await simpleSalesChannelFactory(dbConnection, {
name: "test name",
description: "test description",
})
} catch (err) {
console.log(err)
throw err
}
})
afterEach(async () => {
const db = useDb()
await db.teardown()
})
it("should creates a product that is assigned to a sales_channel", async () => {
const api = useApi()
const payload = {
title: "Test",
description: "test-product-description",
type: { value: "test-type" },
options: [{ title: "size" }, { title: "color" }],
variants: [
{
title: "Test variant",
inventory_quantity: 10,
prices: [{ currency_code: "usd", amount: 100 }],
options: [{ value: "large" }, { value: "green" }],
},
],
sales_channels: [{ id: salesChannel.id }],
}
const response = await api
.post("/admin/products", payload, {
headers: {
Authorization: "Bearer test_token",
},
})
.catch((err) => {
console.log(err)
})
expect(response.status).toEqual(200)
expect(response.data.product).toEqual(
expect.objectContaining({
sales_channels: [
expect.objectContaining({
id: salesChannel.id,
name: salesChannel.name,
}),
],
})
)
})
})
describe("POST /admin/products/:id", () => {
let salesChannel
beforeEach(async () => {
try {
await productSeeder(dbConnection)
await adminSeeder(dbConnection)
salesChannel = await simpleSalesChannelFactory(dbConnection, {
name: "test name",
description: "test description",
})
} catch (err) {
console.log(err)
throw err
}
})
afterEach(async () => {
const db = useDb()
await db.teardown()
})
it("should update a product sales channels assignation with either a sales channel, null, [] or undefined", async () => {
const api = useApi()
let response = await api
.post(
"/admin/products/test-product",
{
sales_channels: null,
},
{
headers: {
Authorization: "Bearer test_token",
},
}
)
.catch((err) => {
console.log(err)
})
expect(response.status).toEqual(200)
expect(response.data.product).toEqual(
expect.objectContaining({
sales_channels: [],
})
)
response = await api
.post(
"/admin/products/test-product",
{
sales_channels: [{ id: salesChannel.id }],
},
{
headers: {
Authorization: "Bearer test_token",
},
}
)
.catch((err) => {
console.log(err)
})
expect(response.status).toEqual(200)
expect(response.data.product).toEqual(
expect.objectContaining({
sales_channels: [
expect.objectContaining({
id: salesChannel.id,
name: salesChannel.name,
}),
],
})
)
response = await api
.post(
"/admin/products/test-product",
{},
{
headers: {
Authorization: "Bearer test_token",
},
}
)
.catch((err) => {
console.log(err)
})
expect(response.status).toEqual(200)
expect(response.data.product).toEqual(
expect.objectContaining({
sales_channels: [
expect.objectContaining({
id: salesChannel.id,
name: salesChannel.name,
}),
],
})
)
response = await api
.post(
"/admin/products/test-product",
{
sales_channels: [],
},
{
headers: {
Authorization: "Bearer test_token",
},
}
)
.catch((err) => {
console.log(err)
})
expect(response.status).toEqual(200)
expect(response.data.product).toEqual(
expect.objectContaining({
sales_channels: [],
})
)
})
it("should throw on update if the sales channels does not exists", async () => {
const api = useApi()
const err = await api
.post(
"/admin/products/test-product",
{
sales_channels: [{ id: "fake_id" }, { id: "fake_id_2" }],
},
{
headers: {
Authorization: "Bearer test_token",
},
}
)
.catch((err) => err)
expect(err.response.status).toEqual(400)
expect(err.response.data.message).toBe(
"Provided request body contains errors. Please check the data and retry the request"
)
expect(err.response.data.errors).toEqual([
"Sales Channels fake_id, fake_id_2 do not exist",
])
})
})
})
})