fix(medusa): Add free shipping functionality (#241)

This commit is contained in:
Oliver Windall Juhl
2021-04-27 15:14:18 +02:00
committed by GitHub
parent 348d1c4997
commit fb0613d3cb
7 changed files with 210 additions and 41 deletions
+83 -23
View File
@@ -14,6 +14,19 @@ describe("/store/carts", () => {
let medusaProcess;
let dbConnection;
const doAfterEach = async (manager) => {
await manager.query(`DELETE FROM "discount"`);
await manager.query(`DELETE FROM "discount_rule"`);
await manager.query(`DELETE FROM "shipping_method"`);
await manager.query(`DELETE FROM "shipping_option"`);
await manager.query(`DELETE FROM "cart"`);
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"`);
};
beforeAll(async () => {
const cwd = path.resolve(path.join(__dirname, "..", ".."));
dbConnection = await initDb({ cwd });
@@ -43,13 +56,7 @@ describe("/store/carts", () => {
afterEach(async () => {
const manager = dbConnection.manager;
await manager.query(`DELETE FROM "cart"`);
await manager.query(`DELETE FROM "discount"`);
await manager.query(`DELETE FROM "discount_rule"`);
await manager.query(
`UPDATE "country" SET region_id=NULL WHERE iso_2 = 'us'`
);
await manager.query(`DELETE FROM "region"`);
await doAfterEach(manager);
});
it("creates a cart", async () => {
@@ -108,14 +115,7 @@ describe("/store/carts", () => {
afterEach(async () => {
const manager = dbConnection.manager;
await manager.query(`DELETE FROM "cart"`);
await manager.query(`DELETE FROM "discount"`);
await manager.query(`DELETE FROM "discount_rule"`);
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 doAfterEach(manager);
});
it("fails on apply discount if limit has been reached", async () => {
@@ -142,6 +142,73 @@ describe("/store/carts", () => {
expect(response.status).toEqual(200);
});
it("adds free shipping to cart then removes it again", async () => {
const api = useApi();
let cart = await api.post(
"/store/carts/test-cart",
{
discounts: [{ code: "FREE_SHIPPING" }, { code: "CREATED" }],
},
{ withCredentials: true }
);
expect(cart.data.cart.shipping_total).toBe(0);
expect(cart.status).toEqual(200);
cart = await api.post(
"/store/carts/test-cart",
{
discounts: [{ code: "CREATED" }],
},
{ withCredentials: true }
);
expect(cart.data.cart.shipping_total).toBe(1000);
expect(cart.status).toEqual(200);
});
});
describe("DELETE /store/carts/:id/discounts/:code", () => {
beforeEach(async () => {
try {
await cartSeeder(dbConnection);
await dbConnection.manager.query(
`INSERT INTO "cart_discounts" (cart_id, discount_id) VALUES ('test-cart', 'free-shipping')`
);
} catch (err) {
console.log(err);
throw err;
}
});
afterEach(async () => {
const manager = dbConnection.manager;
await doAfterEach(manager);
});
it("removes free shipping and updates shipping total", async () => {
const api = useApi();
const cartWithFreeShipping = await api.post(
"/store/carts/test-cart",
{
discounts: [{ code: "FREE_SHIPPING" }],
},
{ withCredentials: true }
);
expect(cartWithFreeShipping.data.cart.shipping_total).toBe(0);
expect(cartWithFreeShipping.status).toEqual(200);
const response = await api.delete(
"/store/carts/test-cart/discounts/FREE_SHIPPING"
);
expect(response.data.cart.shipping_total).toBe(1000);
expect(response.status).toEqual(200);
});
});
describe("get-cart with session customer", () => {
@@ -156,14 +223,7 @@ describe("/store/carts", () => {
afterEach(async () => {
const manager = dbConnection.manager;
await manager.query(`DELETE FROM "cart"`);
await manager.query(`DELETE FROM "discount"`);
await manager.query(`DELETE FROM "discount_rule"`);
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 doAfterEach(manager);
});
it("updates empty cart.customer_id on cart retrieval", async () => {
+40 -12
View File
@@ -4,11 +4,18 @@ const {
Cart,
DiscountRule,
Discount,
ShippingProfile,
ShippingOption,
ShippingMethod,
} = require("@medusajs/medusa");
module.exports = async (connection, data = {}) => {
const manager = connection.manager;
const defaultProfile = await manager.findOne(ShippingProfile, {
type: "default",
});
const r = manager.create(Region, {
id: "test-region",
name: "Test Region",
@@ -16,24 +23,26 @@ module.exports = async (connection, data = {}) => {
tax_rate: 0,
});
await manager.insert(DiscountRule, {
id: "test-discount-rule",
description: "Dynamic rule",
type: "percentage",
value: 10,
const freeRule = manager.create(DiscountRule, {
id: "free-shipping-rule",
description: "Free shipping rule",
type: "free_shipping",
value: 100,
allocation: "total",
});
await manager.insert(Discount, {
id: "test-discount",
code: "DYNAMIC",
rule_id: "test-discount-rule",
is_dynamic: true,
usage_count: 0,
usage_limit: 1,
const freeDisc = manager.create(Discount, {
id: "free-shipping",
code: "FREE_SHIPPING",
is_dynamic: false,
is_disabled: false,
});
freeDisc.regions = [r];
freeDisc.rule = freeRule;
await manager.save(freeDisc);
const d = await manager.create(Discount, {
id: "test-discount",
code: "CREATED",
@@ -73,6 +82,17 @@ module.exports = async (connection, data = {}) => {
email: "some-customer@email.com",
});
await manager.insert(ShippingOption, {
id: "test-option",
name: "test-option",
provider_id: "test-ful",
region_id: "test-region",
profile_id: defaultProfile.id,
price_type: "flat_rate",
amount: 1000,
data: {},
});
const cart = manager.create(Cart, {
id: "test-cart",
customer_id: "some-customer",
@@ -88,4 +108,12 @@ module.exports = async (connection, data = {}) => {
});
await manager.save(cart);
await manager.insert(ShippingMethod, {
id: "test-method",
shipping_option_id: "test-option",
cart_id: "test-cart",
price: 1000,
data: {},
});
};