diff --git a/__tests__/spec/data-storage.js b/__tests__/spec/data-storage.js new file mode 100644 index 0000000000..e140e385f2 --- /dev/null +++ b/__tests__/spec/data-storage.js @@ -0,0 +1,76 @@ +/* eslint-env jest */ +const request = require('supertest') +const app = require('../../server.js') +const path = require('path') +const fs = require('fs') +const utils = require('../../lib/utils.js') + +jest.setTimeout(30000) + +function readFile (pathFromRoot) { + return fs.readFileSync(path.join(__dirname, '../../' + pathFromRoot), 'utf8') +} +/** + * + */ +describe('The data storage', () => { + // check session-data defaults file exists + + it.skip('file should exist', (done) => { + const sessionDataDefaultsFile = readFile('app/data/session-data-defaults.js') + + request(app) + .get(sessionDataDefaultsFile) + .expect('Content-Type', /application\/javascript; charset=UTF-8/) + // .expect(200) + .end(function (err, res) { + if (err) { + done(err) + } else { + done() + } + }) + }) + + describe('storeData function', () => { + it('should add input data into session data', async () => { + let initialSessionData = { + 'driver-name': 'Dr Emmett Brown' + } + + const inputData = { + 'vehicle-registration': 'OUTATIME' + } + + utils.storeData(inputData, initialSessionData) + + expect(initialSessionData).toEqual({ + 'driver-name': 'Dr Emmett Brown', + 'vehicle-registration': 'OUTATIME' + }) + }) + + it('should merge object into object', async () => { + let initialSessionData = { + vehicle: { + 'driver-name': 'Dr Emmett Brown' + } + } + + const inputData = { + vehicle: { + registration: 'OUTATIME' + } + } + + utils.storeData(inputData, initialSessionData) + + expect(initialSessionData).toEqual({ + vehicle: { + 'driver-name': 'Dr Emmett Brown', + registration: 'OUTATIME' + } + }) + }) + }) +}) diff --git a/app/data/session-data-defaults.js b/app/data/session-data-defaults.js index 9e4921b0ab..3b5158abb9 100644 --- a/app/data/session-data-defaults.js +++ b/app/data/session-data-defaults.js @@ -16,9 +16,47 @@ Example usage: ============================================================================ */ - module.exports = { - - // Insert values here - + // Example as used in current docs + claimant: { + field1: 'Example 1', + field2: 'Example 2', + field3: 'Example 3' + }, + partner: { + field1: 'Example 1', + field2: 'Example 2', + field3: 'Example 3' + }, + myObject: { + // Array of objects within object + myArrayOfObjects: [ + { + name: 'test1', + address: 'test2' + }, + { + name: 'test3' + } + ], + // Simple array within object + mySimpleArray: [ + 'test4', + 'test5' + ], + // Multi-level array within object + myMultiLevelArray: [ + [ + ['test6', 'test7'], + 'test8' + ] + ] + }, + // Arrays within array + myArray: [ + [ + 'test9', + ['test10', 'test11'] + ] + ] } diff --git a/docs/views/examples/pass-data/test1.html b/docs/views/examples/pass-data/test1.html new file mode 100644 index 0000000000..ac507c3399 --- /dev/null +++ b/docs/views/examples/pass-data/test1.html @@ -0,0 +1,47 @@ +{% extends "layout.html" %} + +{% block pageTitle %} + Example - Passing data +{% endblock %} + +{% block beforeContent %} + {% include "includes/breadcrumb_examples.html" %} +{% endblock %} + +{% block content %} + +
+
+ +
+ +
+

+ Example as used in current docs +

+ +

+ Array of objects within object +

+ +

+ Simple array within object +

+ +

+ Multi-level array within object +

+ +

+ Arrays within array +

+ +
+ + + +
+ +
+
+{% endblock %} diff --git a/docs/views/examples/pass-data/test2.html b/docs/views/examples/pass-data/test2.html new file mode 100644 index 0000000000..55b407b153 --- /dev/null +++ b/docs/views/examples/pass-data/test2.html @@ -0,0 +1,42 @@ +{% extends "layout.html" %} + +{% block pageTitle %} +Check your answers +{% endblock %} + +{% block content %} + +
+
+ +

Example as used in current docs

+ {{ data['claimant']['field1'] }} + {{ data['claimant']['field2'] }} +
+
+

Array of objects within object

+ {{ data['myObject']['myArrayOfObjects'][0]['name'] }} + {{ data['myObject']['myArrayOfObjects'][0]['address'] }} + {{ data['myObject']['myArrayOfObjects'][1]['name'] }} +
+
+

Simple array within object

+ {{ data['myObject']['mySimpleArray'][0] }} + {{ data['myObject']['mySimpleArray'][1] }} +
+
+

Multi-level array within object

+ {{ data['myObject']['myMultiLevelArray'][0][0][0] }} + {{ data['myObject']['myMultiLevelArray'][0][0][1] }} + {{ data['myObject']['myMultiLevelArray'][0][1] }} +
+
+

Arrays within array

+ {{ data['myArray'][0][0] }} + {{ data['myArray'][0][1][0] }} + {{ data['myArray'][0][1][1] }} +
+ +
+ +{% endblock %} diff --git a/lib/utils.js b/lib/utils.js index b3adf58100..ac76bd25a0 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -220,7 +220,10 @@ exports.matchMdRoutes = function (req, res) { } // Store data from POST body or GET query in session -var storeData = function (input, data) { +function storeData (input, data) { + // Value we store to indicate unchecked checkboxes. See `auto-store-data.js` + var uncheckedValue = '_unchecked' + for (var i in input) { // any input where the name starts with _ is ignored if (i.indexOf('_') === 0) { @@ -230,32 +233,32 @@ var storeData = function (input, data) { var val = input[i] // Delete values when users unselect checkboxes - if (val === '_unchecked' || val === ['_unchecked']) { + if (val === uncheckedValue || val === [uncheckedValue]) { delete data[i] continue } - // Remove _unchecked from arrays of checkboxes - if (Array.isArray(val)) { - var index = val.indexOf('_unchecked') - if (index !== -1) { - val.splice(index, 1) - } - } else if (typeof val === 'object') { - // Store nested objects that aren't arrays - if (typeof data[i] !== 'object') { - data[i] = {} - } + if (typeof val === 'object') { + // If array contains `uncheckedValue`, it's array of checkboxes + if (Array.isArray(val) && val.indexOf(uncheckedValue) !== -1) { + // Remove `uncheckedValue` from arrays of checkboxes + val.splice(val.indexOf(uncheckedValue), 1) + } else { // Store arrays that don't contain "_unchecked", and nested objects + if (typeof data[i] !== 'object') { + data[i] = {} + } - // Add nested values - storeData(val, data[i]) - continue + // Add nested values + storeData(val, data[i]) + continue + } } - data[i] = val } } +exports.storeData = storeData + // Get session default data from file let sessionDataDefaults = {}