516 lines
19 KiB
JavaScript
516 lines
19 KiB
JavaScript
|
'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' }]);
|
||
|
});
|
||
|
});
|