Adding tests for updating products
parent
fc1580ddd6
commit
fad68a51ea
|
@ -2,6 +2,9 @@
|
||||||
"id": "/editProduct",
|
"id": "/editProduct",
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
"productId": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"productPermalink": {
|
"productPermalink": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
|
@ -31,10 +34,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": [
|
||||||
"productPermalink",
|
"productId"
|
||||||
"productTitle",
|
|
||||||
"productPrice",
|
|
||||||
"productDescription",
|
|
||||||
"productPublished"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -198,7 +198,7 @@ router.post('/admin/product/insert', restrict, checkAccess, (req, res) => {
|
||||||
|
|
||||||
// If API request, return json
|
// If API request, return json
|
||||||
if(req.apiAuthenticated){
|
if(req.apiAuthenticated){
|
||||||
res.status(200).json({ error: 'New product successfully created' });
|
res.status(200).json({ message: 'New product successfully created' });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -244,24 +244,44 @@ router.get('/admin/product/edit/:id', restrict, checkAccess, (req, res) => {
|
||||||
router.post('/admin/product/update', restrict, checkAccess, (req, res) => {
|
router.post('/admin/product/update', restrict, checkAccess, (req, res) => {
|
||||||
const db = req.app.db;
|
const db = req.app.db;
|
||||||
|
|
||||||
db.products.findOne({ _id: common.getId(req.body.frmProductId) }, (err, product) => {
|
db.products.findOne({ _id: common.getId(req.body.productId) }, (err, product) => {
|
||||||
if(err){
|
if(err){
|
||||||
console.info(err.stack);
|
console.info(err.stack);
|
||||||
req.session.message = 'Failed updating product.';
|
req.session.message = 'Failed updating product.';
|
||||||
req.session.messageType = 'danger';
|
req.session.messageType = 'danger';
|
||||||
res.redirect('/admin/product/edit/' + req.body.frmProductId);
|
|
||||||
|
// If API request, return json
|
||||||
|
if(req.apiAuthenticated){
|
||||||
|
res.status(400).json({ messge: 'Failed to update product' });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
res.redirect('/admin/product/edit/' + req.body.productId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
db.products.count({ 'productPermalink': req.body.productPermalink, _id: { $ne: common.getId(product._id) } }, (err, count) => {
|
db.products.count({ 'productPermalink': req.body.productPermalink, _id: { $ne: common.getId(product._id) } }, (err, count) => {
|
||||||
if(err){
|
if(err){
|
||||||
console.info(err.stack);
|
console.info(err.stack);
|
||||||
|
|
||||||
|
// If API request, return json
|
||||||
|
if(req.apiAuthenticated){
|
||||||
|
res.status(400).json({ messge: 'Failed to update product' });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
req.session.message = 'Failed updating product.';
|
req.session.message = 'Failed updating product.';
|
||||||
req.session.messageType = 'danger';
|
req.session.messageType = 'danger';
|
||||||
res.redirect('/admin/product/edit/' + req.body.frmProductId);
|
res.redirect('/admin/product/edit/' + req.body.productId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(count > 0 && req.body.productPermalink !== ''){
|
if(count > 0 && req.body.productPermalink !== ''){
|
||||||
|
// If API request, return json
|
||||||
|
if(req.apiAuthenticated){
|
||||||
|
res.status(400).json({ messge: 'Permalink already exists. Pick a new one' });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// permalink exits
|
// permalink exits
|
||||||
req.session.message = 'Permalink already exists. Pick a new one.';
|
req.session.message = 'Permalink already exists. Pick a new one.';
|
||||||
req.session.messageType = 'danger';
|
req.session.messageType = 'danger';
|
||||||
|
@ -277,9 +297,9 @@ router.post('/admin/product/update', restrict, checkAccess, (req, res) => {
|
||||||
req.session.productStock = req.body.productStock ? req.body.productStock : null;
|
req.session.productStock = req.body.productStock ? req.body.productStock : null;
|
||||||
|
|
||||||
// redirect to insert
|
// redirect to insert
|
||||||
res.redirect('/admin/product/edit/' + req.body.frmProductId);
|
res.redirect('/admin/product/edit/' + req.body.productId);
|
||||||
}else{
|
}else{
|
||||||
common.getImages(req.body.frmProductId, req, res, (images) => {
|
common.getImages(req.body.productId, req, res, (images) => {
|
||||||
// Process supplied options
|
// Process supplied options
|
||||||
let productOptions = req.body.productOptions;
|
let productOptions = req.body.productOptions;
|
||||||
if(productOptions && typeof productOptions !== 'object'){
|
if(productOptions && typeof productOptions !== 'object'){
|
||||||
|
@ -291,6 +311,7 @@ router.post('/admin/product/update', restrict, checkAccess, (req, res) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
let productDoc = {
|
let productDoc = {
|
||||||
|
productId: req.body.productId,
|
||||||
productPermalink: req.body.productPermalink,
|
productPermalink: req.body.productPermalink,
|
||||||
productTitle: common.cleanHtml(req.body.productTitle),
|
productTitle: common.cleanHtml(req.body.productTitle),
|
||||||
productPrice: common.safeParseInt(req.body.productPrice),
|
productPrice: common.safeParseInt(req.body.productPrice),
|
||||||
|
@ -311,7 +332,6 @@ router.post('/admin/product/update', restrict, checkAccess, (req, res) => {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('schemaResult errors', schemaResult.errors);
|
|
||||||
req.session.message = 'Form invalid. Please check values and try again.';
|
req.session.message = 'Form invalid. Please check values and try again.';
|
||||||
req.session.messageType = 'danger';
|
req.session.messageType = 'danger';
|
||||||
|
|
||||||
|
@ -326,10 +346,13 @@ router.post('/admin/product/update', restrict, checkAccess, (req, res) => {
|
||||||
req.session.productStock = req.body.productStock ? parseInt(req.body.productStock) : null;
|
req.session.productStock = req.body.productStock ? parseInt(req.body.productStock) : null;
|
||||||
|
|
||||||
// redirect to insert
|
// redirect to insert
|
||||||
res.redirect('/admin/product/edit/' + req.body.frmProductId);
|
res.redirect('/admin/product/edit/' + req.body.productId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove productId from doc
|
||||||
|
delete productDoc.productId;
|
||||||
|
|
||||||
// if no featured image
|
// if no featured image
|
||||||
if(!product.productImage){
|
if(!product.productImage){
|
||||||
if(images.length > 0){
|
if(images.length > 0){
|
||||||
|
@ -341,19 +364,31 @@ router.post('/admin/product/update', restrict, checkAccess, (req, res) => {
|
||||||
productDoc['productImage'] = product.productImage;
|
productDoc['productImage'] = product.productImage;
|
||||||
}
|
}
|
||||||
|
|
||||||
db.products.update({ _id: common.getId(req.body.frmProductId) }, { $set: productDoc }, {}, (err, numReplaced) => {
|
db.products.update({ _id: common.getId(req.body.productId) }, { $set: productDoc }, {}, (err, numReplaced) => {
|
||||||
if(err){
|
if(err){
|
||||||
|
// If API request, return json
|
||||||
|
if(req.apiAuthenticated){
|
||||||
|
res.status(400).json({ messge: 'Failed to save. Please try again' });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
console.error(colors.red('Failed to save product: ' + err));
|
console.error(colors.red('Failed to save product: ' + err));
|
||||||
req.session.message = 'Failed to save. Please try again';
|
req.session.message = 'Failed to save. Please try again';
|
||||||
req.session.messageType = 'danger';
|
req.session.messageType = 'danger';
|
||||||
res.redirect('/admin/product/edit/' + req.body.frmProductId);
|
res.redirect('/admin/product/edit/' + req.body.productId);
|
||||||
}else{
|
}else{
|
||||||
// Update the index
|
// Update the index
|
||||||
indexProducts(req.app)
|
indexProducts(req.app)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
// If API request, return json
|
||||||
|
if(req.apiAuthenticated){
|
||||||
|
res.status(200).json({ message: 'Successfully saved', product: productDoc });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
req.session.message = 'Successfully saved';
|
req.session.message = 'Successfully saved';
|
||||||
req.session.messageType = 'success';
|
req.session.messageType = 'success';
|
||||||
res.redirect('/admin/product/edit/' + req.body.frmProductId);
|
res.redirect('/admin/product/edit/' + req.body.productId);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
62
test/test.js
62
test/test.js
|
@ -334,3 +334,65 @@ test.serial('[Success] Get single customer', async t => {
|
||||||
// Check the returned customer matches ID
|
// Check the returned customer matches ID
|
||||||
t.deepEqual(customers[0]._id.toString(), res.body._id);
|
t.deepEqual(customers[0]._id.toString(), res.body._id);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test.serial('[Success] Add a product', async t => {
|
||||||
|
const product = {
|
||||||
|
productPermalink: 'test-jacket',
|
||||||
|
productTitle: 'Test Jacket',
|
||||||
|
productPrice: 100,
|
||||||
|
productDescription: 'Test desc',
|
||||||
|
productPublished: true,
|
||||||
|
productTags: 'organic, jacket',
|
||||||
|
productOptions: {
|
||||||
|
Size: {
|
||||||
|
optName: 'Size',
|
||||||
|
optLabel: 'Select size',
|
||||||
|
optType: 'select',
|
||||||
|
optOptions: ['S', 'M', 'L', 'XL']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
productComment: 'test comment',
|
||||||
|
productStock: 50
|
||||||
|
};
|
||||||
|
|
||||||
|
const res = await request
|
||||||
|
.post('/admin/product/insert')
|
||||||
|
.send(product)
|
||||||
|
.set('apiKey', users[0].apiKey)
|
||||||
|
.expect(200);
|
||||||
|
|
||||||
|
// Check the returned message
|
||||||
|
t.deepEqual(res.body.message, 'New product successfully created');
|
||||||
|
});
|
||||||
|
|
||||||
|
test.serial('[Success] Update a product', async t => {
|
||||||
|
const product = {
|
||||||
|
productId: products[0]._id,
|
||||||
|
productTitle: 'Test Jacket',
|
||||||
|
productPrice: 200,
|
||||||
|
productDescription: 'Test desc',
|
||||||
|
productPublished: true,
|
||||||
|
productTags: 'organic, jacket',
|
||||||
|
productOptions: {
|
||||||
|
Size: {
|
||||||
|
optName: 'Size',
|
||||||
|
optLabel: 'Select size',
|
||||||
|
optType: 'select',
|
||||||
|
optOptions: ['S', 'M', 'L', 'XL']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
productComment: 'test comment',
|
||||||
|
productStock: 50
|
||||||
|
};
|
||||||
|
|
||||||
|
const res = await request
|
||||||
|
.post('/admin/product/update')
|
||||||
|
.send(product)
|
||||||
|
.set('apiKey', users[0].apiKey)
|
||||||
|
.expect(200);
|
||||||
|
|
||||||
|
// Check the returned message
|
||||||
|
t.deepEqual(res.body.message, 'Successfully saved');
|
||||||
|
t.deepEqual(res.body.product.productTitle, product.productTitle);
|
||||||
|
t.deepEqual(res.body.product.productPrice, product.productPrice);
|
||||||
|
});
|
||||||
|
|
|
@ -151,7 +151,7 @@
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<input type="hidden" name="frmProductId" id="frmProductId" value="{{result._id}}" />
|
<input type="hidden" name="productId" id="productId" value="{{result._id}}" />
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue