Files
medusa-store/integration-tests/http/__tests__/price-preference/admin/price-preference.spec.ts
Adrien de Peretti 6dc0b8bed8 feat(): Introduce translation module and preliminary application of them (#14189)
* 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>
2025-12-08 19:33:08 +01:00

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,
}),
])
)
})
})
})
},
})