expressCart/test/specs/discounts.js

238 lines
7.1 KiB
JavaScript

import{ serial as test }from'ava';
const {
runBefore,
g
} = require('../helper');
const moment = require('moment');
test.before(async () => {
await runBefore();
});
test('[Success] Add valid amount discount', async t => {
// Remove any sessions
await g.db.sessions.deleteMany({}, {});
await g.request
.post('/product/addtocart')
.send({
productId: g.products[0]._id,
productQuantity: 1,
productOptions: JSON.stringify(g.products[0].productOptions)
})
.expect(200);
const res = await g.request
.post('/checkout/adddiscountcode')
.send({
discountCode: g.discounts[0].code
})
.expect(200);
t.deepEqual(res.body.message, 'Discount code applied');
// Get our session
const sessions = await g.db.sessions.find({}).toArray();
if(!sessions || sessions.length === 0){
t.fail();
}
// Calculate what we expect
const totalCartAmount = g.products[0].productPrice * 1;
const session = sessions[0].session;
t.deepEqual(session.discountCode, g.discounts[0].code);
t.deepEqual(session.totalCartDiscount, g.discounts[0].value);
t.deepEqual(session.totalCartAmount, totalCartAmount - g.discounts[0].value);
});
test('[Success] Add valid percent discount', async t => {
// Remove any sessions
await g.db.sessions.deleteMany({}, {});
await g.request
.post('/product/addtocart')
.send({
productId: g.products[0]._id,
productQuantity: 1,
productOptions: JSON.stringify(g.products[0].productOptions)
})
.expect(200);
const res = await g.request
.post('/checkout/adddiscountcode')
.send({
discountCode: g.discounts[1].code
})
.expect(200);
t.deepEqual(res.body.message, 'Discount code applied');
// Get our session
const sessions = await g.db.sessions.find({}).toArray();
if(!sessions || sessions.length === 0){
t.fail();
}
// Calculate what we expect - percent
const totalCartAmount = g.products[0].productPrice * 1;
const expectedDiscount = (g.discounts[1].value / 100) * totalCartAmount;
const session = sessions[0].session;
t.deepEqual(session.discountCode, g.discounts[1].code);
t.deepEqual(session.totalCartAmount, totalCartAmount - expectedDiscount);
t.deepEqual(session.totalCartDiscount, expectedDiscount);
});
test('[Fail] Add an expired discount code', async t => {
await g.request
.post('/product/addtocart')
.send({
productId: g.products[0]._id,
productQuantity: 1,
productOptions: JSON.stringify(g.products[0].productOptions)
})
.expect(200);
const res = await g.request
.post('/checkout/adddiscountcode')
.send({
discountCode: g.discounts[2].code
})
.expect(400);
t.deepEqual(res.body.message, 'Discount is expired');
});
test('[Fail] Add a future discount code', async t => {
await g.request
.post('/product/addtocart')
.send({
productId: g.products[0]._id,
productQuantity: 1,
productOptions: JSON.stringify(g.products[0].productOptions)
})
.expect(200);
const res = await g.request
.post('/checkout/adddiscountcode')
.send({
discountCode: g.discounts[3].code
})
.expect(400);
t.deepEqual(res.body.message, 'Discount is expired');
});
test('[Fail] Add a bogus code', async t => {
await g.request
.post('/product/addtocart')
.send({
productId: g.products[0]._id,
productQuantity: 1,
productOptions: JSON.stringify(g.products[0].productOptions)
})
.expect(200);
const res = await g.request
.post('/checkout/adddiscountcode')
.send({
discountCode: 'some_bogus_code'
})
.set('csrf-token', g.csrf)
.expect(400);
t.deepEqual(res.body.message, 'Discount code is invalid or expired');
});
test('[Success] Create a new discount code', async t => {
// Add a discount code
const res = await g.request
.post('/admin/settings/discount/create')
.send({
code: 'TEST_CODE_5',
type: 'amount',
value: 10,
start: moment().add(1, 'days').format('DD/MM/YYYY HH:mm'),
end: moment().add(7, 'days').format('DD/MM/YYYY HH:mm')
})
.set('apiKey', g.users[0].apiKey)
.set('csrf-token', g.csrf)
.expect(200);
t.deepEqual(res.body.message, 'Discount code created successfully');
});
test('[Fail] Create a new discount code with invalid type', async t => {
// Add a discount code
const res = await g.request
.post('/admin/settings/discount/create')
.send({
code: 'TEST_CODE_1',
type: 'bogus_type',
value: 10,
start: moment().add(1, 'days').format('DD/MM/YYYY HH:mm'),
end: moment().add(7, 'days').format('DD/MM/YYYY HH:mm')
})
.set('apiKey', g.users[0].apiKey)
.set('csrf-token', g.csrf)
.expect(400);
t.deepEqual(res.body[0].message, 'should be equal to one of the allowed values');
});
test('[Fail] Create a new discount code with existing code', async t => {
// Add a discount code
const res = await g.request
.post('/admin/settings/discount/create')
.send({
code: 'valid_10_amount_code',
type: 'amount',
value: 10,
start: moment().add(1, 'days').format('DD/MM/YYYY HH:mm'),
end: moment().add(7, 'days').format('DD/MM/YYYY HH:mm')
})
.set('apiKey', g.users[0].apiKey)
.set('csrf-token', g.csrf)
.expect(400);
t.deepEqual(res.body.message, 'Discount code already exists');
});
test('[Success] Update a discount code', async t => {
// Add a discount code
const res = await g.request
.post('/admin/settings/discount/update')
.send({
discountId: g.discounts[0]._id,
code: 'TEST_CODE_99',
type: 'amount',
value: 20,
start: moment().add(1, 'days').format('DD/MM/YYYY HH:mm'),
end: moment().add(7, 'days').format('DD/MM/YYYY HH:mm')
})
.set('apiKey', g.users[0].apiKey)
.expect(200);
t.deepEqual(res.body.discount.value, 20);
t.deepEqual(res.body.message, 'Successfully saved');
});
test('[Fail] Update a discount with same code as existing', async t => {
// Add a discount code
const res = await g.request
.post('/admin/settings/discount/update')
.send({
discountId: g.discounts[1]._id,
code: 'TEST_CODE_99',
type: 'amount',
value: 20,
start: moment().add(1, 'days').format('DD/MM/YYYY HH:mm'),
end: moment().add(7, 'days').format('DD/MM/YYYY HH:mm')
})
.set('apiKey', g.users[0].apiKey)
.expect(400);
t.deepEqual(res.body.message, 'Discount code already exists');
});