feat(medusa): storefront return (#194)

* feat: adds endpoint to lookup an order by its display_id and email

* feat: adds storefront returns

* fix: pr comments
This commit is contained in:
Sebastian Rindom
2021-03-10 17:42:39 +01:00
committed by GitHub
parent d9c17b5122
commit 252db5ef7e
12 changed files with 613 additions and 892 deletions

View File

@@ -0,0 +1,160 @@
const { dropDatabase } = require("pg-god");
const path = require("path");
const {
Region,
Order,
Customer,
ShippingProfile,
Product,
ProductVariant,
MoneyAmount,
LineItem,
} = require("@medusajs/medusa");
const setupServer = require("../../../helpers/setup-server");
const { useApi } = require("../../../helpers/use-api");
const { initDb } = require("../../../helpers/use-db");
jest.setTimeout(30000);
describe("/store/carts", () => {
let medusaProcess;
let dbConnection;
beforeAll(async () => {
const cwd = path.resolve(path.join(__dirname, "..", ".."));
dbConnection = await initDb({ cwd });
medusaProcess = await setupServer({ cwd });
});
afterAll(async () => {
dbConnection.close();
await dropDatabase({ databaseName: "medusa-integration" });
medusaProcess.kill();
});
describe("GET /store/orders", () => {
beforeEach(async () => {
const manager = dbConnection.manager;
await manager.query(
`ALTER SEQUENCE order_display_id_seq RESTART WITH 111`
);
await manager.insert(Region, {
id: "region",
name: "Test Region",
currency_code: "usd",
tax_rate: 0,
});
await manager.insert(Customer, {
id: "cus_1234",
email: "test@email.com",
});
await manager.insert(Order, {
id: "order_test",
email: "test@email.com",
display_id: 111,
customer_id: "cus_1234",
region_id: "region",
tax_rate: 0,
currency_code: "usd",
});
const defaultProfile = await manager.findOne(ShippingProfile, {
type: "default",
});
await manager.insert(Product, {
id: "test-product",
title: "test product",
profile_id: defaultProfile.id,
options: [{ id: "test-option", title: "Size" }],
});
await manager.insert(ProductVariant, {
id: "test-variant",
title: "test variant",
product_id: "test-product",
inventory_quantity: 1,
options: [
{
option_id: "test-option",
value: "Size",
},
],
});
await manager.insert(LineItem, {
id: "test-item",
fulfilled_quantity: 1,
title: "Line Item",
description: "Line Item Desc",
thumbnail: "https://test.js/1234",
unit_price: 8000,
quantity: 1,
variant_id: "test-variant",
});
});
afterEach(async () => {
const manager = dbConnection.manager;
await manager.query(`DELETE FROM "line_item"`);
await manager.query(`DELETE FROM "order"`);
await manager.query(`DELETE FROM "customer"`);
await manager.query(`DELETE FROM "region"`);
await manager.query(`DELETE FROM "product_option_value"`);
await manager.query(`DELETE FROM "product_option"`);
await manager.query(`DELETE FROM "money_amount"`);
await manager.query(`DELETE FROM "product_variant"`);
await manager.query(`DELETE FROM "product"`);
});
it("looks up order", async () => {
const api = useApi();
const response = await api
.get("/store/orders?display_id=111&email=test@email.com")
.catch((err) => {
return err.response;
});
expect(response.status).toEqual(200);
expect(response.data.order.display_id).toEqual(111);
expect(response.data.order.email).toEqual("test@email.com");
});
it("fails if display_id + email not provided", async () => {
const api = useApi();
const response = await api
.get("/store/orders?display_id=111")
.catch((err) => {
return err.response;
});
expect(response.status).toEqual(400);
});
it("fails if display_id + email not provided", async () => {
const api = useApi();
const response = await api
.get("/store/orders?email=test@email.com")
.catch((err) => {
return err.response;
});
expect(response.status).toEqual(400);
});
it("fails if email not correct", async () => {
const api = useApi();
const response = await api
.get("/store/orders?display_id=111&email=test1@email.com")
.catch((err) => {
return err.response;
});
expect(response.status).toEqual(404);
});
});
});

View File

@@ -0,0 +1,178 @@
const { dropDatabase } = require("pg-god");
const path = require("path");
const {
Region,
Order,
Customer,
ShippingProfile,
Product,
ProductVariant,
ShippingOption,
LineItem,
} = require("@medusajs/medusa");
const setupServer = require("../../../helpers/setup-server");
const { useApi } = require("../../../helpers/use-api");
const { initDb } = require("../../../helpers/use-db");
jest.setTimeout(30000);
describe("/store/carts", () => {
let medusaProcess;
let dbConnection;
beforeAll(async () => {
const cwd = path.resolve(path.join(__dirname, "..", ".."));
dbConnection = await initDb({ cwd });
medusaProcess = await setupServer({ cwd });
});
afterAll(async () => {
dbConnection.close();
await dropDatabase({ databaseName: "medusa-integration" });
medusaProcess.kill();
});
describe("POST /store/returns", () => {
beforeEach(async () => {
const manager = dbConnection.manager;
await manager.query(
`ALTER SEQUENCE order_display_id_seq RESTART WITH 111`
);
await manager.insert(Region, {
id: "region",
name: "Test Region",
currency_code: "usd",
tax_rate: 0,
});
await manager.insert(Customer, {
id: "cus_1234",
email: "test@email.com",
});
await manager.insert(Order, {
id: "order_test",
email: "test@email.com",
display_id: 111,
customer_id: "cus_1234",
region_id: "region",
tax_rate: 0,
currency_code: "usd",
});
const defaultProfile = await manager.findOne(ShippingProfile, {
type: "default",
});
await manager.insert(Product, {
id: "test-product",
title: "test product",
profile_id: defaultProfile.id,
options: [{ id: "test-option", title: "Size" }],
});
await manager.insert(ProductVariant, {
id: "test-variant",
title: "test variant",
product_id: "test-product",
inventory_quantity: 1,
options: [
{
option_id: "test-option",
value: "Size",
},
],
});
await manager.insert(LineItem, {
id: "test-item",
order_id: "order_test",
fulfilled_quantity: 1,
title: "Line Item",
description: "Line Item Desc",
thumbnail: "https://test.js/1234",
unit_price: 8000,
quantity: 1,
variant_id: "test-variant",
});
await manager.insert(ShippingOption, {
id: "test-option",
name: "Test ret",
profile_id: defaultProfile.id,
region_id: "region",
provider_id: "test-ful",
data: {},
price_type: "flat_rate",
amount: 1000,
is_return: true,
});
});
afterEach(async () => {
const manager = dbConnection.manager;
await manager.query(`DELETE FROM "shipping_method"`);
await manager.query(`DELETE FROM "shipping_option"`);
await manager.query(`DELETE FROM "return_item"`);
await manager.query(`DELETE FROM "return"`);
await manager.query(`DELETE FROM "line_item"`);
await manager.query(`DELETE FROM "order"`);
await manager.query(`DELETE FROM "customer"`);
await manager.query(`DELETE FROM "region"`);
await manager.query(`DELETE FROM "product_option_value"`);
await manager.query(`DELETE FROM "product_option"`);
await manager.query(`DELETE FROM "money_amount"`);
await manager.query(`DELETE FROM "product_variant"`);
await manager.query(`DELETE FROM "product"`);
});
it("creates a return", async () => {
const api = useApi();
const response = await api
.post("/store/returns", {
order_id: "order_test",
items: [
{
item_id: "test-item",
quantity: 1,
},
],
})
.catch((err) => {
return err.response;
});
expect(response.status).toEqual(200);
expect(response.data.return.refund_amount).toEqual(8000);
});
it("creates a return with shipping method", async () => {
const api = useApi();
const response = await api
.post("/store/returns", {
order_id: "order_test",
return_shipping: {
option_id: "test-option",
},
items: [
{
item_id: "test-item",
quantity: 1,
},
],
})
.catch((err) => {
return err.response;
});
expect(response.status).toEqual(200);
expect(response.data.return.refund_amount).toEqual(7000);
});
});
});

View File

@@ -8,7 +8,8 @@
},
"dependencies": {
"@medusajs/medusa": "^1.1.3",
"medusa-interfaces": "^1.1.0"
"medusa-interfaces": "^1.1.0",
"typeorm": "^0.2.31"
},
"devDependencies": {
"@babel/cli": "^7.12.10",
@@ -16,4 +17,4 @@
"@babel/node": "^7.12.10",
"babel-preset-medusa-package": "^1.1.0"
}
}
}

