**What** Update the `MedusaService` class, factory and types to remove the concept of main modules. The idea being that all method will be explicitly named and suffixes to represent the object you are trying to manipulate. This pr also includes various fixes in different modules Co-authored-by: Stevche Radevski <4820812+sradevski@users.noreply.github.com> Co-authored-by: Oli Juhl <59018053+olivermrbl@users.noreply.github.com>
324 lines
9.7 KiB
TypeScript
324 lines
9.7 KiB
TypeScript
import { ModuleRegistrationName } from "@medusajs/modules-sdk"
|
|
import { IPromotionModuleService } from "@medusajs/types"
|
|
import { PromotionType } from "@medusajs/utils"
|
|
import { medusaIntegrationTestRunner } from "medusa-test-utils"
|
|
import { createAdminUser } from "../../../../helpers/create-admin-user"
|
|
|
|
jest.setTimeout(50000)
|
|
|
|
const env = { MEDUSA_FF_MEDUSA_V2: true }
|
|
const adminHeaders = {
|
|
headers: { "x-medusa-access-token": "test_token" },
|
|
}
|
|
|
|
medusaIntegrationTestRunner({
|
|
env,
|
|
testSuite: ({ dbConnection, getContainer, api }) => {
|
|
describe("POST /admin/promotions", () => {
|
|
let appContainer
|
|
beforeAll(async () => {
|
|
appContainer = getContainer()
|
|
})
|
|
|
|
beforeEach(async () => {
|
|
await createAdminUser(dbConnection, adminHeaders, appContainer)
|
|
})
|
|
|
|
it("should throw an error if required params are not passed", async () => {
|
|
const { response } = await api
|
|
.post(
|
|
`/admin/promotions`,
|
|
{
|
|
type: PromotionType.STANDARD,
|
|
},
|
|
adminHeaders
|
|
)
|
|
.catch((e) => e)
|
|
|
|
expect(response.status).toEqual(400)
|
|
// expect(response.data.message).toEqual(
|
|
// "code must be a string, code should not be empty, application_method should not be empty"
|
|
// )
|
|
})
|
|
|
|
it("should create a standard promotion successfully", async () => {
|
|
const response = await api.post(
|
|
`/admin/promotions`,
|
|
{
|
|
code: "TEST",
|
|
type: PromotionType.STANDARD,
|
|
is_automatic: true,
|
|
campaign: {
|
|
name: "test",
|
|
campaign_identifier: "test-1",
|
|
budget: {
|
|
type: "usage",
|
|
limit: 100,
|
|
},
|
|
},
|
|
application_method: {
|
|
target_type: "items",
|
|
type: "fixed",
|
|
allocation: "each",
|
|
currency_code: "USD",
|
|
value: 100,
|
|
max_quantity: 100,
|
|
target_rules: [
|
|
{
|
|
attribute: "test.test",
|
|
operator: "eq",
|
|
values: ["test1", "test2"],
|
|
},
|
|
],
|
|
},
|
|
rules: [
|
|
{
|
|
attribute: "test.test",
|
|
operator: "eq",
|
|
values: ["test1", "test2"],
|
|
},
|
|
],
|
|
},
|
|
adminHeaders
|
|
)
|
|
|
|
expect(response.status).toEqual(200)
|
|
expect(response.data.promotion).toEqual(
|
|
expect.objectContaining({
|
|
id: expect.any(String),
|
|
code: "TEST",
|
|
type: "standard",
|
|
is_automatic: true,
|
|
campaign: expect.objectContaining({
|
|
name: "test",
|
|
campaign_identifier: "test-1",
|
|
budget: expect.objectContaining({
|
|
currency_code: null,
|
|
type: "usage",
|
|
limit: 100,
|
|
}),
|
|
}),
|
|
application_method: expect.objectContaining({
|
|
value: 100,
|
|
max_quantity: 100,
|
|
type: "fixed",
|
|
target_type: "items",
|
|
allocation: "each",
|
|
target_rules: [
|
|
expect.objectContaining({
|
|
operator: "eq",
|
|
attribute: "test.test",
|
|
values: expect.arrayContaining([
|
|
expect.objectContaining({ value: "test1" }),
|
|
expect.objectContaining({ value: "test2" }),
|
|
]),
|
|
}),
|
|
],
|
|
}),
|
|
rules: [
|
|
expect.objectContaining({
|
|
operator: "eq",
|
|
attribute: "test.test",
|
|
values: expect.arrayContaining([
|
|
expect.objectContaining({ value: "test1" }),
|
|
expect.objectContaining({ value: "test2" }),
|
|
]),
|
|
}),
|
|
],
|
|
})
|
|
)
|
|
})
|
|
|
|
it("should throw an error if buy_rules params are not passed", async () => {
|
|
const { response } = await api
|
|
.post(
|
|
`/admin/promotions`,
|
|
{
|
|
code: "TEST",
|
|
type: PromotionType.BUYGET,
|
|
is_automatic: true,
|
|
application_method: {
|
|
target_type: "items",
|
|
type: "fixed",
|
|
allocation: "each",
|
|
value: 100,
|
|
max_quantity: 100,
|
|
currency_code: "USD",
|
|
target_rules: [
|
|
{
|
|
attribute: "test.test",
|
|
operator: "eq",
|
|
values: ["test1", "test2"],
|
|
},
|
|
],
|
|
},
|
|
rules: [
|
|
{
|
|
attribute: "test.test",
|
|
operator: "eq",
|
|
values: ["test1", "test2"],
|
|
},
|
|
],
|
|
},
|
|
adminHeaders
|
|
)
|
|
.catch((e) => e)
|
|
|
|
expect(response.status).toEqual(400)
|
|
// expect(response.data.message).toEqual(
|
|
// "Buy rules are required for buyget promotion type"
|
|
// )
|
|
})
|
|
|
|
it("should throw an error if buy_rules params are not passed", async () => {
|
|
const { response } = await api
|
|
.post(
|
|
`/admin/promotions`,
|
|
{
|
|
code: "TEST",
|
|
type: PromotionType.BUYGET,
|
|
is_automatic: true,
|
|
application_method: {
|
|
target_type: "items",
|
|
type: "fixed",
|
|
allocation: "each",
|
|
value: 100,
|
|
max_quantity: 100,
|
|
currency_code: "USD",
|
|
buy_rules: [
|
|
{
|
|
attribute: "test.test",
|
|
operator: "eq",
|
|
values: ["test1", "test2"],
|
|
},
|
|
],
|
|
},
|
|
rules: [
|
|
{
|
|
attribute: "test.test",
|
|
operator: "eq",
|
|
values: ["test1", "test2"],
|
|
},
|
|
],
|
|
},
|
|
adminHeaders
|
|
)
|
|
.catch((e) => e)
|
|
|
|
expect(response.status).toEqual(400)
|
|
// expect(response.data.message).toEqual(
|
|
// "Target rules are required for buyget promotion type"
|
|
// )
|
|
})
|
|
|
|
it("should create a buyget promotion successfully", async () => {
|
|
const response = await api.post(
|
|
`/admin/promotions`,
|
|
{
|
|
code: "TEST",
|
|
type: PromotionType.BUYGET,
|
|
is_automatic: true,
|
|
campaign: {
|
|
name: "test",
|
|
campaign_identifier: "test-1",
|
|
budget: {
|
|
type: "usage",
|
|
limit: 100,
|
|
},
|
|
},
|
|
application_method: {
|
|
target_type: "items",
|
|
type: "fixed",
|
|
allocation: "each",
|
|
value: 100,
|
|
max_quantity: 100,
|
|
apply_to_quantity: 1,
|
|
buy_rules_min_quantity: 1,
|
|
currency_code: "USD",
|
|
target_rules: [
|
|
{
|
|
attribute: "test.test",
|
|
operator: "eq",
|
|
values: ["test1", "test2"],
|
|
},
|
|
],
|
|
buy_rules: [
|
|
{
|
|
attribute: "test.test",
|
|
operator: "eq",
|
|
values: ["test1", "test2"],
|
|
},
|
|
],
|
|
},
|
|
rules: [
|
|
{
|
|
attribute: "test.test",
|
|
operator: "eq",
|
|
values: ["test1", "test2"],
|
|
},
|
|
],
|
|
},
|
|
adminHeaders
|
|
)
|
|
|
|
expect(response.status).toEqual(200)
|
|
expect(response.data.promotion).toEqual(
|
|
expect.objectContaining({
|
|
id: expect.any(String),
|
|
code: "TEST",
|
|
type: "buyget",
|
|
is_automatic: true,
|
|
campaign: expect.objectContaining({
|
|
name: "test",
|
|
campaign_identifier: "test-1",
|
|
budget: expect.objectContaining({
|
|
type: "usage",
|
|
limit: 100,
|
|
}),
|
|
}),
|
|
application_method: expect.objectContaining({
|
|
value: 100,
|
|
max_quantity: 100,
|
|
type: "fixed",
|
|
target_type: "items",
|
|
allocation: "each",
|
|
apply_to_quantity: 1,
|
|
buy_rules_min_quantity: 1,
|
|
target_rules: [
|
|
expect.objectContaining({
|
|
operator: "eq",
|
|
attribute: "test.test",
|
|
values: expect.arrayContaining([
|
|
expect.objectContaining({ value: "test1" }),
|
|
expect.objectContaining({ value: "test2" }),
|
|
]),
|
|
}),
|
|
],
|
|
buy_rules: [
|
|
expect.objectContaining({
|
|
operator: "eq",
|
|
attribute: "test.test",
|
|
values: expect.arrayContaining([
|
|
expect.objectContaining({ value: "test1" }),
|
|
expect.objectContaining({ value: "test2" }),
|
|
]),
|
|
}),
|
|
],
|
|
}),
|
|
rules: [
|
|
expect.objectContaining({
|
|
operator: "eq",
|
|
attribute: "test.test",
|
|
values: expect.arrayContaining([
|
|
expect.objectContaining({ value: "test1" }),
|
|
expect.objectContaining({ value: "test2" }),
|
|
]),
|
|
}),
|
|
],
|
|
})
|
|
)
|
|
})
|
|
})
|
|
},
|
|
})
|