feat: Add discountable flag to product (#329)

This commit is contained in:
Oliver Windall Juhl
2021-08-05 10:40:12 +02:00
committed by GitHub
parent 821d8be733
commit 6053c4a8dd
16 changed files with 1118 additions and 45 deletions

View File

@@ -28,7 +28,6 @@ describe("/admin/discounts", () => {
describe("POST /admin/discounts", () => {
beforeEach(async () => {
const manager = dbConnection.manager;
try {
await adminSeeder(dbConnection);
} catch (err) {
@@ -105,8 +104,9 @@ describe("/admin/discounts", () => {
});
describe("testing for soft-deletion + uniqueness on discount codes", () => {
const manager = dbConnection.manager;
let manager;
beforeEach(async () => {
manager = dbConnection.manager;
try {
await adminSeeder(dbConnection);
await manager.insert(DiscountRule, {
@@ -120,6 +120,8 @@ describe("/admin/discounts", () => {
id: "test-discount",
code: "TESTING",
rule_id: "test-discount-rule",
is_dynamic: false,
is_disabled: false,
});
} catch (err) {
throw err;
@@ -127,6 +129,7 @@ describe("/admin/discounts", () => {
});
afterEach(async () => {
manager = dbConnection.manager;
await manager.query(`DELETE FROM "discount"`);
await manager.query(`DELETE FROM "discount_rule"`);
await manager.query(`DELETE FROM "user"`);
@@ -173,7 +176,7 @@ describe("/admin/discounts", () => {
expect(response.status).toEqual(200);
expect(response.data.discount).toEqual(
expect.objectContaining({
code: "HELLOWORLD",
code: "TESTING",
usage_limit: 10,
})
);

View File

@@ -92,6 +92,8 @@ describe("/admin/products", () => {
expect(response.data.product).toEqual(
expect.objectContaining({
title: "Test product",
discountable: true,
is_giftcard: false,
handle: "test-product",
images: expect.arrayContaining([
expect.objectContaining({
@@ -148,6 +150,43 @@ describe("/admin/products", () => {
);
});
it("creates a giftcard", async () => {
const api = useApi();
const payload = {
title: "Test Giftcard",
is_giftcard: true,
description: "test-giftcard-description",
options: [{ title: "Denominations" }],
variants: [
{
title: "Test variant",
prices: [{ currency_code: "usd", amount: 100 }],
options: [{ value: "100" }],
},
],
};
const response = await api
.post("/admin/products", payload, {
headers: {
Authorization: "Bearer test_token",
},
})
.catch((err) => {
console.log(err);
});
expect(response.status).toEqual(200);
expect(response.data.product).toEqual(
expect.objectContaining({
title: "Test Giftcard",
discountable: false,
})
);
});
it("updates a product (update tags, delete collection, delete type, replaces images)", async () => {
const api = useApi();

View File

@@ -18,8 +18,12 @@ describe("/store/carts", () => {
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 "line_item"`);
await manager.query(`DELETE FROM "cart"`);
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 "address"`);
await manager.query(`DELETE FROM "customer"`);
await manager.query(
@@ -233,6 +237,44 @@ describe("/store/carts", () => {
expect(cartWithShippingMethod.status).toEqual(200);
});
it("adds a giftcard to cart, but ensures discount only applied to discountable items", async () => {
const api = useApi();
// Add standard line item to cart
await api.post(
"/store/carts/test-cart/line-items",
{
variant_id: "test-variant",
quantity: 1,
},
{ withCredentials: true }
);
// Add gift card to cart
await api.post(
"/store/carts/test-cart/line-items",
{
variant_id: "giftcard-denom",
quantity: 1,
},
{ withCredentials: true }
);
// Add a 10% discount to the cart
const cartWithGiftcard = await api.post(
"/store/carts/test-cart",
{
discounts: [{ code: "10PERCENT" }],
},
{ withCredentials: true }
);
// Ensure that the discount is only applied to the standard item
expect(cartWithGiftcard.data.cart.total).toBe(1900); // 1000 (giftcard) + 900 (standard item with 10% discount)
expect(cartWithGiftcard.data.cart.discount_total).toBe(100);
expect(cartWithGiftcard.status).toEqual(200);
});
it("adds no more than 1 shipping method per shipping profile", async () => {
const api = useApi();
const addShippingMethod = async (option_id) => {

View File

@@ -8,6 +8,9 @@ const {
ShippingOption,
ShippingMethod,
Address,
ProductVariant,
Product,
MoneyAmount,
} = require("@medusajs/medusa");
module.exports = async (connection, data = {}) => {
@@ -17,6 +20,10 @@ module.exports = async (connection, data = {}) => {
type: "default",
});
const gcProfile = await manager.findOne(ShippingProfile, {
type: "gift_card",
});
await manager.insert(Address, {
id: "test-general-address",
first_name: "superman",
@@ -47,9 +54,27 @@ module.exports = async (connection, data = {}) => {
freeDisc.regions = [r];
freeDisc.rule = freeRule;
await manager.save(freeDisc);
const tenPercentRule = manager.create(DiscountRule, {
id: "tenpercent-rule",
description: "Ten percent rule",
type: "percentage",
value: 10,
allocation: "total",
});
const tenPercent = manager.create(Discount, {
id: "10Percent",
code: "10PERCENT",
is_dynamic: false,
is_disabled: false,
});
tenPercent.regions = [r];
tenPercent.rule = tenPercentRule;
await manager.save(tenPercent);
const d = await manager.create(Discount, {
id: "test-discount",
code: "CREATED",
@@ -100,6 +125,17 @@ module.exports = async (connection, data = {}) => {
data: {},
});
await manager.insert(ShippingOption, {
id: "gc-option",
name: "Digital copy",
provider_id: "test-ful",
region_id: "test-region",
profile_id: gcProfile.id,
price_type: "flat_rate",
amount: 0,
data: {},
});
await manager.insert(ShippingOption, {
id: "test-option-2",
name: "test-option-2",
@@ -111,6 +147,62 @@ module.exports = async (connection, data = {}) => {
data: {},
});
await manager.insert(Product, {
id: "giftcard-product",
title: "Giftcard",
is_giftcard: true,
discountable: false,
profile_id: gcProfile.id,
options: [{ id: "denom", title: "Denomination" }],
});
await manager.insert(ProductVariant, {
id: "giftcard-denom",
title: "1000",
product_id: "giftcard-product",
inventory_quantity: 1,
options: [
{
option_id: "denom",
value: "1000",
},
],
});
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",
},
],
});
const ma = manager.create(MoneyAmount, {
variant_id: "test-variant",
currency_code: "usd",
amount: 1000,
});
await manager.save(ma);
const ma2 = manager.create(MoneyAmount, {
variant_id: "giftcard-denom",
currency_code: "usd",
amount: 1000,
});
await manager.save(ma2);
const cart = manager.create(Cart, {
id: "test-cart",
customer_id: "some-customer",

View File

@@ -8,7 +8,7 @@
"build": "babel src -d dist --extensions \".ts,.js\""
},
"dependencies": {
"@medusajs/medusa": "^1.1.32",
"@medusajs/medusa": "1.1.33-dev-1627995051381",
"medusa-interfaces": "^1.1.18",
"typeorm": "^0.2.31"
},

File diff suppressed because it is too large Load Diff