LearningSalesForceCommerceC.../storefront-reference-architecture/test/unit/modules/server/querystring.js
2021-12-21 10:57:31 -08:00

207 lines
9.3 KiB
JavaScript

'use strict';
var assert = require('chai').assert;
var sinon = require('sinon');
var proxyquire = require('proxyquire').noCallThru().noPreserveCache();
var QueryString;
var logSpy;
describe('querystring', function () {
beforeEach(function () {
logSpy = sinon.spy();
QueryString = proxyquire('../../../../cartridges/modules/server/queryString', {
'dw/system/Logger': {
warn: logSpy
}
});
});
describe('options parsing', function () {
it('should parse product option query parameters', function () {
var params = 'dwopt_microsoft-xbox360-console_consoleWarranty=002&' +
'dwopt_microsoft-xbox360-console_gpsWarranty=003&' +
'dwopt_microsoft-xbox360-console_gps_warranty=003';
var querystring = new QueryString(params);
assert.deepEqual([{
optionId: 'gps_warranty',
productId: 'microsoft-xbox360-console',
selectedValueId: '003'
}, {
optionId: 'gpsWarranty',
productId: 'microsoft-xbox360-console',
selectedValueId: '003'
}, {
optionId: 'consoleWarranty',
productId: 'microsoft-xbox360-console',
selectedValueId: '002'
}], querystring.options);
});
it('should parse product option for product with underscore', function () {
var params = 'dwopt_microsoft__xbox360__console_consoleWarranty=002&' +
'dwopt_microsoft__xbox360__console_gpsWarranty=003&' +
'dwopt_microsoft__xbox360__console_gps_warranty=003';
var querystring = new QueryString(params);
assert.deepEqual([{
optionId: 'gps_warranty',
productId: 'microsoft_xbox360_console',
selectedValueId: '003'
}, {
optionId: 'gpsWarranty',
productId: 'microsoft_xbox360_console',
selectedValueId: '003'
}, {
optionId: 'consoleWarranty',
productId: 'microsoft_xbox360_console',
selectedValueId: '002'
}], querystring.options);
});
it('should output options query params', function () {
var params = 'dwopt_microsoft-xbox360-console_consoleWarranty=002&' +
'dwopt_microsoft-xbox360-console_gpsWarranty=003';
var querystring = new QueryString(params);
var paramsOutput = querystring.toString();
assert.equal(paramsOutput, 'dwopt_microsoft-xbox360-console_consoleWarranty=002&' +
'dwopt_microsoft-xbox360-console_gpsWarranty=003');
});
it('should output options query params for product with underscore', function () {
var params = 'dwopt_microsoft__xbox360__console_console_Warranty=002&' +
'dwopt_microsoft__xbox360__console_gpsWarranty=003';
var querystring = new QueryString(params);
var paramsOutput = querystring.toString();
assert.equal(paramsOutput, 'dwopt_microsoft__xbox360__console_console_Warranty=002&' +
'dwopt_microsoft__xbox360__console_gpsWarranty=003');
});
it('creates a single key "x=y" when options is not an array', function () {
var params = 'dwopt_microsoft__xbox360__console_console_Warranty=002&' +
'dwopt_microsoft__xbox360__console_gpsWarranty=003';
var rangeResult = new QueryString(params);
rangeResult.options = 'a simple string';
var paramsOutput = rangeResult.toString();
assert.equal(paramsOutput, 'options=a%20simple%20string');
});
});
describe('variation attribute parsing', function () {
it('should parse product variation query parameters', function () {
var params = 'dwvar_P12345_color=blue&dwvar_P12345_pv_size=L&pid=P12345';
var querystring = new QueryString(params);
assert.deepEqual({
color: {
id: 'P12345',
value: 'blue'
},
pv_size: {
id: 'P12345',
value: 'L'
}
}, querystring.variables);
});
it('should parse product variation param for product with underscores', function () {
var params = 'dwvar_my__test__product_color=blue&dwvar_my__test__product_pv_size=L&pid=P12345';
var querystring = new QueryString(params);
assert.deepEqual({
color: {
id: 'my_test_product',
value: 'blue'
},
pv_size: {
id: 'my_test_product',
value: 'L'
}
}, querystring.variables);
});
it('creates a single key "x=y" when variables is not an object', function () {
var params = 'dwvar_my__test__product_color=blue&dwvar_my__test__product_pv_size=L';
var rangeResult = new QueryString(params);
rangeResult.variables = 'a simple string';
var paramsOutput = rangeResult.toString();
assert.equal(paramsOutput, 'variables=a%20simple%20string');
});
});
describe('search refinements preferences parsing', function () {
it('should parse search refinement preference query parameters', function () {
var params = 'prefn1=pref1&prefv1=pref1Value&prefn2=pref2&prefv2=pref2Value';
var result = new QueryString(params);
assert.deepEqual(result.preferences, {
pref1: 'pref1Value',
pref2: 'pref2Value'
});
});
it('should output preferences query params', function () {
var params = 'prefn1=pref1&prefv1=pref1Value&prefn2=pref2&prefv2=pref2Value';
var result = new QueryString(params);
var paramsOutput = result.toString();
assert.equal(paramsOutput, 'prefn1=pref1&prefn2=pref2&prefv1=pref1Value&prefv2=pref2Value');
});
it('should parse search refinement preference range query parameters', function () {
var rangeParams = 'prefn1=prefName&prefmin1=0&prefmax1=100';
var rangeResult = new QueryString(rangeParams);
assert.deepEqual(rangeResult.preferences, {
prefName: {
min: '0',
max: '100'
}
});
});
it('should output range preference query params', function () {
var rangeParams = 'prefn1=prefName&prefmin1=0&prefmax1=100';
var rangeResult = new QueryString(rangeParams);
var paramsOutput = rangeResult.toString();
assert.deepEqual(paramsOutput, 'prefmax1=100&prefmin1=0&prefn1=prefName');
});
it('outputs range preference without "undefined" when one or more query params is empty or "undefined"', function () {
var rangeParams = 'prefv1=&prefn1=prefName&prefmin1=0&prefmax1=100';
var rangeResult = new QueryString(rangeParams);
var paramsOutput = rangeResult.toString();
assert.deepEqual(paramsOutput, 'prefmax1=100&prefmin1=0&prefn1=prefName');
});
it('warns via Logger when one or more query params is empty or "undefined"', function () {
var rangeParams = 'prefv1=&prefn1=prefName&prefmin1=0&prefmax1=100';
var rangeResult = new QueryString(rangeParams);
var paramsOutput = rangeResult.toString(); // eslint-disable-line no-unused-vars
assert.equal(logSpy.args[0][0], 'We were passed a key "undefined in the preferences object in queryString.js');
});
it('creates a single key "x=y" when preferences is not an object', function () {
var rangeParams = 'prefv1=&prefn1=prefName&prefmin1=0&prefmax1=100';
var rangeResult = new QueryString(rangeParams);
rangeResult.preferences = 'a simple string';
var paramsOutput = rangeResult.toString();
assert.equal(paramsOutput, 'preferences=a%20simple%20string');
});
});
describe('handling special characters', function () {
it('should handle the \'+\' with a \'%20\' which leads to a \' \'', function () {
var params = '?trackOrderNumber=01&trackOrderPostal=EC1A+1BB';
var result = new QueryString(params);
assert.equal(result.trackOrderPostal, 'EC1A 1BB');
});
});
describe('handling url encoding of querystring', function () {
it('should handle encoding properly', function () {
var params = '?dwvar_P12345_Maat=37%2B&pid=P12345';
var result = new QueryString(params);
assert.equal(result.toString(), 'dwvar_P12345_Maat=37%2B&pid=P12345');
});
});
describe('handling duplicate parameters in querystring', function () {
it('should return an array', function () {
var params = '?one=uno&cheese=1&cheese=2&cheese=3&brand=sony&brand=samsung&cheese=4';
var result = new QueryString(params);
assert.deepEqual(result.one, 'uno');
assert.deepEqual(result.cheese, ['4', '3', '2', '1']);
assert.deepEqual(result.brand, ['samsung', 'sony']);
});
});
});