* feat(): Translation first steps * feat(): locale middleware * feat(): readonly links * feat(): feature flag * feat(): modules sdk * feat(): translation module re export * start adding workflows * update typings * update typings * test(): Add integration tests * test(): centralize filters preparation * test(): centralize filters preparation * remove unnecessary importy * fix workflows * Define StoreLocale inside Store Module * Link definition to extend Store with supported_locales * store_locale migration * Add supported_locales handling in Store Module * Tests * Accept supported_locales in Store endpoints * Add locales to js-sdk * Include locale list and default locale in Store Detail section * Initialize local namespace in js-sdk * Add locales route * Make code primary key of locale table to facilitate upserts * Add locales routes * Show locale code as is * Add list translations api route * Batch endpoint * Types * New batchTranslationsWorkflow and various updates to existent ones * Edit default locale UI * WIP * Apply translation agnostically * middleware * Apply translation agnostically * fix Apply translation agnostically * apply translations to product list * Add feature flag * fetch translations by batches of 250 max * fix apply * improve and test util * apply to product list * dont manage translations if no locale * normalize locale * potential todo * Protect translations routes with feature flag * Extract normalize locale util to core/utils * Normalize locale on write * Normalize locale for read * Use feature flag to guard translations UI across the board * Avoid throwing incorrectly when locale_code not present in partial updates * move applyTranslations util * remove old tests * fix util tests * fix(): product end points * cleanup * update lock * remove unused var * cleanup * fix apply locale * missing new dep for test utils * Change entity_type, entity_id to reference, reference_id * Remove comment * Avoid registering translations route if ff not enabled * Prevent registering express handler for disabled route via defineFileConfig * Add tests * Add changeset * Update test * fix integration tests, module and internals * Add locale id plus fixed * Allow to pass array of reference_id * fix unit tests * fix link loading * fix store route * fix sales channel test * fix tests --------- Co-authored-by: Nicolas Gorga <nicogorga11@gmail.com> Co-authored-by: Oli Juhl <59018053+olivermrbl@users.noreply.github.com>
229 lines
6.4 KiB
TypeScript
229 lines
6.4 KiB
TypeScript
import { medusaIntegrationTestRunner } from "@medusajs/test-utils"
|
|
import {
|
|
createAdminUser,
|
|
adminHeaders,
|
|
} from "../../../../helpers/create-admin-user"
|
|
|
|
jest.setTimeout(30000)
|
|
|
|
medusaIntegrationTestRunner({
|
|
env: {},
|
|
testSuite: ({ dbConnection, getContainer, api }) => {
|
|
let pricePreference1
|
|
let pricePreference2
|
|
|
|
beforeEach(async () => {
|
|
const container = getContainer()
|
|
await createAdminUser(dbConnection, adminHeaders, container)
|
|
|
|
pricePreference1 = (
|
|
await api.post(
|
|
"/admin/price-preferences",
|
|
{
|
|
attribute: "region_id",
|
|
value: "region-1",
|
|
is_tax_inclusive: true,
|
|
},
|
|
adminHeaders
|
|
)
|
|
).data.price_preference
|
|
|
|
pricePreference2 = (
|
|
await api.post(
|
|
"/admin/price-preferences",
|
|
{
|
|
attribute: "currency_code",
|
|
value: "EUR",
|
|
is_tax_inclusive: true,
|
|
},
|
|
adminHeaders
|
|
)
|
|
).data.price_preference
|
|
})
|
|
|
|
describe("/admin/price-preferences", () => {
|
|
describe("POST /admin/price-preferences", () => {
|
|
it("creates a price preference", async () => {
|
|
const newPricePreference = (
|
|
await api.post(
|
|
"/admin/price-preferences",
|
|
{
|
|
attribute: "region_id",
|
|
value: "region-2",
|
|
is_tax_inclusive: true,
|
|
},
|
|
adminHeaders
|
|
)
|
|
).data.price_preference
|
|
|
|
expect(newPricePreference).toEqual(
|
|
expect.objectContaining({
|
|
attribute: "region_id",
|
|
value: "region-2",
|
|
is_tax_inclusive: true,
|
|
})
|
|
)
|
|
})
|
|
|
|
it("creates a price preference with false tax inclusivity by default", async () => {
|
|
const newPricePreference = (
|
|
await api.post(
|
|
"/admin/price-preferences",
|
|
{
|
|
attribute: "region_id",
|
|
value: "region-2",
|
|
},
|
|
adminHeaders
|
|
)
|
|
).data.price_preference
|
|
|
|
expect(newPricePreference).toEqual(
|
|
expect.objectContaining({
|
|
attribute: "region_id",
|
|
value: "region-2",
|
|
is_tax_inclusive: false,
|
|
})
|
|
)
|
|
})
|
|
})
|
|
|
|
describe("GET /admin/price-preferences", () => {
|
|
it("returns a list of price preferences", async () => {
|
|
const response = (
|
|
await api.get("/admin/price-preferences", adminHeaders)
|
|
).data.price_preferences
|
|
|
|
expect(response).toEqual(
|
|
expect.arrayContaining([
|
|
expect.objectContaining({
|
|
attribute: "region_id",
|
|
value: "region-1",
|
|
is_tax_inclusive: true,
|
|
}),
|
|
expect.objectContaining({
|
|
attribute: "currency_code",
|
|
value: "EUR",
|
|
is_tax_inclusive: true,
|
|
}),
|
|
])
|
|
)
|
|
})
|
|
it("filters price preferences by attribute", async () => {
|
|
const response = (
|
|
await api.get(
|
|
"/admin/price-preferences?attribute=region_id",
|
|
adminHeaders
|
|
)
|
|
).data.price_preferences
|
|
|
|
expect(response).toEqual([
|
|
expect.objectContaining({
|
|
attribute: "region_id",
|
|
value: "region-1",
|
|
is_tax_inclusive: true,
|
|
}),
|
|
])
|
|
})
|
|
})
|
|
|
|
describe("GET /admin/price-preferences/:id", () => {
|
|
it("returns a price preference by :id", async () => {
|
|
const response = (
|
|
await api.get(
|
|
`/admin/price-preferences/${pricePreference1.id}`,
|
|
adminHeaders
|
|
)
|
|
).data.price_preference
|
|
|
|
expect(response).toEqual(
|
|
expect.objectContaining({
|
|
attribute: "region_id",
|
|
value: "region-1",
|
|
is_tax_inclusive: true,
|
|
})
|
|
)
|
|
})
|
|
})
|
|
|
|
describe("POST /admin/price-preferences/:id", () => {
|
|
it("updates a price preference", async () => {
|
|
const response = (
|
|
await api.post(
|
|
`/admin/price-preferences/${pricePreference1.id}`,
|
|
{
|
|
attribute: "region_id",
|
|
value: "region-2",
|
|
is_tax_inclusive: false,
|
|
},
|
|
adminHeaders
|
|
)
|
|
).data.price_preference
|
|
|
|
expect(response).toEqual(
|
|
expect.objectContaining({
|
|
attribute: "region_id",
|
|
value: "region-2",
|
|
is_tax_inclusive: false,
|
|
})
|
|
)
|
|
})
|
|
it("updates the tax inclusivity in the price preference", async () => {
|
|
const response = (
|
|
await api.post(
|
|
`/admin/price-preferences/${pricePreference1.id}`,
|
|
{
|
|
is_tax_inclusive: false,
|
|
},
|
|
adminHeaders
|
|
)
|
|
).data.price_preference
|
|
|
|
expect(response).toEqual(
|
|
expect.objectContaining({
|
|
attribute: "region_id",
|
|
value: "region-1",
|
|
is_tax_inclusive: false,
|
|
})
|
|
)
|
|
})
|
|
})
|
|
|
|
describe("DELETE /admin/price-preferences/:id", () => {
|
|
it("Deletes a price preference", async () => {
|
|
const deleteResponse = await api.delete(
|
|
`/admin/price-preferences/${pricePreference1.id}`,
|
|
adminHeaders
|
|
)
|
|
|
|
const remainingPricePreferences = (
|
|
await api.get("/admin/price-preferences", adminHeaders)
|
|
).data.price_preferences
|
|
|
|
expect(deleteResponse.data).toEqual(
|
|
expect.objectContaining({
|
|
id: pricePreference1.id,
|
|
object: "price_preference",
|
|
deleted: true,
|
|
})
|
|
)
|
|
|
|
expect(remainingPricePreferences).toEqual(
|
|
expect.arrayContaining([
|
|
expect.objectContaining({
|
|
attribute: "currency_code",
|
|
value: "EUR",
|
|
is_tax_inclusive: true,
|
|
}),
|
|
expect.objectContaining({
|
|
attribute: "currency_code",
|
|
value: "eur",
|
|
is_tax_inclusive: false,
|
|
}),
|
|
])
|
|
)
|
|
})
|
|
})
|
|
})
|
|
},
|
|
})
|