View File

@@ -36,6 +36,10 @@ class TestFulService extends FulfillmentService {
return Promise.resolve({});
}
createReturn() {
return Promise.resolve({});
}
createFulfillment() {
// No data is being sent anywhere
return Promise.resolve({});

View File

@@ -4064,6 +4064,28 @@ typeorm@^0.2.29:
yargonaut "^1.1.2"
yargs "^16.0.3"
typeorm@^0.2.31:
version "0.2.31"
resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.31.tgz#82b8a1b233224f81c738f53b0380386ccf360917"
integrity sha512-dVvCEVHH48DG0QPXAKfo0l6ecQrl3A8ucGP4Yw4myz4YEDMProebTQo8as83uyES+nrwCbu3qdkL4ncC2+qcMA==
dependencies:
"@sqltools/formatter" "1.2.2"
app-root-path "^3.0.0"
buffer "^5.5.0"
chalk "^4.1.0"
cli-highlight "^2.1.10"
debug "^4.1.1"
dotenv "^8.2.0"
glob "^7.1.6"
js-yaml "^3.14.0"
mkdirp "^1.0.4"
reflect-metadata "^0.1.13"
sha.js "^2.4.11"
tslib "^1.13.0"
xml2js "^0.4.23"
yargonaut "^1.1.2"
yargs "^16.0.3"
uid-safe@~2.1.5:
version "2.1.5"
resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a"