Files
medusa-store/integration-tests/api/__tests__/admin/order.js
Oliver Windall Juhl f8f1f57fa1 feat(medusa): Swaps on swaps (#229)
Co-authored-by: Sebastian Rindom <skrindom@gmail.com>
2021-04-20 10:55:15 +02:00

993 lines
27 KiB
JavaScript

const { dropDatabase } = require("pg-god");
const path = require("path");
const { ReturnReason } = require("@medusajs/medusa");
const setupServer = require("../../../helpers/setup-server");
const { useApi } = require("../../../helpers/use-api");
const { initDb } = require("../../../helpers/use-db");
const orderSeeder = require("../../helpers/order-seeder");
const swapSeeder = require("../../helpers/swap-seeder");
const adminSeeder = require("../../helpers/admin-seeder");
jest.setTimeout(30000);
describe("/admin/orders", () => {
let medusaProcess;
let dbConnection;
beforeAll(async () => {
const cwd = path.resolve(path.join(__dirname, "..", ".."));
dbConnection = await initDb({ cwd });
medusaProcess = await setupServer({ cwd });
});
afterAll(async () => {
await dbConnection.close();
await dropDatabase({ databaseName: "medusa-integration" });
medusaProcess.kill();
});
describe("GET /admin/orders", () => {
beforeEach(async () => {
try {
await adminSeeder(dbConnection);
await orderSeeder(dbConnection);
} catch (err) {
console.log(err);
throw err;
}
});
afterEach(async () => {
const manager = dbConnection.manager;
await manager.query(`DELETE FROM "cart"`);
await manager.query(`DELETE FROM "fulfillment"`);
await manager.query(`DELETE FROM "swap"`);
await manager.query(`DELETE FROM "return"`);
await manager.query(`DELETE FROM "claim_image"`);
await manager.query(`DELETE FROM "claim_tag"`);
await manager.query(`DELETE FROM "claim_item"`);
await manager.query(`DELETE FROM "claim_order"`);
await manager.query(`DELETE FROM "line_item"`);
await manager.query(`DELETE FROM "money_amount"`);
await manager.query(`DELETE FROM "product_variant"`);
await manager.query(`DELETE FROM "product"`);
await manager.query(`DELETE FROM "shipping_method"`);
await manager.query(`DELETE FROM "shipping_option"`);
await manager.query(`DELETE FROM "discount"`);
await manager.query(`DELETE FROM "payment"`);
await manager.query(`DELETE FROM "order"`);
await manager.query(`DELETE FROM "customer"`);
await manager.query(
`UPDATE "country" SET region_id=NULL WHERE iso_2 = 'us'`
);
await manager.query(`DELETE FROM "region"`);
await manager.query(`DELETE FROM "user"`);
});
it("creates a cart", async () => {
const api = useApi();
const response = await api
.get("/admin/orders", {
headers: {
Authorization: "Bearer test_token",
},
})
.catch((err) => {
console.log(err);
});
expect(response.status).toEqual(200);
});
});
describe("POST /admin/orders/:id/claims", () => {
beforeEach(async () => {
try {
await adminSeeder(dbConnection);
await orderSeeder(dbConnection);
} catch (err) {
console.log(err);
throw err;
}
});
afterEach(async () => {
const manager = dbConnection.manager;
await manager.query(`DELETE FROM "cart"`);
await manager.query(`DELETE FROM "fulfillment_item"`);
await manager.query(`DELETE FROM "fulfillment"`);
await manager.query(`DELETE FROM "swap"`);
await manager.query(`DELETE FROM "return"`);
await manager.query(`DELETE FROM "claim_image"`);
await manager.query(`DELETE FROM "claim_tag"`);
await manager.query(`DELETE FROM "claim_item"`);
await manager.query(`DELETE FROM "shipping_method"`);
await manager.query(`DELETE FROM "line_item"`);
await manager.query(`DELETE FROM "claim_order"`);
await manager.query(`DELETE FROM "money_amount"`);
await manager.query(`DELETE FROM "product_variant"`);
await manager.query(`DELETE FROM "product"`);
await manager.query(`DELETE FROM "shipping_option"`);
await manager.query(`DELETE FROM "discount"`);
await manager.query(`DELETE FROM "payment"`);
await manager.query(`DELETE FROM "order"`);
await manager.query(`DELETE FROM "customer"`);
await manager.query(
`UPDATE "country" SET region_id=NULL WHERE iso_2 = 'us'`
);
await manager.query(`DELETE FROM "region"`);
await manager.query(`DELETE FROM "user"`);
});
it("creates a claim", async () => {
const api = useApi();
const response = await api.post(
"/admin/orders/test-order/claims",
{
type: "replace",
claim_items: [
{
item_id: "test-item",
quantity: 1,
reason: "production_failure",
tags: ["fluff"],
images: ["https://test.image.com"],
},
],
additional_items: [
{
variant_id: "test-variant",
quantity: 1,
},
],
},
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(response.status).toEqual(200);
expect(response.data.order.claims[0].claim_items).toEqual(
expect.arrayContaining([
expect.objectContaining({
item_id: "test-item",
quantity: 1,
reason: "production_failure",
images: expect.arrayContaining([
expect.objectContaining({
url: "https://test.image.com",
}),
]),
}),
])
);
expect(response.data.order.claims[0].additional_items).toEqual(
expect.arrayContaining([
expect.objectContaining({
variant_id: "test-variant",
quantity: 1,
}),
])
);
});
it("updates a claim", async () => {
const api = useApi();
const response = await api.post(
"/admin/orders/test-order/claims",
{
type: "replace",
claim_items: [
{
item_id: "test-item",
quantity: 1,
reason: "production_failure",
tags: ["fluff"],
images: ["https://test.image.com"],
},
],
additional_items: [
{
variant_id: "test-variant",
quantity: 1,
},
],
},
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(response.status).toEqual(200);
const cid = response.data.order.claims[0].id;
const { status, data: updateData } = await api.post(
`/admin/orders/test-order/claims/${cid}`,
{
shipping_methods: [
{
id: "test-method",
},
],
},
{
headers: {
authorization: "bearer test_token",
},
}
);
expect(status).toEqual(200);
expect(updateData.order.claims[0].shipping_methods).toEqual([
expect.objectContaining({
id: "test-method",
}),
]);
});
it("updates claim items", async () => {
const api = useApi();
const response = await api.post(
"/admin/orders/test-order/claims",
{
type: "replace",
claim_items: [
{
item_id: "test-item",
quantity: 1,
reason: "production_failure",
tags: ["fluff"],
images: ["https://test.image.com"],
},
],
additional_items: [
{
variant_id: "test-variant",
quantity: 1,
},
],
},
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(response.status).toEqual(200);
let claim = response.data.order.claims[0];
const cid = claim.id;
const { status, data: updateData } = await api.post(
`/admin/orders/test-order/claims/${cid}`,
{
claim_items: claim.claim_items.map((i) => ({
id: i.id,
note: "Something new",
images: [
...i.images.map((i) => ({ id: i.id })),
{ url: "https://new.com/image" },
],
tags: [
{ value: "completely" },
{ value: "NEW" },
{ value: " tags" },
],
})),
},
{
headers: {
authorization: "bearer test_token",
},
}
);
expect(status).toEqual(200);
expect(updateData.order.claims.length).toEqual(1);
claim = updateData.order.claims[0];
expect(claim.claim_items.length).toEqual(1);
expect(claim.claim_items).toEqual(
expect.arrayContaining([
expect.objectContaining({
id: claim.claim_items[0].id,
reason: "production_failure",
note: "Something new",
images: expect.arrayContaining([
expect.objectContaining({
url: "https://test.image.com",
}),
expect.objectContaining({
url: "https://new.com/image",
}),
]),
// tags: expect.arrayContaining([
// expect.objectContaining({ value: "completely" }),
// expect.objectContaining({ value: "new" }),
// expect.objectContaining({ value: "tags" }),
// ]),
}),
])
);
});
it("updates claim items - removes image", async () => {
const api = useApi();
const response = await api.post(
"/admin/orders/test-order/claims",
{
type: "replace",
claim_items: [
{
item_id: "test-item",
quantity: 1,
reason: "production_failure",
tags: ["fluff"],
images: ["https://test.image.com"],
},
],
additional_items: [
{
variant_id: "test-variant",
quantity: 1,
},
],
},
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(response.status).toEqual(200);
let claim = response.data.order.claims[0];
const cid = claim.id;
const { status, data: updateData } = await api.post(
`/admin/orders/test-order/claims/${cid}`,
{
claim_items: claim.claim_items.map((i) => ({
id: i.id,
note: "Something new",
images: [],
tags: [
{ value: "completely" },
{ value: "NEW" },
{ value: " tags" },
],
})),
},
{
headers: {
authorization: "bearer test_token",
},
}
);
expect(status).toEqual(200);
expect(updateData.order.claims.length).toEqual(1);
claim = updateData.order.claims[0];
expect(claim.claim_items.length).toEqual(1);
expect(claim.claim_items).toEqual([
expect.objectContaining({
id: claim.claim_items[0].id,
reason: "production_failure",
note: "Something new",
images: [],
// tags: expect.arrayContaining([
// expect.objectContaining({ value: "completely" }),
// expect.objectContaining({ value: "new" }),
// expect.objectContaining({ value: "tags" }),
// ]),
}),
]);
});
it("fulfills a claim", async () => {
const api = useApi();
const response = await api
.post(
"/admin/orders/test-order/claims",
{
type: "replace",
shipping_methods: [
{
id: "test-method",
},
],
claim_items: [
{
item_id: "test-item",
quantity: 1,
reason: "production_failure",
tags: ["fluff"],
images: ["https://test.image.com"],
},
],
additional_items: [
{
variant_id: "test-variant",
quantity: 1,
},
],
},
{
headers: {
Authorization: "Bearer test_token",
},
}
)
.catch((err) => {
console.log(err);
});
const cid = response.data.order.claims[0].id;
const fulRes = await api.post(
`/admin/orders/test-order/claims/${cid}/fulfillments`,
{},
{
headers: {
Authorization: "Bearer test_token",
},
}
);
expect(fulRes.status).toEqual(200);
expect(fulRes.data.order.claims).toEqual([
expect.objectContaining({
id: cid,
order_id: "test-order",
fulfillment_status: "fulfilled",
}),
]);
const fid = fulRes.data.order.claims[0].fulfillments[0].id;
const iid = fulRes.data.order.claims[0].additional_items[0].id;
expect(fulRes.data.order.claims[0].fulfillments).toEqual([
expect.objectContaining({
items: [
{
fulfillment_id: fid,
item_id: iid,
quantity: 1,
},
],
}),
]);
});
});
describe("POST /admin/orders/:id/return", () => {
let rrId;
beforeEach(async () => {
try {
await adminSeeder(dbConnection);
await orderSeeder(dbConnection);
const created = dbConnection.manager.create(ReturnReason, {
value: "too_big",
label: "Too Big",
});
const result = await dbConnection.manager.save(created);
rrId = result.id;
} catch (err) {
console.log(err);
throw err;
}
});
afterEach(async () => {
const manager = dbConnection.manager;
await manager.query(`DELETE FROM "cart"`);
await manager.query(`DELETE FROM "fulfillment_item"`);
await manager.query(`DELETE FROM "fulfillment"`);
await manager.query(`DELETE FROM "swap"`);
await manager.query(`DELETE FROM "return_item"`);
await manager.query(`DELETE FROM "return_reason"`);
await manager.query(`DELETE FROM "return"`);
await manager.query(`DELETE FROM "claim_image"`);
await manager.query(`DELETE FROM "claim_tag"`);
await manager.query(`DELETE FROM "claim_item"`);
await manager.query(`DELETE FROM "shipping_method"`);
await manager.query(`DELETE FROM "line_item"`);
await manager.query(`DELETE FROM "claim_order"`);
await manager.query(`DELETE FROM "money_amount"`);
await manager.query(`DELETE FROM "product_variant"`);
await manager.query(`DELETE FROM "product"`);
await manager.query(`DELETE FROM "shipping_option"`);
await manager.query(`DELETE FROM "discount"`);
await manager.query(`DELETE FROM "payment"`);
await manager.query(`DELETE FROM "order"`);
await manager.query(`DELETE FROM "customer"`);
await manager.query(
`UPDATE "country" SET region_id=NULL WHERE iso_2 = 'us'`
);
await manager.query(`DELETE FROM "region"`);
await manager.query(`DELETE FROM "user"`);
});
it("creates a return", async () => {
const api = useApi();
const response = await api.post(
"/admin/orders/test-order/return",
{
items: [
{
item_id: "test-item",
quantity: 1,
reason_id: rrId,
note: "TOO SMALL",
},
],
},
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(response.status).toEqual(200);
expect(response.data.order.returns[0].refund_amount).toEqual(7200);
expect(response.data.order.returns[0].items).toEqual([
expect.objectContaining({
item_id: "test-item",
quantity: 1,
reason_id: rrId,
note: "TOO SMALL",
}),
]);
});
});
describe("GET /admin/orders", () => {
beforeEach(async () => {
try {
await adminSeeder(dbConnection);
// Manually insert date for filtering
const createdAt = new Date("26 January 1997 12:00 UTC");
await orderSeeder(dbConnection, {
created_at: createdAt.toISOString(),
});
} catch (err) {
console.log(err);
throw err;
}
});
afterEach(async () => {
const manager = dbConnection.manager;
await manager.query(`DELETE FROM "cart"`);
await manager.query(`DELETE FROM "fulfillment_item"`);
await manager.query(`DELETE FROM "fulfillment"`);
await manager.query(`DELETE FROM "swap"`);
await manager.query(`DELETE FROM "return"`);
await manager.query(`DELETE FROM "claim_image"`);
await manager.query(`DELETE FROM "claim_tag"`);
await manager.query(`DELETE FROM "claim_item"`);
await manager.query(`DELETE FROM "shipping_method"`);
await manager.query(`DELETE FROM "line_item"`);
await manager.query(`DELETE FROM "claim_order"`);
await manager.query(`DELETE FROM "money_amount"`);
await manager.query(`DELETE FROM "product_variant"`);
await manager.query(`DELETE FROM "product"`);
await manager.query(`DELETE FROM "shipping_option"`);
await manager.query(`DELETE FROM "discount"`);
await manager.query(`DELETE FROM "payment"`);
await manager.query(`DELETE FROM "order"`);
await manager.query(`DELETE FROM "customer"`);
await manager.query(
`UPDATE "country" SET region_id=NULL WHERE iso_2 = 'us'`
);
await manager.query(`DELETE FROM "region"`);
await manager.query(`DELETE FROM "user"`);
});
it("lists all orders", async () => {
const api = useApi();
const response = await api.get("/admin/orders?fields=id", {
headers: {
authorization: "Bearer test_token",
},
});
expect(response.status).toEqual(200);
expect(response.data.orders).toEqual([
expect.objectContaining({
id: "test-order",
}),
]);
});
it("successfully lists orders with greater than", async () => {
const api = useApi();
const response = await api.get(
"/admin/orders?fields=id&created_at[gt]=01-26-1990",
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(response.status).toEqual(200);
expect(response.data.orders).toEqual([
expect.objectContaining({
id: "test-order",
}),
]);
});
it("successfully lists no orders with greater than", async () => {
const api = useApi();
const response = await api.get(
"/admin/orders?fields=id&created_at[gt]=01-26-2000",
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(response.status).toEqual(200);
expect(response.data.orders).toEqual([]);
});
it("successfully lists orders with less than", async () => {
const api = useApi();
const response = await api.get(
"/admin/orders?fields=id&created_at[lt]=01-26-2000",
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(response.status).toEqual(200);
expect(response.data.orders).toEqual([
expect.objectContaining({
id: "test-order",
}),
]);
});
it("successfully lists no orders with less than", async () => {
const api = useApi();
const response = await api.get(
"/admin/orders?fields=id&created_at[lt]=01-26-1990",
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(response.status).toEqual(200);
expect(response.data.orders).toEqual([]);
});
it("successfully lists orders using unix (greater than)", async () => {
const api = useApi();
const response = await api.get(
"/admin/orders?fields=id&created_at[gt]=633351600",
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(response.status).toEqual(200);
expect(response.data.orders).toEqual([
expect.objectContaining({
id: "test-order",
}),
]);
});
});
describe("POST /admin/orders/:id/swaps", () => {
beforeEach(async () => {
try {
await adminSeeder(dbConnection);
await orderSeeder(dbConnection);
await swapSeeder(dbConnection);
} catch (err) {
console.log(err);
throw err;
}
});
afterEach(async () => {
const manager = dbConnection.manager;
await manager.query(`DELETE FROM "fulfillment_item"`);
await manager.query(`DELETE FROM "fulfillment"`);
await manager.query(`DELETE FROM "return_item"`);
await manager.query(`DELETE FROM "return_reason"`);
await manager.query(`DELETE FROM "return"`);
await manager.query(`DELETE FROM "claim_image"`);
await manager.query(`DELETE FROM "claim_tag"`);
await manager.query(`DELETE FROM "claim_item"`);
await manager.query(`DELETE FROM "shipping_method"`);
await manager.query(`DELETE FROM "line_item"`);
await manager.query(`DELETE FROM "payment"`);
await manager.query(`DELETE FROM "swap"`);
await manager.query(`DELETE FROM "cart"`);
await manager.query(`DELETE FROM "claim_order"`);
await manager.query(`DELETE FROM "money_amount"`);
await manager.query(`DELETE FROM "product_variant"`);
await manager.query(`DELETE FROM "product"`);
await manager.query(`DELETE FROM "shipping_option"`);
await manager.query(`DELETE FROM "discount"`);
await manager.query(`DELETE FROM "refund"`);
await manager.query(`DELETE FROM "order"`);
await manager.query(`DELETE FROM "customer"`);
await manager.query(
`UPDATE "country" SET region_id=NULL WHERE iso_2 = 'us'`
);
await manager.query(`DELETE FROM "region"`);
await manager.query(`DELETE FROM "user"`);
});
it("creates a swap", async () => {
const api = useApi();
const response = await api.post(
"/admin/orders/test-order/swaps",
{
return_items: [
{
item_id: "test-item",
quantity: 1,
},
],
additional_items: [{ variant_id: "test-variant-2", quantity: 1 }],
},
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(response.status).toEqual(200);
});
it("creates a swap and a return", async () => {
const api = useApi();
const returnedOrderFirst = await api.post(
"/admin/orders/order-with-swap/return",
{
items: [
{
item_id: "test-item-many",
quantity: 2,
},
],
receive_now: true,
},
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(returnedOrderFirst.status).toEqual(200);
const returnedOrderSecond = await api.post(
"/admin/orders/order-with-swap/return",
{
items: [
{
item_id: "test-item-many",
quantity: 1,
},
],
receive_now: true,
},
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(returnedOrderSecond.status).toEqual(200);
expect(returnedOrderSecond.data.order.items[1].returned_quantity).toBe(3);
});
it("creates a swap and receives the items", async () => {
const api = useApi();
const createdSwapOrder = await api.post(
"/admin/orders/test-order/swaps",
{
return_items: [
{
item_id: "test-item",
quantity: 1,
},
],
additional_items: [{ variant_id: "test-variant-2", quantity: 1 }],
},
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(createdSwapOrder.status).toEqual(200);
const swap = createdSwapOrder.data.order.swaps[0];
const receivedSwap = await api.post(
`/admin/returns/${swap.return_order.id}/receive`,
{
items: [
{
item_id: "test-item",
quantity: 1,
},
],
},
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(receivedSwap.status).toEqual(200);
expect(receivedSwap.data.return.status).toBe("received");
});
it("creates a swap on a swap", async () => {
const api = useApi();
const swapOnSwap = await api.post(
"/admin/orders/order-with-swap/swaps",
{
return_items: [
{
item_id: "test-item-swapped",
quantity: 1,
},
],
additional_items: [{ variant_id: "test-variant", quantity: 1 }],
},
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(swapOnSwap.status).toEqual(200);
});
it("receives a swap on swap", async () => {
const api = useApi();
const received = await api.post(
`/admin/returns/return-on-swap/receive`,
{
items: [
{
item_id: "test-item-swapped",
quantity: 1,
},
],
},
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(received.status).toEqual(200);
});
it("creates a return on a swap", async () => {
const api = useApi();
const returnOnSwap = await api.post(
"/admin/orders/order-with-swap/return",
{
items: [
{
item_id: "test-item-swapped",
quantity: 1,
},
],
},
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(returnOnSwap.status).toEqual(200);
});
it("creates a return on an order", async () => {
const api = useApi();
const returnOnOrder = await api.post(
"/admin/orders/test-order/return",
{
items: [
{
item_id: "test-item",
quantity: 1,
},
],
},
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(returnOnOrder.status).toEqual(200);
const captured = await api.post(
"/admin/orders/test-order/capture",
{},
{
headers: {
authorization: "Bearer test_token",
},
}
);
const returnId = returnOnOrder.data.order.returns[0].id;
const received = await api.post(
`/admin/returns/${returnId}/receive`,
{
items: [
{
item_id: "test-item",
quantity: 1,
},
],
},
{
headers: {
authorization: "Bearer test_token",
},
}
);
expect(received.status).toEqual(200);
});
});
});