@ukhomeoffice/cop-react-form-renderer 0.1.0-gamma → 1.0.0-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/CheckYourAnswers/Answer.test.js +94 -0
- package/dist/components/CheckYourAnswers/CheckYourAnswers.js +79 -27
- package/dist/components/CheckYourAnswers/CheckYourAnswers.scss +0 -7
- package/dist/components/CheckYourAnswers/CheckYourAnswers.stories.mdx +78 -1
- package/dist/components/CheckYourAnswers/CheckYourAnswers.test.js +332 -0
- package/dist/components/FormPage/FormPage.test.js +3 -1
- package/dist/components/FormRenderer/FormRenderer.js +75 -54
- package/dist/components/FormRenderer/FormRenderer.stories.mdx +35 -7
- package/dist/components/FormRenderer/FormRenderer.test.js +471 -0
- package/dist/components/FormRenderer/handlers/cyaAction.js +28 -0
- package/dist/components/FormRenderer/handlers/getPageId.js +28 -0
- package/dist/components/FormRenderer/handlers/getPageId.test.js +61 -0
- package/dist/components/FormRenderer/handlers/handlers.test.js +97 -0
- package/dist/components/FormRenderer/handlers/index.js +23 -0
- package/dist/components/FormRenderer/handlers/navigate.js +28 -0
- package/dist/components/FormRenderer/handlers/submissionError.js +20 -0
- package/dist/components/FormRenderer/helpers/canCYASubmit.js +42 -0
- package/dist/components/FormRenderer/helpers/canCYASubmit.test.js +155 -0
- package/dist/components/FormRenderer/helpers/getCYA.js +2 -2
- package/dist/components/FormRenderer/helpers/getCYA.test.js +5 -5
- package/dist/components/FormRenderer/helpers/getFormState.test.js +7 -7
- package/dist/components/FormRenderer/helpers/getNextPageId.js +65 -0
- package/dist/components/FormRenderer/helpers/getNextPageId.test.js +90 -0
- package/dist/components/FormRenderer/helpers/getPage.js +1 -1
- package/dist/components/FormRenderer/helpers/getPage.test.js +3 -3
- package/dist/components/FormRenderer/helpers/index.js +17 -13
- package/dist/components/PageActions/ActionButton.js +5 -9
- package/dist/components/PageActions/ActionButton.test.js +3 -1
- package/dist/components/PageActions/PageActions.test.js +4 -2
- package/dist/components/SummaryList/RowAction.js +1 -1
- package/dist/components/SummaryList/RowAction.test.js +8 -18
- package/dist/components/SummaryList/SummaryList.js +4 -4
- package/dist/components/SummaryList/SummaryList.scss +7 -0
- package/dist/components/SummaryList/SummaryList.stories.mdx +36 -0
- package/dist/components/SummaryList/SummaryList.test.js +197 -0
- package/dist/hooks/useHooks.js +12 -15
- package/dist/index.js +3 -1
- package/dist/index.test.js +18 -0
- package/dist/models/EventTypes.js +14 -0
- package/dist/models/FormPages.js +14 -0
- package/dist/models/PageAction.js +40 -0
- package/dist/models/index.js +24 -0
- package/dist/utils/CheckYourAnswers/getCYAAction.js +9 -0
- package/dist/utils/CheckYourAnswers/getCYARow.js +10 -0
- package/dist/utils/CheckYourAnswers/getCYARowsForPage.js +9 -0
- package/dist/utils/CheckYourAnswers/showComponentCYA.js +6 -5
- package/dist/utils/Component/getComponent.test.js +1 -1
- package/dist/utils/Format/formatData.js +32 -0
- package/dist/utils/Format/formatData.test.js +46 -0
- package/dist/utils/Format/formatDataForComponent.js +41 -0
- package/dist/utils/Format/formatDataForComponent.test.js +161 -0
- package/dist/utils/Format/formatDataForForm.js +33 -0
- package/dist/utils/Format/formatDataForForm.test.js +78 -0
- package/dist/utils/Format/formatDataForPage.js +37 -0
- package/dist/utils/Format/formatDataForPage.test.js +96 -0
- package/dist/utils/Format/index.js +26 -0
- package/dist/utils/Hub/getFormHub.js +14 -0
- package/dist/utils/Validate/validatePage.test.js +1 -1
- package/dist/utils/index.js +3 -0
- package/package.json +6 -3
- package/dist/components/FormRenderer/helpers.js +0 -66
- package/dist/components/FormRenderer/helpers.test.js +0 -158
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
4
|
+
|
|
5
|
+
var _react = require("@testing-library/react");
|
|
6
|
+
|
|
7
|
+
var _axios = _interopRequireDefault(require("axios"));
|
|
8
|
+
|
|
9
|
+
var _axiosMockAdapter = _interopRequireDefault(require("axios-mock-adapter"));
|
|
10
|
+
|
|
11
|
+
var _react2 = _interopRequireDefault(require("react"));
|
|
12
|
+
|
|
13
|
+
var _reactDom = require("react-dom");
|
|
14
|
+
|
|
15
|
+
var _testUtils = require("react-dom/test-utils");
|
|
16
|
+
|
|
17
|
+
var _models = require("../../models");
|
|
18
|
+
|
|
19
|
+
var _CheckYourAnswers = require("../CheckYourAnswers/CheckYourAnswers");
|
|
20
|
+
|
|
21
|
+
var _FormRenderer = _interopRequireWildcard(require("./FormRenderer"));
|
|
22
|
+
|
|
23
|
+
var _areYouACivilServant = _interopRequireDefault(require("../../json/areYouACivilServant.json"));
|
|
24
|
+
|
|
25
|
+
var _grade = _interopRequireDefault(require("../../json/grade.json"));
|
|
26
|
+
|
|
27
|
+
var _team = _interopRequireDefault(require("../../json/team.json"));
|
|
28
|
+
|
|
29
|
+
var _userProfileData = _interopRequireDefault(require("../../json/userProfile.data.json"));
|
|
30
|
+
|
|
31
|
+
var _userProfile = _interopRequireDefault(require("../../json/userProfile.json"));
|
|
32
|
+
|
|
33
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
34
|
+
|
|
35
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
36
|
+
|
|
37
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
38
|
+
|
|
39
|
+
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
40
|
+
|
|
41
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
42
|
+
|
|
43
|
+
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
44
|
+
|
|
45
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
46
|
+
|
|
47
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
48
|
+
|
|
49
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
50
|
+
|
|
51
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
52
|
+
|
|
53
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
54
|
+
|
|
55
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
56
|
+
|
|
57
|
+
describe('components', function () {
|
|
58
|
+
describe('FormRenderer', function () {
|
|
59
|
+
var mockAxios = new _axiosMockAdapter.default(_axios.default);
|
|
60
|
+
var container = null;
|
|
61
|
+
|
|
62
|
+
var refDataUrl = function refDataUrl(suffix) {
|
|
63
|
+
return "".concat(_userProfileData.default.environmentContext.referenceDataUrl, "/").concat(suffix);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
beforeEach(function () {
|
|
67
|
+
container = document.createElement('div');
|
|
68
|
+
document.body.appendChild(container);
|
|
69
|
+
mockAxios.reset();
|
|
70
|
+
mockAxios.onGet(refDataUrl('v2/entities/areYouACivilServant')).reply(200, _areYouACivilServant.default);
|
|
71
|
+
mockAxios.onGet(refDataUrl('v2/entities/grade')).reply(200, _grade.default);
|
|
72
|
+
mockAxios.onGet(refDataUrl('v1/entities/team')).reply(200, _team.default);
|
|
73
|
+
});
|
|
74
|
+
afterEach(function () {
|
|
75
|
+
(0, _reactDom.unmountComponentAtNode)(container);
|
|
76
|
+
container.remove();
|
|
77
|
+
container = null;
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
var checkForm = function checkForm(container) {
|
|
81
|
+
var form = container.childNodes[0];
|
|
82
|
+
expect(form.tagName).toEqual('DIV');
|
|
83
|
+
expect(form.classList).toContain(_FormRenderer.DEFAULT_CLASS);
|
|
84
|
+
return form;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
var getChangeLink = function getChangeLink(summaryList) {
|
|
88
|
+
var _summaryList$childNod = _slicedToArray(summaryList.childNodes[0].childNodes, 3),
|
|
89
|
+
actions = _summaryList$childNod[2];
|
|
90
|
+
|
|
91
|
+
return actions.childNodes[0];
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
var getContinueButton = function getContinueButton(page) {
|
|
95
|
+
return page.childNodes[page.childNodes.length - 1].childNodes[0].childNodes[0];
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
it('should start on the hub page correctly and display the title', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
|
|
99
|
+
var form, title, hub;
|
|
100
|
+
return regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
101
|
+
while (1) {
|
|
102
|
+
switch (_context2.prev = _context2.next) {
|
|
103
|
+
case 0:
|
|
104
|
+
_context2.next = 2;
|
|
105
|
+
return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
|
|
106
|
+
return regeneratorRuntime.wrap(function _callee$(_context) {
|
|
107
|
+
while (1) {
|
|
108
|
+
switch (_context.prev = _context.next) {
|
|
109
|
+
case 0:
|
|
110
|
+
(0, _reactDom.render)( /*#__PURE__*/_react2.default.createElement(_FormRenderer.default, _extends({}, _userProfile.default, {
|
|
111
|
+
data: _userProfileData.default
|
|
112
|
+
})), container);
|
|
113
|
+
|
|
114
|
+
case 1:
|
|
115
|
+
case "end":
|
|
116
|
+
return _context.stop();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}, _callee);
|
|
120
|
+
})));
|
|
121
|
+
|
|
122
|
+
case 2:
|
|
123
|
+
form = checkForm(container);
|
|
124
|
+
expect(form.childNodes.length).toEqual(2); // Title + Hub page (= CYA)
|
|
125
|
+
|
|
126
|
+
title = form.childNodes[0];
|
|
127
|
+
expect(title.tagName).toEqual('H1');
|
|
128
|
+
expect(title.textContent).toEqual(_userProfile.default.title);
|
|
129
|
+
hub = form.childNodes[1];
|
|
130
|
+
expect(hub.tagName).toEqual('DIV');
|
|
131
|
+
expect(hub.classList).toContain(_CheckYourAnswers.DEFAULT_CLASS);
|
|
132
|
+
|
|
133
|
+
case 10:
|
|
134
|
+
case "end":
|
|
135
|
+
return _context2.stop();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}, _callee2);
|
|
139
|
+
})));
|
|
140
|
+
it('should fire the onFormLoad method passed in the hooks', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {
|
|
141
|
+
var onFormLoadCalled, ON_FORM_LOAD, HOOKS;
|
|
142
|
+
return regeneratorRuntime.wrap(function _callee4$(_context4) {
|
|
143
|
+
while (1) {
|
|
144
|
+
switch (_context4.prev = _context4.next) {
|
|
145
|
+
case 0:
|
|
146
|
+
onFormLoadCalled = false;
|
|
147
|
+
|
|
148
|
+
ON_FORM_LOAD = function ON_FORM_LOAD() {
|
|
149
|
+
onFormLoadCalled = true;
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
HOOKS = {
|
|
153
|
+
onFormLoad: ON_FORM_LOAD
|
|
154
|
+
};
|
|
155
|
+
_context4.next = 5;
|
|
156
|
+
return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
|
|
157
|
+
return regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
158
|
+
while (1) {
|
|
159
|
+
switch (_context3.prev = _context3.next) {
|
|
160
|
+
case 0:
|
|
161
|
+
(0, _reactDom.render)( /*#__PURE__*/_react2.default.createElement(_FormRenderer.default, _extends({}, _userProfile.default, {
|
|
162
|
+
data: _userProfileData.default,
|
|
163
|
+
hooks: HOOKS
|
|
164
|
+
})), container);
|
|
165
|
+
|
|
166
|
+
case 1:
|
|
167
|
+
case "end":
|
|
168
|
+
return _context3.stop();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}, _callee3);
|
|
172
|
+
})));
|
|
173
|
+
|
|
174
|
+
case 5:
|
|
175
|
+
expect(onFormLoadCalled).toBeTruthy();
|
|
176
|
+
|
|
177
|
+
case 6:
|
|
178
|
+
case "end":
|
|
179
|
+
return _context4.stop();
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}, _callee4);
|
|
183
|
+
})));
|
|
184
|
+
it('should navigate to the first editable page', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {
|
|
185
|
+
var ON_PAGE_CHANGE_CALLS, ON_PAGE_CHANGE, HOOKS, form, hub, _hub$childNodes, civilServantList, link, page, pageHeading;
|
|
186
|
+
|
|
187
|
+
return regeneratorRuntime.wrap(function _callee6$(_context6) {
|
|
188
|
+
while (1) {
|
|
189
|
+
switch (_context6.prev = _context6.next) {
|
|
190
|
+
case 0:
|
|
191
|
+
ON_PAGE_CHANGE_CALLS = [];
|
|
192
|
+
|
|
193
|
+
ON_PAGE_CHANGE = function ON_PAGE_CHANGE(pageId) {
|
|
194
|
+
ON_PAGE_CHANGE_CALLS.push(pageId);
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
HOOKS = {
|
|
198
|
+
onPageChange: ON_PAGE_CHANGE
|
|
199
|
+
};
|
|
200
|
+
_context6.next = 5;
|
|
201
|
+
return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {
|
|
202
|
+
return regeneratorRuntime.wrap(function _callee5$(_context5) {
|
|
203
|
+
while (1) {
|
|
204
|
+
switch (_context5.prev = _context5.next) {
|
|
205
|
+
case 0:
|
|
206
|
+
(0, _reactDom.render)( /*#__PURE__*/_react2.default.createElement(_FormRenderer.default, _extends({}, _userProfile.default, {
|
|
207
|
+
data: _userProfileData.default,
|
|
208
|
+
hooks: HOOKS
|
|
209
|
+
})), container);
|
|
210
|
+
|
|
211
|
+
case 1:
|
|
212
|
+
case "end":
|
|
213
|
+
return _context5.stop();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}, _callee5);
|
|
217
|
+
})));
|
|
218
|
+
|
|
219
|
+
case 5:
|
|
220
|
+
form = checkForm(container);
|
|
221
|
+
hub = form.childNodes[1]; // Hub = CYA
|
|
222
|
+
|
|
223
|
+
_hub$childNodes = _slicedToArray(hub.childNodes, 3), civilServantList = _hub$childNodes[2];
|
|
224
|
+
link = getChangeLink(civilServantList);
|
|
225
|
+
expect(ON_PAGE_CHANGE_CALLS.length).toEqual(0);
|
|
226
|
+
|
|
227
|
+
_react.fireEvent.click(link, {});
|
|
228
|
+
|
|
229
|
+
expect(ON_PAGE_CHANGE_CALLS.length).toEqual(1);
|
|
230
|
+
expect(ON_PAGE_CHANGE_CALLS[0]).toEqual(_userProfile.default.pages[1].id); // The form layout should have changed to the current page.
|
|
231
|
+
|
|
232
|
+
expect(form.childNodes.length).toEqual(1); // Just the page.
|
|
233
|
+
|
|
234
|
+
page = form.childNodes[0];
|
|
235
|
+
pageHeading = page.childNodes[0];
|
|
236
|
+
expect(pageHeading.tagName).toEqual('H1');
|
|
237
|
+
expect(pageHeading.textContent).toEqual(_userProfile.default.pages[1].title);
|
|
238
|
+
|
|
239
|
+
case 18:
|
|
240
|
+
case "end":
|
|
241
|
+
return _context6.stop();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}, _callee6);
|
|
245
|
+
})));
|
|
246
|
+
it('should handle a page submission', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee8() {
|
|
247
|
+
var ON_SUBMIT_CALLS, ON_SUBMIT, HOOKS, form, hub, _hub$childNodes2, civilServantList, link, page, continueButton, title;
|
|
248
|
+
|
|
249
|
+
return regeneratorRuntime.wrap(function _callee8$(_context8) {
|
|
250
|
+
while (1) {
|
|
251
|
+
switch (_context8.prev = _context8.next) {
|
|
252
|
+
case 0:
|
|
253
|
+
ON_SUBMIT_CALLS = [];
|
|
254
|
+
|
|
255
|
+
ON_SUBMIT = function ON_SUBMIT(type, payload, onSuccess, onError) {
|
|
256
|
+
ON_SUBMIT_CALLS.push({
|
|
257
|
+
type: type,
|
|
258
|
+
payload: payload,
|
|
259
|
+
onSuccess: onSuccess,
|
|
260
|
+
onError: onError
|
|
261
|
+
});
|
|
262
|
+
onSuccess();
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
HOOKS = {
|
|
266
|
+
onSubmit: ON_SUBMIT
|
|
267
|
+
};
|
|
268
|
+
_context8.next = 5;
|
|
269
|
+
return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee7() {
|
|
270
|
+
return regeneratorRuntime.wrap(function _callee7$(_context7) {
|
|
271
|
+
while (1) {
|
|
272
|
+
switch (_context7.prev = _context7.next) {
|
|
273
|
+
case 0:
|
|
274
|
+
(0, _reactDom.render)( /*#__PURE__*/_react2.default.createElement(_FormRenderer.default, _extends({}, _userProfile.default, {
|
|
275
|
+
data: _userProfileData.default,
|
|
276
|
+
hooks: HOOKS
|
|
277
|
+
})), container);
|
|
278
|
+
|
|
279
|
+
case 1:
|
|
280
|
+
case "end":
|
|
281
|
+
return _context7.stop();
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}, _callee7);
|
|
285
|
+
})));
|
|
286
|
+
|
|
287
|
+
case 5:
|
|
288
|
+
form = checkForm(container); // Navigate to the "Are you a civil servant?" page.
|
|
289
|
+
|
|
290
|
+
hub = form.childNodes[1]; // Hub = CYA
|
|
291
|
+
|
|
292
|
+
_hub$childNodes2 = _slicedToArray(hub.childNodes, 3), civilServantList = _hub$childNodes2[2];
|
|
293
|
+
link = getChangeLink(civilServantList);
|
|
294
|
+
|
|
295
|
+
_react.fireEvent.click(link, {}); // Should already be answered "Yes", so simply click "Continue".
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
page = form.childNodes[0];
|
|
299
|
+
continueButton = getContinueButton(page);
|
|
300
|
+
expect(ON_SUBMIT_CALLS.length).toEqual(0);
|
|
301
|
+
|
|
302
|
+
_react.fireEvent.click(continueButton, {});
|
|
303
|
+
|
|
304
|
+
expect(ON_SUBMIT_CALLS.length).toEqual(1);
|
|
305
|
+
expect(ON_SUBMIT_CALLS[0].type).toEqual(_models.PageAction.TYPES.SUBMIT);
|
|
306
|
+
expect(ON_SUBMIT_CALLS[0].payload.areYouACivilServant).toEqual('yes'); // And we should be back on the hub.
|
|
307
|
+
|
|
308
|
+
expect(form.childNodes.length).toEqual(2); // Title + Hub page (= CYA)
|
|
309
|
+
|
|
310
|
+
title = form.childNodes[0];
|
|
311
|
+
expect(title.tagName).toEqual('H1');
|
|
312
|
+
expect(title.textContent).toEqual(_userProfile.default.title);
|
|
313
|
+
|
|
314
|
+
case 21:
|
|
315
|
+
case "end":
|
|
316
|
+
return _context8.stop();
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}, _callee8);
|
|
320
|
+
})));
|
|
321
|
+
it('should handle a page submission error', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee10() {
|
|
322
|
+
var ON_SUBMIT_CALLS, ON_SUBMIT, HOOKS, form, hub, _hub$childNodes3, civilServantList, link, page, continueButton, pageHeading;
|
|
323
|
+
|
|
324
|
+
return regeneratorRuntime.wrap(function _callee10$(_context10) {
|
|
325
|
+
while (1) {
|
|
326
|
+
switch (_context10.prev = _context10.next) {
|
|
327
|
+
case 0:
|
|
328
|
+
ON_SUBMIT_CALLS = [];
|
|
329
|
+
|
|
330
|
+
ON_SUBMIT = function ON_SUBMIT(type, payload, onSuccess, onError) {
|
|
331
|
+
ON_SUBMIT_CALLS.push({
|
|
332
|
+
type: type,
|
|
333
|
+
payload: payload,
|
|
334
|
+
onSuccess: onSuccess,
|
|
335
|
+
onError: onError
|
|
336
|
+
});
|
|
337
|
+
onError([{
|
|
338
|
+
id: 'unknown',
|
|
339
|
+
error: 'Something went wrong'
|
|
340
|
+
}]);
|
|
341
|
+
};
|
|
342
|
+
|
|
343
|
+
HOOKS = {
|
|
344
|
+
onSubmit: ON_SUBMIT
|
|
345
|
+
};
|
|
346
|
+
_context10.next = 5;
|
|
347
|
+
return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee9() {
|
|
348
|
+
return regeneratorRuntime.wrap(function _callee9$(_context9) {
|
|
349
|
+
while (1) {
|
|
350
|
+
switch (_context9.prev = _context9.next) {
|
|
351
|
+
case 0:
|
|
352
|
+
(0, _reactDom.render)( /*#__PURE__*/_react2.default.createElement(_FormRenderer.default, _extends({}, _userProfile.default, {
|
|
353
|
+
data: _userProfileData.default,
|
|
354
|
+
hooks: HOOKS
|
|
355
|
+
})), container);
|
|
356
|
+
|
|
357
|
+
case 1:
|
|
358
|
+
case "end":
|
|
359
|
+
return _context9.stop();
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}, _callee9);
|
|
363
|
+
})));
|
|
364
|
+
|
|
365
|
+
case 5:
|
|
366
|
+
form = checkForm(container); // Navigate to the "Are you a civil servant?" page.
|
|
367
|
+
|
|
368
|
+
hub = form.childNodes[1]; // Hub = CYA
|
|
369
|
+
|
|
370
|
+
_hub$childNodes3 = _slicedToArray(hub.childNodes, 3), civilServantList = _hub$childNodes3[2];
|
|
371
|
+
link = getChangeLink(civilServantList);
|
|
372
|
+
|
|
373
|
+
_react.fireEvent.click(link, {}); // Should already be answered "Yes", so simply click "Continue".
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
page = form.childNodes[0];
|
|
377
|
+
continueButton = getContinueButton(page);
|
|
378
|
+
expect(ON_SUBMIT_CALLS.length).toEqual(0);
|
|
379
|
+
|
|
380
|
+
_react.fireEvent.click(continueButton, {});
|
|
381
|
+
|
|
382
|
+
expect(ON_SUBMIT_CALLS.length).toEqual(1);
|
|
383
|
+
expect(ON_SUBMIT_CALLS[0].type).toEqual(_models.PageAction.TYPES.SUBMIT);
|
|
384
|
+
expect(ON_SUBMIT_CALLS[0].payload.areYouACivilServant).toEqual('yes'); // And we should be kept on the same page.
|
|
385
|
+
|
|
386
|
+
expect(form.childNodes.length).toEqual(1); // Just the page.
|
|
387
|
+
|
|
388
|
+
pageHeading = form.childNodes[0].childNodes[0];
|
|
389
|
+
expect(pageHeading.tagName).toEqual('H1');
|
|
390
|
+
expect(pageHeading.textContent).toEqual(_userProfile.default.pages[1].title);
|
|
391
|
+
|
|
392
|
+
case 21:
|
|
393
|
+
case "end":
|
|
394
|
+
return _context10.stop();
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}, _callee10);
|
|
398
|
+
})));
|
|
399
|
+
it('should handle page navigation', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee12() {
|
|
400
|
+
var ON_PAGE_CHANGE_CALLS, ON_PAGE_CHANGE, HOOKS, form, hub, _hub$childNodes4, lineManagerList, link, page, pageHeading, continueButton, newPageHeading;
|
|
401
|
+
|
|
402
|
+
return regeneratorRuntime.wrap(function _callee12$(_context12) {
|
|
403
|
+
while (1) {
|
|
404
|
+
switch (_context12.prev = _context12.next) {
|
|
405
|
+
case 0:
|
|
406
|
+
ON_PAGE_CHANGE_CALLS = [];
|
|
407
|
+
|
|
408
|
+
ON_PAGE_CHANGE = function ON_PAGE_CHANGE(pageId) {
|
|
409
|
+
ON_PAGE_CHANGE_CALLS.push(pageId);
|
|
410
|
+
};
|
|
411
|
+
|
|
412
|
+
HOOKS = {
|
|
413
|
+
onPageChange: ON_PAGE_CHANGE
|
|
414
|
+
};
|
|
415
|
+
_context12.next = 5;
|
|
416
|
+
return (0, _testUtils.act)( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee11() {
|
|
417
|
+
return regeneratorRuntime.wrap(function _callee11$(_context11) {
|
|
418
|
+
while (1) {
|
|
419
|
+
switch (_context11.prev = _context11.next) {
|
|
420
|
+
case 0:
|
|
421
|
+
(0, _reactDom.render)( /*#__PURE__*/_react2.default.createElement(_FormRenderer.default, _extends({}, _userProfile.default, {
|
|
422
|
+
data: _userProfileData.default,
|
|
423
|
+
hooks: HOOKS
|
|
424
|
+
})), container);
|
|
425
|
+
|
|
426
|
+
case 1:
|
|
427
|
+
case "end":
|
|
428
|
+
return _context11.stop();
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}, _callee11);
|
|
432
|
+
})));
|
|
433
|
+
|
|
434
|
+
case 5:
|
|
435
|
+
form = checkForm(container); // Navigate to the "Add or change a line manager" page.
|
|
436
|
+
|
|
437
|
+
hub = form.childNodes[1]; // Hub = CYA
|
|
438
|
+
|
|
439
|
+
_hub$childNodes4 = _slicedToArray(hub.childNodes, 6), lineManagerList = _hub$childNodes4[5];
|
|
440
|
+
link = getChangeLink(lineManagerList);
|
|
441
|
+
expect(ON_PAGE_CHANGE_CALLS.length).toEqual(0);
|
|
442
|
+
|
|
443
|
+
_react.fireEvent.click(link, {});
|
|
444
|
+
|
|
445
|
+
expect(ON_PAGE_CHANGE_CALLS[0]).toEqual(_userProfile.default.pages[4].id); // Should be on the page explaining what changing the line manager means.
|
|
446
|
+
|
|
447
|
+
page = form.childNodes[0];
|
|
448
|
+
pageHeading = page.childNodes[0];
|
|
449
|
+
expect(pageHeading.tagName).toEqual('H1');
|
|
450
|
+
expect(pageHeading.textContent).toEqual(_userProfile.default.pages[4].title); // Now click on the "Continue" button on here.
|
|
451
|
+
|
|
452
|
+
continueButton = getContinueButton(page);
|
|
453
|
+
expect(ON_PAGE_CHANGE_CALLS.length).toEqual(1);
|
|
454
|
+
|
|
455
|
+
_react.fireEvent.click(continueButton, {});
|
|
456
|
+
|
|
457
|
+
expect(ON_PAGE_CHANGE_CALLS.length).toEqual(2);
|
|
458
|
+
expect(ON_PAGE_CHANGE_CALLS[1]).toEqual(_userProfile.default.pages[5].id);
|
|
459
|
+
newPageHeading = form.childNodes[0].childNodes[0];
|
|
460
|
+
expect(newPageHeading.tagName).toEqual('H1');
|
|
461
|
+
expect(newPageHeading.textContent).toEqual(_userProfile.default.pages[5].title);
|
|
462
|
+
|
|
463
|
+
case 24:
|
|
464
|
+
case "end":
|
|
465
|
+
return _context12.stop();
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
}, _callee12);
|
|
469
|
+
})));
|
|
470
|
+
});
|
|
471
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _getPageId = _interopRequireDefault(require("./getPageId"));
|
|
9
|
+
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Gets the pageId from the invoked CYA action and calls onChange if it is
|
|
14
|
+
* different to the currentPageId.
|
|
15
|
+
* @param {object} page The page on which the CYA action was invoked.
|
|
16
|
+
* @param {string} currentPageId The current pageId.
|
|
17
|
+
* @param {Function} onChange The handler to call if the pageId is different to the currentPageId.
|
|
18
|
+
*/
|
|
19
|
+
var cyaAction = function cyaAction(page, currentPageId, onChange) {
|
|
20
|
+
var pageId = (0, _getPageId.default)(page.action, page.pageId);
|
|
21
|
+
|
|
22
|
+
if (pageId !== currentPageId) {
|
|
23
|
+
onChange(pageId);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
var _default = cyaAction;
|
|
28
|
+
exports.default = _default;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Gets the pageId from the invoked CYA action.
|
|
10
|
+
* @param {object} action The invoked action.
|
|
11
|
+
* @param {string} pageId The id of the page on which the action was invoked.
|
|
12
|
+
* @returns A page id.
|
|
13
|
+
*/
|
|
14
|
+
var getPageId = function getPageId(action, pageId) {
|
|
15
|
+
if (action) {
|
|
16
|
+
// TODO: Improve how this is handled.
|
|
17
|
+
if (action.href) {
|
|
18
|
+
return action.href.split('/').pop();
|
|
19
|
+
} else if (action.url) {
|
|
20
|
+
return action.url.split('/').pop();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return pageId;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
var _default = getPageId;
|
|
28
|
+
exports.default = _default;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _getPageId = _interopRequireDefault(require("./getPageId"));
|
|
4
|
+
|
|
5
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
6
|
+
|
|
7
|
+
// Local imports
|
|
8
|
+
describe('components', function () {
|
|
9
|
+
describe('FormRenderer', function () {
|
|
10
|
+
describe('handlers', function () {
|
|
11
|
+
describe('getPageId', function () {
|
|
12
|
+
it('should return the pageId when the action is null', function () {
|
|
13
|
+
var PAGE_ID = 'alpha';
|
|
14
|
+
var ACTION = null;
|
|
15
|
+
expect((0, _getPageId.default)(ACTION, PAGE_ID)).toEqual(PAGE_ID);
|
|
16
|
+
});
|
|
17
|
+
it('should return the pageId when the action contains no href or url', function () {
|
|
18
|
+
var PAGE_ID = 'alpha';
|
|
19
|
+
var ACTION = {
|
|
20
|
+
id: 'bravo'
|
|
21
|
+
};
|
|
22
|
+
expect((0, _getPageId.default)(ACTION, PAGE_ID)).toEqual(PAGE_ID);
|
|
23
|
+
});
|
|
24
|
+
it('should return the final part of the href when provided', function () {
|
|
25
|
+
var LAST_PART = 'delta';
|
|
26
|
+
var HREF = "/bravo/charlie/".concat(LAST_PART);
|
|
27
|
+
var PAGE_ID = 'alpha';
|
|
28
|
+
var ACTION = {
|
|
29
|
+
href: HREF
|
|
30
|
+
};
|
|
31
|
+
expect((0, _getPageId.default)(ACTION, PAGE_ID)).toEqual(LAST_PART);
|
|
32
|
+
});
|
|
33
|
+
it('should return the final part of the url when provided', function () {
|
|
34
|
+
var LAST_PART = 'delta';
|
|
35
|
+
var URL = "/bravo/charlie/".concat(LAST_PART);
|
|
36
|
+
var PAGE_ID = 'alpha';
|
|
37
|
+
var ACTION = {
|
|
38
|
+
url: URL
|
|
39
|
+
};
|
|
40
|
+
expect((0, _getPageId.default)(ACTION, PAGE_ID)).toEqual(LAST_PART);
|
|
41
|
+
});
|
|
42
|
+
it('should return the whole href when it contains no backslashes', function () {
|
|
43
|
+
var HREF = 'delta';
|
|
44
|
+
var PAGE_ID = 'alpha';
|
|
45
|
+
var ACTION = {
|
|
46
|
+
href: HREF
|
|
47
|
+
};
|
|
48
|
+
expect((0, _getPageId.default)(ACTION, PAGE_ID)).toEqual(HREF);
|
|
49
|
+
});
|
|
50
|
+
it('should return the whole url when it contains no backslashes', function () {
|
|
51
|
+
var URL = 'delta';
|
|
52
|
+
var PAGE_ID = 'alpha';
|
|
53
|
+
var ACTION = {
|
|
54
|
+
url: URL
|
|
55
|
+
};
|
|
56
|
+
expect((0, _getPageId.default)(ACTION, PAGE_ID)).toEqual(URL);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
});
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _ = _interopRequireDefault(require("."));
|
|
4
|
+
|
|
5
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
6
|
+
|
|
7
|
+
// Local imports
|
|
8
|
+
describe('components', function () {
|
|
9
|
+
describe('FormRenderer', function () {
|
|
10
|
+
describe('handlers', function () {
|
|
11
|
+
describe('cyaAction', function () {
|
|
12
|
+
it('should not call the onChange method when the page is unchanged', function () {
|
|
13
|
+
var CURRENT_PAGE_ID = 'alpha';
|
|
14
|
+
var PAGE = {
|
|
15
|
+
pageId: CURRENT_PAGE_ID
|
|
16
|
+
};
|
|
17
|
+
var ON_CHANGE_CALLS = [];
|
|
18
|
+
|
|
19
|
+
var ON_CHANGE = function ON_CHANGE(pageId) {
|
|
20
|
+
ON_CHANGE_CALLS.push(pageId);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
_.default.cyaAction(PAGE, CURRENT_PAGE_ID, ON_CHANGE);
|
|
24
|
+
|
|
25
|
+
expect(ON_CHANGE_CALLS.length).toEqual(0);
|
|
26
|
+
});
|
|
27
|
+
it('should call the onChange method when the page has changed', function () {
|
|
28
|
+
var CURRENT_PAGE_ID = 'alpha';
|
|
29
|
+
var NEW_PAGE_ID = 'bravo';
|
|
30
|
+
var PAGE = {
|
|
31
|
+
pageId: NEW_PAGE_ID
|
|
32
|
+
};
|
|
33
|
+
var ON_CHANGE_CALLS = [];
|
|
34
|
+
|
|
35
|
+
var ON_CHANGE = function ON_CHANGE(pageId) {
|
|
36
|
+
ON_CHANGE_CALLS.push(pageId);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
_.default.cyaAction(PAGE, CURRENT_PAGE_ID, ON_CHANGE);
|
|
40
|
+
|
|
41
|
+
expect(ON_CHANGE_CALLS.length).toEqual(1);
|
|
42
|
+
expect(ON_CHANGE_CALLS[0]).toEqual(NEW_PAGE_ID);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe('navigate', function () {
|
|
46
|
+
it('should not call the onNavigate method when the page is unchanged', function () {
|
|
47
|
+
var CURRENT_PAGE_ID = 'alpha';
|
|
48
|
+
var ACTION = {
|
|
49
|
+
href: "/".concat(CURRENT_PAGE_ID)
|
|
50
|
+
};
|
|
51
|
+
var ON_NAVIGATE_CALLS = [];
|
|
52
|
+
|
|
53
|
+
var ON_NAVIGATE = function ON_NAVIGATE(pageId) {
|
|
54
|
+
ON_NAVIGATE_CALLS.push(pageId);
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
_.default.navigate(ACTION, CURRENT_PAGE_ID, ON_NAVIGATE);
|
|
58
|
+
|
|
59
|
+
expect(ON_NAVIGATE_CALLS.length).toEqual(0);
|
|
60
|
+
});
|
|
61
|
+
it('should call the onNavigate method when the page has changed', function () {
|
|
62
|
+
var CURRENT_PAGE_ID = 'alpha';
|
|
63
|
+
var NEW_PAGE_ID = 'bravo';
|
|
64
|
+
var ACTION = {
|
|
65
|
+
href: "/".concat(NEW_PAGE_ID)
|
|
66
|
+
};
|
|
67
|
+
var ON_NAVIGATE_CALLS = [];
|
|
68
|
+
|
|
69
|
+
var ON_NAVIGATE = function ON_NAVIGATE(pageId) {
|
|
70
|
+
ON_NAVIGATE_CALLS.push(pageId);
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
_.default.navigate(ACTION, CURRENT_PAGE_ID, ON_NAVIGATE);
|
|
74
|
+
|
|
75
|
+
expect(ON_NAVIGATE_CALLS.length).toEqual(1);
|
|
76
|
+
expect(ON_NAVIGATE_CALLS[0]).toEqual(NEW_PAGE_ID);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe('submissionError', function () {
|
|
80
|
+
it('should call the onError method with the same errors', function () {
|
|
81
|
+
var ON_ERROR_CALLS = [];
|
|
82
|
+
|
|
83
|
+
var ON_ERROR = function ON_ERROR(errors) {
|
|
84
|
+
ON_ERROR_CALLS.push(errors);
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
var ERRORS = ['alpha', 'bravo', 'charlie'];
|
|
88
|
+
|
|
89
|
+
_.default.submissionError(ERRORS, ON_ERROR);
|
|
90
|
+
|
|
91
|
+
expect(ON_ERROR_CALLS.length).toEqual(1);
|
|
92
|
+
expect(ON_ERROR_CALLS[0]).toEqual(ERRORS);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
});
|