Files
medusa-store/integration-tests/modules/__tests__/tax/admin/tax.spec.ts
Riqwan Thamir 00e6b21bb5 feat(medusa,dashboard,tax): added tax rates and regions UI (#7026)
whats missing:

- make rules required for overrides
- conditions for other rules
- populating condition reference ids with labels on update

Co-authored-by: Adrien de Peretti <25098370+adrien2p@users.noreply.github.com>
2024-04-16 08:26:12 +00:00

581 lines
16 KiB
TypeScript

import { ModuleRegistrationName } from "@medusajs/modules-sdk"
import { ITaxModuleService } from "@medusajs/types"
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("Taxes - Admin", () => {
let appContainer
let service: ITaxModuleService
beforeAll(async () => {
appContainer = getContainer()
service = appContainer.resolve(ModuleRegistrationName.TAX)
})
beforeEach(async () => {
await createAdminUser(dbConnection, adminHeaders, appContainer)
})
it("can retrieve a tax rate", async () => {
const region = await service.createTaxRegions({
country_code: "us",
})
const rate = await service.create({
tax_region_id: region.id,
code: "test",
rate: 2.5,
name: "Test Rate",
})
const response = await api.get(
`/admin/tax-rates/${rate.id}`,
adminHeaders
)
expect(response.status).toEqual(200)
expect(response.data).toEqual({
tax_rate: {
id: rate.id,
code: "test",
rate: 2.5,
name: "Test Rate",
metadata: null,
tax_region_id: region.id,
is_default: false,
is_combinable: false,
created_at: expect.any(String),
updated_at: expect.any(String),
deleted_at: null,
created_by: null,
rules: [],
tax_region: expect.any(Object),
},
})
})
it("can create a tax region with rates and rules", async () => {
const regionRes = await api.post(
`/admin/tax-regions`,
{
country_code: "us",
default_tax_rate: {
code: "default",
rate: 2,
name: "default rate",
},
},
adminHeaders
)
const usRegionId = regionRes.data.tax_region.id
expect(regionRes.status).toEqual(200)
expect(regionRes.data).toEqual({
tax_region: {
id: expect.any(String),
country_code: "us",
parent_id: null,
province_code: null,
created_at: expect.any(String),
updated_at: expect.any(String),
deleted_at: null,
created_by: "admin_user",
provider_id: null,
metadata: null,
children: [],
parent: null,
tax_rates: expect.any(Array),
},
})
const rateRes = await api.post(
`/admin/tax-rates`,
{
tax_region_id: usRegionId,
code: "RATE2",
name: "another rate",
rate: 10,
rules: [{ reference: "product", reference_id: "prod_1234" }],
},
adminHeaders
)
expect(rateRes.status).toEqual(200)
expect(rateRes.data).toEqual({
tax_rate: {
id: expect.any(String),
code: "RATE2",
rate: 10,
name: "another rate",
is_default: false,
metadata: null,
tax_region_id: usRegionId,
created_at: expect.any(String),
updated_at: expect.any(String),
deleted_at: null,
created_by: "admin_user",
is_combinable: false,
tax_region: expect.any(Object),
rules: [
expect.objectContaining({
reference: "product",
reference_id: "prod_1234",
}),
],
},
})
const provRegRes = await api.post(
`/admin/tax-regions`,
{
country_code: "US",
parent_id: usRegionId,
province_code: "cA",
},
adminHeaders
)
expect(provRegRes.status).toEqual(200)
expect(provRegRes.data).toEqual({
tax_region: {
id: expect.any(String),
country_code: "us",
parent_id: usRegionId,
province_code: "ca",
created_at: expect.any(String),
updated_at: expect.any(String),
deleted_at: null,
created_by: "admin_user",
metadata: null,
provider_id: null,
children: [],
tax_rates: [],
parent: expect.objectContaining({
id: usRegionId,
}),
},
})
const defRes = await api.post(
`/admin/tax-rates`,
{
tax_region_id: provRegRes.data.tax_region.id,
code: "DEFAULT",
name: "DEFAULT",
rate: 10,
is_default: true,
},
adminHeaders
)
const listRes = await api.get(`/admin/tax-rates`, adminHeaders)
expect(listRes.status).toEqual(200)
expect(listRes.data.tax_rates).toEqual(
expect.arrayContaining([
expect.objectContaining({
id: rateRes.data.tax_rate.id,
code: "RATE2",
rate: 10,
name: "another rate",
is_default: false,
metadata: null,
tax_region_id: usRegionId,
created_at: expect.any(String),
updated_at: expect.any(String),
deleted_at: null,
created_by: "admin_user",
}),
expect.objectContaining({ id: defRes.data.tax_rate.id }),
expect.objectContaining({
tax_region_id: usRegionId,
is_default: true,
rate: 2,
}),
])
)
})
it("can create a tax rate and update it", async () => {
const regionRes = await api.post(
`/admin/tax-regions`,
{
country_code: "us",
default_tax_rate: {
code: "default",
rate: 2,
name: "default rate",
},
},
adminHeaders
)
const usRegionId = regionRes.data.tax_region.id
expect(regionRes.status).toEqual(200)
expect(regionRes.data).toEqual({
tax_region: {
id: expect.any(String),
country_code: "us",
parent_id: null,
province_code: null,
created_at: expect.any(String),
updated_at: expect.any(String),
deleted_at: null,
created_by: "admin_user",
provider_id: null,
metadata: null,
children: [],
parent: null,
tax_rates: expect.any(Array),
},
})
const rateRes = await api.post(
`/admin/tax-rates`,
{
tax_region_id: usRegionId,
code: "RATE2",
name: "another rate",
rate: 10,
rules: [{ reference: "product", reference_id: "prod_1234" }],
},
adminHeaders
)
expect(rateRes.status).toEqual(200)
expect(rateRes.data).toEqual({
tax_rate: {
id: expect.any(String),
code: "RATE2",
rate: 10,
name: "another rate",
is_default: false,
metadata: null,
tax_region_id: usRegionId,
created_at: expect.any(String),
updated_at: expect.any(String),
deleted_at: null,
created_by: "admin_user",
is_combinable: false,
tax_region: expect.any(Object),
rules: [
expect.objectContaining({
reference: "product",
reference_id: "prod_1234",
}),
],
},
})
const updateRes = await api.post(
`/admin/tax-rates/${rateRes.data.tax_rate.id}`,
{
code: "updatedcode",
rate: 12,
is_combinable: true,
name: "Another Name",
metadata: { you: "know it" },
},
adminHeaders
)
expect(updateRes.status).toEqual(200)
expect(updateRes.data).toEqual({
tax_rate: {
id: expect.any(String),
code: "updatedcode",
rate: 12,
name: "Another Name",
is_default: false,
metadata: { you: "know it" },
tax_region_id: usRegionId,
deleted_at: null,
created_at: expect.any(String),
updated_at: expect.any(String),
created_by: "admin_user",
is_combinable: true,
tax_region: expect.any(Object),
rules: [
expect.objectContaining({
reference: "product",
reference_id: "prod_1234",
}),
],
},
})
})
it("can create a tax rate and delete it", async () => {
const regionRes = await api.post(
`/admin/tax-regions`,
{
country_code: "us",
default_tax_rate: {
code: "default",
rate: 2,
name: "default rate",
},
},
adminHeaders
)
const usRegionId = regionRes.data.tax_region.id
const rateRes = await api.post(
`/admin/tax-rates`,
{
tax_region_id: usRegionId,
code: "RATE2",
name: "another rate",
rate: 10,
rules: [{ reference: "product", reference_id: "prod_1234" }],
},
adminHeaders
)
const deleteRes = await api.delete(
`/admin/tax-rates/${rateRes.data.tax_rate.id}`,
adminHeaders
)
expect(deleteRes.status).toEqual(200)
expect(deleteRes.data).toEqual({
id: rateRes.data.tax_rate.id,
object: "tax_rate",
deleted: true,
})
const rates = await service.list(
{ id: rateRes.data.tax_rate.id },
{ withDeleted: true }
)
expect(rates.length).toEqual(1)
expect(rates[0].deleted_at).not.toBeNull()
})
it("can retrieve a tax region", async () => {
const region = await service.createTaxRegions({
country_code: "us",
})
const rate = await service.create({
tax_region_id: region.id,
code: "test",
rate: 2.5,
name: "Test Rate",
})
const response = await api.get(
`/admin/tax-regions/${region.id}`,
adminHeaders
)
expect(response.status).toEqual(200)
expect(response.data).toEqual({
tax_region: {
id: region.id,
country_code: "us",
province_code: null,
parent_id: null,
provider_id: null,
created_by: null,
created_at: expect.any(String),
updated_at: expect.any(String),
tax_rates: expect.any(Array),
deleted_at: null,
metadata: null,
children: [],
parent: null,
},
})
})
it("can create a tax region and delete it", async () => {
const regionRes = await api.post(
`/admin/tax-regions`,
{
country_code: "us",
default_tax_rate: {
code: "default",
rate: 2,
name: "default rate",
},
},
adminHeaders
)
const usRegionId = regionRes.data.tax_region.id
const deleteRes = await api.delete(
`/admin/tax-regions/${usRegionId}`,
adminHeaders
)
expect(deleteRes.status).toEqual(200)
expect(deleteRes.data).toEqual({
id: usRegionId,
object: "tax_region",
deleted: true,
})
const rates = await service.listTaxRegions(
{ id: usRegionId },
{ withDeleted: true }
)
expect(rates.length).toEqual(1)
expect(rates[0].deleted_at).not.toBeNull()
})
it("can create a tax rate add rules and remove them", async () => {
const regionRes = await api.post(
`/admin/tax-regions`,
{
country_code: "us",
default_tax_rate: {
code: "default",
rate: 2,
name: "default rate",
},
},
adminHeaders
)
const usRegionId = regionRes.data.tax_region.id
const rateRes = await api.post(
`/admin/tax-rates`,
{
tax_region_id: usRegionId,
code: "RATE2",
name: "another rate",
rate: 10,
rules: [{ reference: "product", reference_id: "prod_1234" }],
},
adminHeaders
)
const rateId = rateRes.data.tax_rate.id
let rules = await service.listTaxRateRules({ tax_rate_id: rateId })
expect(rules).toEqual([
{
id: expect.any(String),
tax_rate_id: rateId,
reference: "product",
reference_id: "prod_1234",
created_by: "admin_user",
created_at: expect.any(Date),
updated_at: expect.any(Date),
deleted_at: null,
tax_rate: { id: rateId },
metadata: null,
},
])
await api.post(
`/admin/tax-rates/${rateId}/rules`,
{
reference: "product",
reference_id: "prod_1111",
},
adminHeaders
)
await api.post(
`/admin/tax-rates/${rateId}/rules`,
{
reference: "product",
reference_id: "prod_2222",
},
adminHeaders
)
rules = await service.listTaxRateRules({ tax_rate_id: rateId })
expect(rules).toEqual(
expect.arrayContaining([
expect.objectContaining({
tax_rate_id: rateId,
reference: "product",
reference_id: "prod_1234",
created_by: "admin_user",
}),
expect.objectContaining({
tax_rate_id: rateId,
reference: "product",
reference_id: "prod_1111",
created_by: "admin_user",
}),
expect.objectContaining({
tax_rate_id: rateId,
reference: "product",
reference_id: "prod_2222",
created_by: "admin_user",
}),
])
)
const toDeleteId = rules.find((r) => r.reference_id === "prod_1111")!.id
await api.delete(
`/admin/tax-rates/${rateId}/rules/${toDeleteId}`,
adminHeaders
)
rules = await service.listTaxRateRules({ tax_rate_id: rateId })
expect(rules.length).toEqual(2)
await api.post(
`/admin/tax-rates/${rateId}`,
{
rules: [
{ reference: "product", reference_id: "prod_3333" },
{ reference: "product", reference_id: "prod_4444" },
{ reference: "product", reference_id: "prod_5555" },
{ reference: "product", reference_id: "prod_6666" },
],
},
adminHeaders
)
rules = await service.listTaxRateRules({ tax_rate_id: rateId })
expect(rules.length).toEqual(4)
expect(rules).toEqual(
expect.arrayContaining([
expect.objectContaining({
tax_rate_id: rateId,
reference: "product",
reference_id: "prod_3333",
created_by: "admin_user",
}),
expect.objectContaining({
tax_rate_id: rateId,
reference: "product",
reference_id: "prod_4444",
created_by: "admin_user",
}),
expect.objectContaining({
tax_rate_id: rateId,
reference: "product",
reference_id: "prod_5555",
created_by: "admin_user",
}),
expect.objectContaining({
tax_rate_id: rateId,
reference: "product",
reference_id: "prod_6666",
created_by: "admin_user",
}),
])
)
})
})
},
})