LearningSalesForceCommerceC.../storefront-reference-architecture/test/integration/cart/updateQuantityOnProdVariant.js
2021-12-21 10:57:31 -08:00

240 lines
8.9 KiB
JavaScript

var assert = require('chai').assert;
var request = require('request-promise');
var config = require('../it.config');
var jsonHelpers = require('../helpers/jsonUtils');
var chai = require('chai');
var chaiSubset = require('chai-subset');
chai.use(chaiSubset);
describe('Update quantity for product variant', function () {
this.timeout(45000);
var variantPid1 = '701643421084M';
var qty1 = 2;
var variantPid2 = '701642923459M';
var qty2 = 1;
var variantPid3 = '029407331258M';
var qty3 = 3;
var prodIdUuidMap = {};
var cookieJar = request.jar();
var myRequest = {
url: '',
method: 'POST',
rejectUnauthorized: false,
resolveWithFullResponse: true,
jar: cookieJar,
headers: {
'X-Requested-With': 'XMLHttpRequest'
}
};
var cookieString;
before(function () {
// ----- adding product #1:
myRequest.url = config.baseUrl + '/Cart-AddProduct';
myRequest.form = {
pid: variantPid1,
quantity: qty1
};
return request(myRequest)
.then(function () {
cookieString = cookieJar.getCookieString(myRequest.url);
})
// ----- adding product #2, a different variant of same product 1:
.then(function () {
myRequest.url = config.baseUrl + '/Cart-AddProduct';
myRequest.form = {
pid: variantPid2,
quantity: qty2
};
var cookie = request.cookie(cookieString);
cookieJar.setCookie(cookie, myRequest.url);
return request(myRequest);
})
// ----- adding product #3:
.then(function () {
myRequest.url = config.baseUrl + '/Cart-AddProduct';
myRequest.form = {
pid: variantPid3,
quantity: qty3
};
return request(myRequest);
})
// ----- select a shipping method. Need to have shipping method so that shipping cost, sales tax,
// and grand total can be calculated
.then(function () {
var shipMethodId = '001'; // 001 = Ground
myRequest.method = 'POST';
myRequest.url = config.baseUrl + '/Cart-SelectShippingMethod?methodID=' + shipMethodId;
return request(myRequest);
})
// ----- Get UUID for each product line items
.then(function (response4) {
var bodyAsJson = JSON.parse(response4.body);
prodIdUuidMap[bodyAsJson.items[0].id] = bodyAsJson.items[0].UUID;
prodIdUuidMap[bodyAsJson.items[1].id] = bodyAsJson.items[1].UUID;
prodIdUuidMap[bodyAsJson.items[2].id] = bodyAsJson.items[2].UUID;
});
});
it('1. should update line item quantity', function () {
// updating quantity of poduct variant 2
var newQty2 = 5;
var newTotal = qty1 + newQty2 + qty3;
var expectQty1 = qty1;
var expectQty2 = newQty2;
var expectQty3 = qty3;
var variantUuid1 = prodIdUuidMap[variantPid1];
var variantUuid2 = prodIdUuidMap[variantPid2];
var variantUuid3 = prodIdUuidMap[variantPid3];
var expectedUpdateRep = {
'action': 'Cart-UpdateQuantity',
'totals': {
'subTotal': '$257.97',
'grandTotal': '$281.36',
'totalTax': '$13.40',
'totalShippingCost': '$9.99'
},
'items': [
{
'id': variantPid1,
'productName': '3/4 Sleeve V-Neck Top',
'price': {
'sales': {
'currency': 'USD',
'value': 24
}
},
'variationAttributes': [
{
'displayName': 'Color',
'displayValue': 'Icy Mint'
},
{
'displayName': 'Size',
'displayValue': 'XS'
}
],
'UUID': variantUuid1,
'quantity': expectQty1
},
{
'id': variantPid2,
'productName': '3/4 Sleeve V-Neck Top',
'price': {
'sales': {
'currency': 'USD',
'value': 24
}
},
'variationAttributes': [
{
'displayName': 'Color',
'displayValue': 'Butter'
},
{
'displayName': 'Size',
'displayValue': 'M'
}
],
'UUID': variantUuid2,
'quantity': expectQty2
},
{
'id': variantPid3,
'productName': 'Solid Silk Tie',
'price': {
'list': {
'currency': 'USD',
'value': 39.5
},
'sales': {
'currency': 'USD',
'value': 29.99
}
},
'variationAttributes': [
{
'displayName': 'Color',
'displayValue': 'Red'
}
],
'UUID': variantUuid3,
'quantity': expectQty3
}
],
'numItems': newTotal,
'locale': 'en_US',
'resources': {
'numberOfItems': newTotal + ' Items',
'emptyCartMsg': 'Your Shopping Cart is Empty'
}
};
myRequest.method = 'GET';
myRequest.url = config.baseUrl + '/Cart-UpdateQuantity?pid=' + variantPid2 + '&uuid=' + variantUuid2 + '&quantity=' + newQty2;
return request(myRequest)
.then(function (updateRsp) {
assert.equal(updateRsp.statusCode, 200, 'Expected statusCode to be 200.');
var bodyAsJson = jsonHelpers.deleteProperties(JSON.parse(updateRsp.body), ['queryString']);
assert.containSubset(bodyAsJson, expectedUpdateRep, 'Actual response does not contain expectedUpdateRep.');
// Verify path to image source
var prodImageSrc1 = bodyAsJson.items[0].images.small[0].url;
var prodImageSrc2 = bodyAsJson.items[1].images.small[0].url;
var prodImageSrc3 = bodyAsJson.items[2].images.small[0].url;
assert.isTrue(prodImageSrc1.endsWith('/images/small/PG.10221714.JJ8UTXX.PZ.jpg'), 'product 1 item image: src not end with /images/small/PG.10221714.JJ8UTXX.PZ.jpg.');
assert.isTrue(prodImageSrc2.endsWith('/images/small/PG.10221714.JJ370XX.PZ.jpg'), 'product 2 item image: src not end with /images/small/PG.10221714.JJ370XX.PZ.jpg.');
assert.isTrue(prodImageSrc3.endsWith('/images/small/PG.949432114S.REDSI.PZ.jpg'), 'product 3 item image: src not end with /images/small/PG.949432114S.REDSI.PZ.jpg.');
});
});
it('2. should return error if update line item quantity is 0', function () {
var variantUuid1 = prodIdUuidMap[variantPid1];
myRequest.method = 'GET';
myRequest.url = config.baseUrl + '/Cart-UpdateQuantity?pid=' + variantPid1 + '&uuid=' + variantUuid1 + '&quantity=0';
return request(myRequest)
.then(function (updateRsp) {
assert.equal(updateRsp.statusCode, 500, 'Expected request to fail for quantity = 0.');
})
.catch(function (err) {
assert.equal(err.statusCode, 500, 'Expected statusCode to be 500 for 0 quantity.');
});
});
it('3. should return error if update line item quantity is negative', function () {
var variantUuid1 = prodIdUuidMap[variantPid1];
myRequest.method = 'GET';
myRequest.url = config.baseUrl + '/Cart-UpdateQuantity?pid=' + variantPid1 + '&uuid=' + variantUuid1 + '&quantity=-1';
return request(myRequest)
.then(function (updateRsp) {
assert.equal(updateRsp.statusCode, 500, 'Expected request to fail for negative quantity.');
})
.catch(function (err) {
assert.equal(err.statusCode, 500, 'Expected statusCode to be 500 for 0 quantity.');
});
});
});