fix: Several fixes to store product endpoints, moved several test suites to HTTP (#7601)

* chore: Move publishable api key tests to HTTP

* chore: Move store tests to HTTP folder

* fix: Add tests for store products, fix several bugs around publishable keys
This commit is contained in:
Stevche Radevski
2024-06-04 21:00:07 +02:00
committed by GitHub
parent d104d1a256
commit e44fe78b96
24 changed files with 2301 additions and 2763 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,283 +0,0 @@
const {
createAdminUser,
adminHeaders,
} = require("../../../helpers/create-admin-user")
const { breaking } = require("../../../helpers/breaking")
const { ModuleRegistrationName } = require("@medusajs/modules-sdk")
const { medusaIntegrationTestRunner } = require("medusa-test-utils")
jest.setTimeout(90000)
medusaIntegrationTestRunner({
testSuite: ({ dbConnection, getContainer, api }) => {
describe("/admin/store", () => {
let dbStore
let container
// Note: The tests rely on the loader running and populating clean data before and after the test, so we have to do this in a beforeEach
beforeEach(async () => {
container = getContainer()
await createAdminUser(dbConnection, adminHeaders, container)
await breaking(
async () => {
const { Store } = require("@medusajs/medusa/dist/models/store")
const manager = dbConnection.manager
dbStore = await manager.findOne(Store, {
where: { name: "Medusa Store" },
})
await manager.query(
`INSERT INTO store_currencies (store_id, currency_code)
VALUES ('${dbStore.id}', 'dkk')`
)
},
async () => {
const service = container.resolve(ModuleRegistrationName.STORE)
dbStore = await service.create({
supported_currency_codes: ["usd", "dkk"],
default_currency_code: "usd",
default_sales_channel_id: "sc_12345",
})
}
)
})
describe("Store creation", () => {
it("has created store with default currency", async () => {
const store = await breaking(
() =>
api.get("/admin/store", adminHeaders).then((r) => r.data.store),
() =>
api
.get("/admin/stores", adminHeaders)
.then((r) =>
r.data.stores.find(
(s) => s.default_sales_channel_id === "sc_12345"
)
)
)
expect(store).toEqual(
expect.objectContaining({
id: expect.any(String),
name: "Medusa Store",
default_currency_code: "usd",
default_sales_channel_id: expect.any(String),
...breaking(
() => ({
default_sales_channel: expect.objectContaining({
id: expect.any(String),
}),
currencies: expect.arrayContaining([
expect.objectContaining({
code: "usd",
}),
]),
modules: expect.any(Array),
feature_flags: expect.any(Array),
}),
() => ({
supported_currency_codes: ["usd", "dkk"],
})
),
created_at: expect.any(String),
updated_at: expect.any(String),
})
)
})
})
describe("POST /admin/store", () => {
it("fails to update default currency if not in store currencies", async () => {
try {
await api.post(
breaking(
() => "/admin/store",
() => `/admin/stores/${dbStore.id}`
),
{
default_currency_code: "eur",
},
adminHeaders
)
} catch (e) {
expect(e.response.data).toEqual(
expect.objectContaining({
type: "invalid_data",
message: "Store does not have currency: eur",
})
)
expect(e.response.status).toBe(400)
}
})
it("fails to remove default currency from currencies without replacing it", async () => {
try {
await api.post(
breaking(
() => "/admin/store",
() => `/admin/stores/${dbStore.id}`
),
breaking(
() => ({
currencies: ["usd"],
}),
() => ({ supported_currency_codes: ["dkk"] })
),
adminHeaders
)
} catch (e) {
expect(e.response.data).toEqual(
expect.objectContaining({
type: "invalid_data",
message:
"You are not allowed to remove default currency from store currencies without replacing it as well",
})
)
expect(e.response.status).toBe(400)
}
})
it("successfully updates default currency code", async () => {
const response = await api
.post(
breaking(
() => "/admin/store",
() => `/admin/stores/${dbStore.id}`
),
{
default_currency_code: "dkk",
},
adminHeaders
)
.catch((err) => console.log(err))
expect(response.status).toEqual(200)
expect(response.data.store).toEqual(
expect.objectContaining({
id: expect.any(String),
name: "Medusa Store",
default_currency_code: "dkk",
created_at: expect.any(String),
updated_at: expect.any(String),
})
)
})
it("successfully updates default currency and store currencies", async () => {
const response = await api.post(
breaking(
() => "/admin/store",
() => `/admin/stores/${dbStore.id}`
),
{
default_currency_code: "jpy",
...breaking(
() => ({ currencies: ["jpy", "usd"] }),
() => ({ supported_currency_codes: ["jpy", "usd"] })
),
},
adminHeaders
)
expect(response.status).toEqual(200)
expect(response.data.store).toEqual(
expect.objectContaining({
id: expect.any(String),
name: "Medusa Store",
default_sales_channel_id: expect.any(String),
...breaking(
() => ({
currencies: expect.arrayContaining([
expect.objectContaining({
code: "jpy",
}),
expect.objectContaining({
code: "usd",
}),
]),
}),
() => ({ supported_currency_codes: ["jpy", "usd"] })
),
default_currency_code: "jpy",
created_at: expect.any(String),
updated_at: expect.any(String),
})
)
})
it("successfully updates and store currencies", async () => {
const response = await api.post(
breaking(
() => "/admin/store",
() => `/admin/stores/${dbStore.id}`
),
breaking(
() => ({
currencies: ["jpy", "usd"],
}),
() => ({
supported_currency_codes: ["jpy", "usd"],
})
),
adminHeaders
)
expect(response.status).toEqual(200)
expect(response.data.store).toEqual(
expect.objectContaining({
id: expect.any(String),
default_sales_channel_id: expect.any(String),
name: "Medusa Store",
...breaking(
() => ({
currencies: expect.arrayContaining([
expect.objectContaining({
code: "jpy",
}),
expect.objectContaining({
code: "usd",
}),
]),
}),
() => ({ supported_currency_codes: ["jpy", "usd"] })
),
default_currency_code: "usd",
created_at: expect.any(String),
updated_at: expect.any(String),
})
)
})
})
describe("GET /admin/store", () => {
it("supports searching of stores", async () => {
await breaking(
() => {},
async () => {
const service = container.resolve(ModuleRegistrationName.STORE)
const secondStore = await service.create({
name: "Second Store",
supported_currency_codes: ["eur"],
default_currency_code: "eur",
})
const response = await api.get(
"/admin/stores?q=second",
adminHeaders
)
expect(response.status).toEqual(200)
expect(response.data.stores).toEqual([
expect.objectContaining({
id: secondStore.id,
name: "Second Store",
}),
])
}
)
})
})
})
},
})

View File

@@ -1,293 +0,0 @@
const path = require("path")
const setupServer = require("../../../environment-helpers/setup-server")
const { useApi } = require("../../../environment-helpers/use-api")
const { initDb, useDb } = require("../../../environment-helpers/use-db")
const { simpleProductFactory } = require("../../../factories")
const adminSeeder = require("../../../helpers/admin-seeder")
const adminVariantsSeeder = require("../../../helpers/admin-variants-seeder")
const productSeeder = require("../../../helpers/product-seeder")
const adminHeaders = {
headers: {
"x-medusa-access-token": "test_token",
},
}
jest.setTimeout(30000)
describe("/admin/products", () => {
let medusaProcess
let dbConnection
beforeAll(async () => {
const cwd = path.resolve(path.join(__dirname, "..", ".."))
dbConnection = await initDb({ cwd })
medusaProcess = await setupServer({ cwd })
})
afterAll(async () => {
const db = useDb()
await db.shutdown()
medusaProcess.kill()
})
describe("GET /admin/product-variants", () => {
beforeEach(async () => {
await productSeeder(dbConnection)
await adminSeeder(dbConnection)
})
afterEach(async () => {
const db = useDb()
await db.teardown()
})
it("lists all product variants", async () => {
const api = useApi()
const response = await api
.get("/admin/variants/", adminHeaders)
.catch((err) => {
console.log(err)
})
expect(response.status).toEqual(200)
expect(response.data.variants).toEqual(
expect.arrayContaining([
expect.objectContaining(
{
id: "test-variant",
},
{
id: "test-variant_2",
},
{
id: "test-variant_1",
}
),
])
)
})
it("lists all product variants matching a specific sku", async () => {
const api = useApi()
const response = await api
.get("/admin/variants?q=sku2", adminHeaders)
.catch((err) => {
console.log(err)
})
expect(response.status).toEqual(200)
expect(response.data.variants.length).toEqual(1)
expect(response.data.variants).toEqual(
expect.arrayContaining([
expect.objectContaining({
sku: "test-sku2",
}),
])
)
})
it("lists all product variants matching a specific variant title", async () => {
const api = useApi()
const response = await api
.get("/admin/variants?q=rank (1)", adminHeaders)
.catch((err) => {
console.log(err)
})
expect(response.status).toEqual(200)
expect(response.data.variants.length).toEqual(1)
expect(response.data.variants).toEqual(
expect.arrayContaining([
expect.objectContaining({
id: "test-variant_1",
sku: "test-sku1",
}),
])
)
})
it("lists all product variants matching a specific product title", async () => {
const api = useApi()
const response = await api
.get("/admin/variants?q=Test product1", adminHeaders)
.catch((err) => {
console.log(err)
})
expect(response.status).toEqual(200)
expect(response.data.variants.length).toEqual(2)
expect(response.data.variants).toEqual(
expect.arrayContaining([
expect.objectContaining({
product_id: "test-product1",
id: "test-variant_3",
sku: "test-sku3",
}),
expect.objectContaining({
product_id: "test-product1",
id: "test-variant_4",
sku: "test-sku4",
}),
])
)
})
})
describe("GET /admin/variants price selection strategy", () => {
beforeEach(async () => {
try {
await adminVariantsSeeder(dbConnection)
} catch (err) {
console.log(err)
}
await adminSeeder(dbConnection)
})
afterEach(async () => {
const db = useDb()
await db.teardown()
})
it("selects prices based on the passed currency code", async () => {
const api = useApi()
const response = await api.get(
"/admin/variants?id=test-variant&currency_code=usd",
adminHeaders
)
expect(response.data).toMatchSnapshot({
variants: [
{
id: "test-variant",
original_price: 100,
calculated_price: 80,
calculated_price_type: "sale",
original_price_incl_tax: null,
calculated_price_incl_tax: null,
original_tax: null,
calculated_tax: null,
options: expect.any(Array),
prices: expect.any(Array),
product: expect.any(Object),
created_at: expect.any(String),
updated_at: expect.any(String),
},
],
})
})
it("selects prices based on the passed region id", async () => {
const api = useApi()
const response = await api.get(
"/admin/variants?id=test-variant&region_id=reg-europe",
adminHeaders
)
expect(response.data).toMatchSnapshot({
variants: [
{
id: "test-variant",
original_price: 100,
calculated_price: 80,
calculated_price_type: "sale",
original_price_incl_tax: 100,
calculated_price_incl_tax: 80,
original_tax: 0,
calculated_tax: 0,
options: expect.any(Array),
prices: expect.any(Array),
product: expect.any(Object),
created_at: expect.any(String),
updated_at: expect.any(String),
},
],
})
})
it("selects prices based on the passed region id and customer id", async () => {
const api = useApi()
const response = await api.get(
"/admin/variants?id=test-variant&region_id=reg-europe&customer_id=test-customer",
adminHeaders
)
expect(response.data).toMatchSnapshot({
variants: [
{
id: "test-variant",
original_price: 100,
calculated_price: 40,
calculated_price_type: "sale",
original_price_incl_tax: 100,
calculated_price_incl_tax: 40,
original_tax: 0,
calculated_tax: 0,
prices: expect.any(Array),
options: expect.any(Array),
product: expect.any(Object),
created_at: expect.any(String),
updated_at: expect.any(String),
},
],
})
})
it("returns a list of variants matching the given ids", async () => {
const api = useApi()
const productData = {
id: "test-product_filtering_by_variant_id",
title: "Test product filtering by variant id",
handle: "test-product_filtering_by_variant_id",
options: [
{
id: "test-product_filtering_by_variant_id-option",
title: "Size",
},
],
variants: [],
}
for (let i = 0; i < 25; i++) {
productData.variants.push({
product_id: productData.id,
sku: `test-product_filtering_by_variant_id-${i}`,
title: `test-product_filtering_by_variant_id-${i}`,
options: [
{
option_id: "test-product_filtering_by_variant_id-option",
value: `Large-${i}`,
},
],
})
}
const product = await simpleProductFactory(dbConnection, productData)
const variantIds = product.variants.map((v) => v.id)
const qs = "id[]=" + variantIds.join("&id[]=")
const response = await api
.get("/admin/variants?limit=30&" + qs, adminHeaders)
.catch((err) => {
console.log(err)
})
expect(response.status).toEqual(200)
expect(response.data.variants.length).toEqual(variantIds.length)
for (const variant of response.data.variants) {
expect(variantIds).toContain(variant.id)
}
})
})
})