LearningSalesForceCommerceC.../storefront-reference-architecture/test/unit/modules/server/request.js

516 lines
19 KiB
JavaScript
Raw Permalink Normal View History

2021-12-21 10:57:31 -08:00
'use strict';
var assert = require('chai').assert;
var proxyquire = require('proxyquire').noCallThru().noPreserveCache();
var sinon = require('sinon');
var ArrayList = require('../../../mocks/dw.util.Collection');
var Request = proxyquire('../../../../cartridges/modules/server/request', {
'dw/util/Locale': {
getLocale: function () {
return { ID: 'en_US', country: 'US' };
}
},
'dw/util/Currency': {
getCurrency: function () {
return 'currency';
}
},
'*/cartridge/config/countries': [
{
'id': 'en_US',
'currencyCode': 'USD',
'alternativeCurrencyCodes': ['CAD']
}, {
'id': 'en_GB',
'currencyCode': 'GBP'
}, {
'id': 'ja_JP',
'currencyCode': 'JPY'
}, {
'id': 'zh_CN',
'currencyCode': 'CNY'
}, {
'id': 'fr_FR',
'currencyCode': 'EUR'
}, {
'id': 'it_IT',
'currencyCode': 'EUR'
}]
});
var session = {
setCurrency: function () { return; }
};
var setCurrencyStub = sinon.stub(session, 'setCurrency');
function createFakeRequest(overrides) {
overrides = overrides || {}; // eslint-disable-line no-param-reassign
var globalRequest = {
httpMethod: 'GET',
httpHost: 'localhost',
httpPath: '/Product-Show',
httpQueryString: '',
httpParameterMap: {
requestBodyAsString: ''
},
isHttpSecure: function () {
return false;
},
getHttpReferer: function () {
return 'https://www.salesforce.com';
},
getHttpRemoteAddress: function () {
return '0.0.0.0';
},
geolocation: {
countryCode: 'US',
latitude: 42.4019,
longitude: -71.1193
},
customer: {
authenticated: true,
profile: {
firstName: 'John',
lastName: 'Snow',
email: 'jsnow@starks.com',
phoneHome: '1234567890',
credentials: {
login: 'jsnow@starks.com'
},
wallet: {
paymentInstruments: new ArrayList([
{
creditCardHolder: 'someName',
maskedCreditCardNumber: 'someMaskedNumber',
creditCardType: 'someCardType',
creditCardExpirationMonth: 'someMonth',
creditCardExpirationYear: 'someYear',
UUID: 'someUUID',
creditCardNumber: 'someNumber'
}
])
}
},
addressBook: {
preferredAddress: {
address1: '15 South Point Drive',
address2: null,
city: 'Boston',
countryCode: {
displayValue: 'United States',
value: 'US'
},
firstName: 'John',
lastName: 'Snow',
ID: 'Home',
postalCode: '02125',
stateCode: 'MA',
postBox: '2134',
salutation: null,
secondName: null,
suffix: null,
suite: '302',
title: 'Dr'
}
}
},
locale: 'ab_YZ',
pageMetaData: {
title: '',
description: '',
keywords: '',
pageMetaTags: [{}],
addPageMetaTags: function (pageMetaTags) {
this.pageMetaTags = pageMetaTags;
},
setTitle: function (title) {
this.title = title;
},
setDescription: function (description) {
this.description = description;
},
setKeywords: function (keywords) {
this.keywords = keywords;
}
},
session: {
currency: {
currencyCode: 'XYZ',
defaultFractionDigits: 10,
name: 'Volodin Dollars',
symbol: '៛'
},
custom: {
rememberMe: true
},
privacyCache: {
get: function (key) { // eslint-disable-line no-unused-vars
return this.key;
},
set: function (value) { // eslint-disable-line no-unused-vars
this.key = value;
},
key: 'value'
},
clickStream: {
clicks: {
toArray: function () {
return [{
host: 'clickObj.host',
locale: 'clickObj.locale',
path: 'clickObj.path',
pipelineName: 'clickObj-pipelineName',
queryString: 'clickObj.queryString',
referer: 'clickObj.referer',
remoteAddress: 'clickObj.remoteAddress',
timestamp: 'clickObj.timestamp',
url: 'clickObj.url',
userAgent: 'clickObj.userAgent'
}];
}
},
partial: false
},
setCurrency: setCurrencyStub
}
};
Object.keys(overrides).forEach(function (key) {
globalRequest[key] = overrides[key];
});
return globalRequest;
}
describe('request', function () {
afterEach(function () {
setCurrencyStub.reset();
});
it('should parse empty query string', function () {
var req = new Request(createFakeRequest(), createFakeRequest().customer, createFakeRequest().session);
assert.isObject(req.querystring);
assert.equal(Object.keys(req.querystring).length, 0);
assert.equal(req.querystring.toString(), '');
});
it('should parse simple query string', function () {
var req = new Request(createFakeRequest({ httpQueryString: 'id=22&name=foo' }), createFakeRequest().customer, createFakeRequest().session);
assert.isObject(req.querystring);
assert.equal(req.querystring.id, 22);
assert.equal(req.querystring.name, 'foo');
assert.equal(req.querystring.toString(), 'id=22&name=foo');
});
it('should parse query string with variables', function () {
var req = new Request(createFakeRequest({
httpQueryString: 'dwvar_bar_size=32&dwvar_foo_color=1111'
}), createFakeRequest().customer, createFakeRequest().session);
assert.equal(req.querystring.variables.color.id, 'foo');
assert.equal(req.querystring.variables.color.value, '1111');
assert.equal(req.querystring.variables.size.id, 'bar');
assert.equal(req.querystring.variables.size.value, '32');
assert.notProperty(req.querystring, 'dwvar_foo_color');
assert.notProperty(req.querystring, 'dwvar_bar_size');
assert.equal(req.querystring.toString(), 'dwvar_bar_size=32&dwvar_foo_color=1111');
});
it('should parse query string with incorrectly formatted variables', function () {
var req = new Request(createFakeRequest({
httpQueryString: 'dwvar_color=1111&dwvar_size=32'
}), createFakeRequest().customer, createFakeRequest().session);
assert.equal(req.querystring.dwvar_color, '1111');
assert.equal(req.querystring.dwvar_size, '32');
assert.notProperty(req.querystring, 'variables');
assert.equal(req.querystring.toString(), 'dwvar_color=1111&dwvar_size=32');
});
it('should contain correct geolocation object and properties', function () {
var req = new Request(createFakeRequest(), createFakeRequest().customer, createFakeRequest().session);
assert.equal(req.geolocation.countryCode, 'US');
assert.equal(req.geolocation.latitude, 42.4019);
assert.equal(req.geolocation.longitude, -71.1193);
});
it('should contain correct current customer profile and properties', function () {
var req = new Request(createFakeRequest(), createFakeRequest().customer, createFakeRequest().session);
assert.equal(req.currentCustomer.profile.firstName, 'John');
assert.equal(req.currentCustomer.profile.lastName, 'Snow');
assert.equal(req.currentCustomer.profile.email, 'jsnow@starks.com');
assert.equal(req.currentCustomer.profile.phone, '1234567890');
});
it('should contain correct customer credentials when customer unauthenticated', function () {
var fakeRequest = createFakeRequest();
fakeRequest.customer.authenticated = false;
var req = new Request(fakeRequest, fakeRequest.customer, createFakeRequest().session);
assert.equal(req.currentCustomer.credentials.username, 'jsnow@starks.com');
});
it('should contain correct current customer address book and properties', function () {
var req = new Request(createFakeRequest(), createFakeRequest().customer, createFakeRequest().session);
var expectedResult = createFakeRequest();
assert.equal(
req.currentCustomer.addressBook.preferredAddress.address1,
'15 South Point Drive'
);
assert.equal(
req.currentCustomer.addressBook.preferredAddress.address2,
null
);
assert.equal(
req.currentCustomer.addressBook.preferredAddress.city,
'Boston'
);
assert.equal(
req.currentCustomer.addressBook.preferredAddress.countryCode.displayValue,
'United States'
);
assert.equal(
req.currentCustomer.addressBook.preferredAddress.countryCode.value,
'US'
);
assert.equal(
req.currentCustomer.addressBook.preferredAddress.firstName,
'John'
);
assert.equal(
req.currentCustomer.addressBook.preferredAddress.lastName,
'Snow'
);
assert.equal(
req.currentCustomer.addressBook.preferredAddress.ID,
'Home'
);
assert.equal(
req.currentCustomer.addressBook.preferredAddress.stateCode,
'MA'
);
assert.equal(
req.currentCustomer.addressBook.preferredAddress.postalCode,
'02125'
);
assert.equal(
req.currentCustomer.addressBook.preferredAddress.postBox,
'2134'
);
assert.equal(
req.currentCustomer.addressBook.preferredAddress.salutation,
null
);
assert.equal(
req.currentCustomer.addressBook.preferredAddress.secondName,
null
);
assert.equal(
req.currentCustomer.addressBook.preferredAddress.suffix,
null
);
assert.equal(
req.currentCustomer.addressBook.preferredAddress.suite,
'302'
);
assert.equal(
req.currentCustomer.addressBook.preferredAddress.title,
'Dr'
);
assert.deepEqual(
req.currentCustomer.addressBook.preferredAddress.raw,
expectedResult.customer.addressBook.preferredAddress
);
});
it('should contain correct current customer wallet and properties', function () {
var req = new Request(createFakeRequest(), createFakeRequest().customer, createFakeRequest().session);
var expectedResult = createFakeRequest();
assert.deepEqual(
req.currentCustomer.wallet.paymentInstrument,
expectedResult.customer.profile.wallet.paymentInstruments[0]
);
});
it('should not fail if customer does not exist', function () {
var req = new Request(createFakeRequest({ customer: null }), null, createFakeRequest().session);
assert.equal(req.host, 'localhost');
});
it('should not fail if customer does not have a profile', function () {
var req = new Request(createFakeRequest({ customer: { profile: null } }), { profile: null }, createFakeRequest().session);
assert.equal(req.currentCustomer.raw.profile, null);
});
it('should retrieve form properties', function () {
var items = {
one: { rawValue: 1 },
two: { rawValue: 2 },
three: { rawValue: 3 },
submitted: { },
id: { rawValue: 22 },
name: { rawValue: 'foo' }
};
var httpParamMap = {
parameterNames: {
iterator: function () {
var index = 0;
return {
hasNext: function () {
return index < Object.keys(items).length - 1;
},
next: function () {
var value = Object.keys(items)[index];
index++;
return value;
}
};
},
length: Object.keys(items).length
},
get: function (name) {
return items[name];
}
};
var req = new Request(
createFakeRequest({ httpParameterMap: httpParamMap, httpQueryString: 'id=22&name=foo' }),
null,
createFakeRequest().session
);
assert.equal(req.form.one, 1);
assert.equal(req.form.two, 2);
assert.equal(req.form.three, 3);
assert.isUndefined(req.form.submitted);
assert.isUndefined(req.form.id);
});
it('should contain locale ID', function () {
var req = new Request(createFakeRequest(), createFakeRequest().customer, createFakeRequest().session);
var expectedResult = createFakeRequest();
assert.deepEqual(
req.locale.id,
expectedResult.locale
);
});
it('should contain session currency', function () {
var req = new Request(createFakeRequest(), createFakeRequest().customer, createFakeRequest().session);
var expectedResult = createFakeRequest();
assert.deepEqual(
req.locale.currency,
expectedResult.session.currency
);
});
it('should contain session privacy', function () {
var req = new Request(createFakeRequest(), createFakeRequest().customer, createFakeRequest().session);
var expectedResult = req.session.raw.privacyCache.get('key');
assert.equal(expectedResult, 'value');
});
it('should contain session clickStream', function () {
var req = new Request(createFakeRequest(), createFakeRequest().customer, createFakeRequest().session);
var expectedClick = {
host: 'clickObj.host',
locale: 'clickObj.locale',
path: 'clickObj.path',
pipelineName: 'clickObj-pipelineName',
queryString: 'clickObj.queryString',
referer: 'clickObj.referer',
remoteAddress: 'clickObj.remoteAddress',
timestamp: 'clickObj.timestamp',
url: 'clickObj.url',
userAgent: 'clickObj.userAgent'
};
var expectedResult = {
clicks: [expectedClick],
first: expectedClick,
last: expectedClick,
partial: false
};
assert.deepEqual(req.session.clickStream, expectedResult);
});
it('should call setCurrency once', function () {
new Request(createFakeRequest(), createFakeRequest().customer, createFakeRequest().session);
assert.isTrue(setCurrencyStub.calledOnce);
});
it('should not call setCurrency when currency is a alternative currency code', function () {
var fakeRequest = createFakeRequest({
locale: 'en_US'
});
fakeRequest.session.currency.currencyCode = 'CAD';
new Request(fakeRequest, fakeRequest.customer, fakeRequest.session);
assert.isFalse(setCurrencyStub.calledOnce);
});
it('should contain correct geolocation object and properties wehn co geolocation exists', function () {
var fakeRequest = createFakeRequest();
delete fakeRequest.geolocation;
var req = new Request(fakeRequest, createFakeRequest().customer, createFakeRequest().session);
assert.equal(req.geolocation.countryCode, 'US');
assert.equal(req.geolocation.latitude, 90.0000);
assert.equal(req.geolocation.longitude, 0.0000);
});
it('should contain the correct referer', function () {
var req = new Request(createFakeRequest(), createFakeRequest().customer, createFakeRequest().session);
assert.equal(req.referer, 'https://www.salesforce.com');
});
it('should contain the correct remote address', function () {
var req = new Request(createFakeRequest(), createFakeRequest().customer, createFakeRequest().session);
assert.equal(req.remoteAddress, '0.0.0.0');
});
it('should not get body as string for a GET request', function () {
var req = new Request(createFakeRequest(), createFakeRequest().customer, createFakeRequest().session);
assert.equal(req.body, null);
});
it('should get body as string for a POST request', function () {
var fakeRequest = createFakeRequest();
fakeRequest.httpMethod = 'POST';
var req = new Request(fakeRequest, createFakeRequest().customer, createFakeRequest().session);
assert.equal(req.body, '');
});
it('should get body as string for a PUT request', function () {
var fakeRequest = createFakeRequest();
fakeRequest.httpMethod = 'PUT';
var req = new Request(fakeRequest, createFakeRequest().customer, createFakeRequest().session);
assert.equal(req.body, '');
});
it('should get pageMetaData title', function () {
var fakeRequest = createFakeRequest();
fakeRequest.pageMetaData.setTitle('TestTitle');
var req = new Request(fakeRequest, createFakeRequest().customer, createFakeRequest().session);
assert.equal(req.pageMetaData.title, 'TestTitle');
});
it('should get pageMetaData description', function () {
var fakeRequest = createFakeRequest();
fakeRequest.pageMetaData.setDescription('TestDescription');
var req = new Request(fakeRequest, createFakeRequest().customer, createFakeRequest().session);
assert.equal(req.pageMetaData.description, 'TestDescription');
});
it('should get pageMetaData keywords', function () {
var fakeRequest = createFakeRequest();
fakeRequest.pageMetaData.setKeywords('TestKeywords');
var req = new Request(fakeRequest, createFakeRequest().customer, createFakeRequest().session);
assert.equal(req.pageMetaData.keywords, 'TestKeywords');
});
it('should get pageMetaData pageMetaTags', function () {
var fakeRequest = createFakeRequest();
fakeRequest.pageMetaData.addPageMetaTags([{ title: true, content: 'TestTitle' }]);
var req = new Request(fakeRequest, createFakeRequest().customer, createFakeRequest().session);
assert.deepEqual(req.pageMetaData.pageMetaTags, [{ title: true, content: 'TestTitle' }]);
});
});