@pie-element/placement-ordering 14.3.1 → 14.3.2-beta.3

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.
@@ -0,0 +1,283 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _react = _interopRequireDefault(require("react"));
5
+ var _react2 = require("@testing-library/react");
6
+ require("@testing-library/jest-dom");
7
+ var _choiceTile = require("../choice-tile");
8
+ // Mock dependencies
9
+ jest.mock('@dnd-kit/core', () => ({
10
+ useDraggable: () => ({
11
+ attributes: {
12
+ 'data-draggable': 'true'
13
+ },
14
+ listeners: {
15
+ onPointerDown: jest.fn()
16
+ },
17
+ setNodeRef: jest.fn(),
18
+ transform: null,
19
+ isDragging: false
20
+ }),
21
+ useDroppable: () => ({
22
+ setNodeRef: jest.fn(),
23
+ isOver: false
24
+ })
25
+ }));
26
+ jest.mock('@pie-lib/editable-html-tip-tap', () => ({
27
+ __esModule: true,
28
+ default: ({
29
+ markup,
30
+ onChange,
31
+ disabled,
32
+ placeholder,
33
+ error
34
+ }) => /*#__PURE__*/_react.default.createElement("div", {
35
+ "data-testid": "editable-html"
36
+ }, /*#__PURE__*/_react.default.createElement("input", {
37
+ "data-testid": "editable-input",
38
+ value: markup,
39
+ onChange: e => onChange(e.target.value),
40
+ disabled: disabled,
41
+ placeholder: placeholder
42
+ }), error && /*#__PURE__*/_react.default.createElement("div", {
43
+ "data-testid": "editable-error"
44
+ }, error)),
45
+ DEFAULT_PLUGINS: ['bold', 'italic', 'underline', 'bulleted-list', 'numbered-list']
46
+ }));
47
+ jest.mock('@pie-lib/render-ui', () => ({
48
+ color: {
49
+ tertiary: () => '#666666'
50
+ }
51
+ }));
52
+ describe('ChoiceTile', () => {
53
+ let defaultProps;
54
+ beforeEach(() => {
55
+ defaultProps = {
56
+ choice: {
57
+ id: 'c1',
58
+ label: 'Test choice',
59
+ editable: true,
60
+ type: 'choice'
61
+ },
62
+ index: 0,
63
+ choices: [],
64
+ onChoiceChange: jest.fn(),
65
+ onDelete: jest.fn(),
66
+ imageSupport: {
67
+ add: jest.fn(),
68
+ delete: jest.fn()
69
+ },
70
+ spellCheck: true,
71
+ toolbarOpts: {},
72
+ pluginProps: {},
73
+ maxImageWidth: {
74
+ unit: 'px',
75
+ value: 300
76
+ },
77
+ maxImageHeight: {
78
+ unit: 'px',
79
+ value: 300
80
+ },
81
+ error: null,
82
+ mathMlOptions: {}
83
+ };
84
+ });
85
+ describe('rendering', () => {
86
+ it('should render without crashing', () => {
87
+ const {
88
+ container
89
+ } = (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, defaultProps));
90
+ expect(container).toBeTruthy();
91
+ });
92
+ it('should render with correct label', () => {
93
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, defaultProps));
94
+ const input = _react2.screen.getByTestId('editable-input');
95
+ expect(input).toHaveValue('Test choice');
96
+ });
97
+ it('should render drag handle', () => {
98
+ const {
99
+ container
100
+ } = (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, defaultProps));
101
+ const dragHandle = container.querySelector('[data-testid="DragHandleIcon"]');
102
+ expect(container.querySelector('[data-draggable="true"]')).toBeInTheDocument();
103
+ });
104
+ it('should render delete button when editable', () => {
105
+ const {
106
+ container
107
+ } = (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, defaultProps));
108
+ const deleteButton = container.querySelector('button');
109
+ expect(deleteButton).toBeInTheDocument();
110
+ });
111
+ it('should not render delete button when not editable', () => {
112
+ const props = {
113
+ ...defaultProps,
114
+ choice: {
115
+ ...defaultProps.choice,
116
+ editable: false
117
+ }
118
+ };
119
+ const {
120
+ container
121
+ } = (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, props));
122
+ const buttons = container.querySelectorAll('button');
123
+ // No delete button when not editable
124
+ expect(buttons.length).toBe(0);
125
+ });
126
+ it('should show placeholder for empty choice', () => {
127
+ const props = {
128
+ ...defaultProps,
129
+ choice: {
130
+ ...defaultProps.choice,
131
+ label: ''
132
+ }
133
+ };
134
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, props));
135
+ const input = _react2.screen.getByTestId('editable-input');
136
+ expect(input).toHaveAttribute('placeholder', 'Enter a choice');
137
+ });
138
+ it('should not show placeholder for target type', () => {
139
+ const props = {
140
+ ...defaultProps,
141
+ choice: {
142
+ ...defaultProps.choice,
143
+ type: 'target',
144
+ label: ''
145
+ }
146
+ };
147
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, props));
148
+ const input = _react2.screen.getByTestId('editable-input');
149
+ expect(input).toHaveAttribute('placeholder', '');
150
+ });
151
+ it('should not show placeholder for LaTeX content', () => {
152
+ const props = {
153
+ ...defaultProps,
154
+ choice: {
155
+ ...defaultProps.choice,
156
+ label: '<span data-latex="\\frac{1}{2}"></span>'
157
+ }
158
+ };
159
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, props));
160
+ const input = _react2.screen.getByTestId('editable-input');
161
+ expect(input).toHaveAttribute('placeholder', '');
162
+ });
163
+ });
164
+ describe('interactions', () => {
165
+ it('should call onDelete when delete button is clicked', () => {
166
+ const {
167
+ container
168
+ } = (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, defaultProps));
169
+ const deleteButton = container.querySelector('button');
170
+ _react2.fireEvent.click(deleteButton);
171
+ expect(defaultProps.onDelete).toHaveBeenCalled();
172
+ });
173
+ it('should call onChoiceChange when label is changed', () => {
174
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, defaultProps));
175
+ const input = _react2.screen.getByTestId('editable-input');
176
+ _react2.fireEvent.change(input, {
177
+ target: {
178
+ value: 'Updated choice'
179
+ }
180
+ });
181
+ expect(defaultProps.onChoiceChange).toHaveBeenCalledWith({
182
+ ...defaultProps.choice,
183
+ label: 'Updated choice'
184
+ });
185
+ });
186
+ it('should not allow changes when disabled', () => {
187
+ const props = {
188
+ ...defaultProps,
189
+ choice: {
190
+ ...defaultProps.choice,
191
+ editable: false
192
+ }
193
+ };
194
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, props));
195
+ const input = _react2.screen.getByTestId('editable-input');
196
+ expect(input).toBeDisabled();
197
+ });
198
+ });
199
+ describe('errors', () => {
200
+ it('should display error message when editable and error exists', () => {
201
+ const props = {
202
+ ...defaultProps,
203
+ error: 'This field is required'
204
+ };
205
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, props));
206
+ const errorElements = _react2.screen.getAllByText('This field is required');
207
+ expect(errorElements).toHaveLength(2); // error appears in both EditableHtml and the component
208
+ expect(errorElements[0]).toBeInTheDocument();
209
+ });
210
+ it('should pass error to EditableHtml', () => {
211
+ const props = {
212
+ ...defaultProps,
213
+ error: 'This field is required'
214
+ };
215
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, props));
216
+ expect(_react2.screen.getByTestId('editable-error')).toHaveTextContent('This field is required');
217
+ });
218
+ it('should not display error when not editable', () => {
219
+ const props = {
220
+ ...defaultProps,
221
+ choice: {
222
+ ...defaultProps.choice,
223
+ editable: false
224
+ },
225
+ error: 'This field is required'
226
+ };
227
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, props));
228
+ expect(_react2.screen.queryByText('This field is required')).not.toBeInTheDocument();
229
+ });
230
+ });
231
+ describe('image support', () => {
232
+ it('should pass imageSupport to EditableHtml', () => {
233
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, defaultProps));
234
+ expect(_react2.screen.getByTestId('editable-html')).toBeInTheDocument();
235
+ });
236
+ it('should pass maxImageWidth and maxImageHeight', () => {
237
+ const props = {
238
+ ...defaultProps,
239
+ maxImageWidth: {
240
+ unit: 'px',
241
+ value: 500
242
+ },
243
+ maxImageHeight: {
244
+ unit: 'px',
245
+ value: 400
246
+ }
247
+ };
248
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, props));
249
+ expect(_react2.screen.getByTestId('editable-html')).toBeInTheDocument();
250
+ });
251
+ });
252
+ describe('drag and drop IDs', () => {
253
+ it('should generate correct draggable ID', () => {
254
+ const props = {
255
+ ...defaultProps,
256
+ choice: {
257
+ id: 'c1',
258
+ label: 'Choice 1',
259
+ type: 'choice',
260
+ editable: true
261
+ }
262
+ };
263
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, props));
264
+ // The component uses draggableId: `${type}-${choice.id}` => 'choice-c1'
265
+ expect(_react2.screen.getByTestId('editable-html')).toBeInTheDocument();
266
+ });
267
+ it('should generate correct droppable ID', () => {
268
+ const props = {
269
+ ...defaultProps,
270
+ choice: {
271
+ id: 'c1',
272
+ label: 'Choice 1',
273
+ type: 'target',
274
+ editable: false
275
+ }
276
+ };
277
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_choiceTile.ChoiceTile, props));
278
+ // The component uses droppableId: `${type}-drop-${choice.id}` => 'target-drop-c1'
279
+ expect(_react2.screen.getByTestId('editable-html')).toBeInTheDocument();
280
+ });
281
+ });
282
+ });
283
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfY2hvaWNlVGlsZSIsImplc3QiLCJtb2NrIiwidXNlRHJhZ2dhYmxlIiwiYXR0cmlidXRlcyIsImxpc3RlbmVycyIsIm9uUG9pbnRlckRvd24iLCJmbiIsInNldE5vZGVSZWYiLCJ0cmFuc2Zvcm0iLCJpc0RyYWdnaW5nIiwidXNlRHJvcHBhYmxlIiwiaXNPdmVyIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJtYXJrdXAiLCJvbkNoYW5nZSIsImRpc2FibGVkIiwicGxhY2Vob2xkZXIiLCJlcnJvciIsImNyZWF0ZUVsZW1lbnQiLCJ2YWx1ZSIsImUiLCJ0YXJnZXQiLCJERUZBVUxUX1BMVUdJTlMiLCJjb2xvciIsInRlcnRpYXJ5IiwiZGVzY3JpYmUiLCJkZWZhdWx0UHJvcHMiLCJiZWZvcmVFYWNoIiwiY2hvaWNlIiwiaWQiLCJsYWJlbCIsImVkaXRhYmxlIiwidHlwZSIsImluZGV4IiwiY2hvaWNlcyIsIm9uQ2hvaWNlQ2hhbmdlIiwib25EZWxldGUiLCJpbWFnZVN1cHBvcnQiLCJhZGQiLCJkZWxldGUiLCJzcGVsbENoZWNrIiwidG9vbGJhck9wdHMiLCJwbHVnaW5Qcm9wcyIsIm1heEltYWdlV2lkdGgiLCJ1bml0IiwibWF4SW1hZ2VIZWlnaHQiLCJtYXRoTWxPcHRpb25zIiwiaXQiLCJjb250YWluZXIiLCJyZW5kZXIiLCJDaG9pY2VUaWxlIiwiZXhwZWN0IiwidG9CZVRydXRoeSIsImlucHV0Iiwic2NyZWVuIiwiZ2V0QnlUZXN0SWQiLCJ0b0hhdmVWYWx1ZSIsImRyYWdIYW5kbGUiLCJxdWVyeVNlbGVjdG9yIiwidG9CZUluVGhlRG9jdW1lbnQiLCJkZWxldGVCdXR0b24iLCJwcm9wcyIsImJ1dHRvbnMiLCJxdWVyeVNlbGVjdG9yQWxsIiwibGVuZ3RoIiwidG9CZSIsInRvSGF2ZUF0dHJpYnV0ZSIsImZpcmVFdmVudCIsImNsaWNrIiwidG9IYXZlQmVlbkNhbGxlZCIsImNoYW5nZSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwidG9CZURpc2FibGVkIiwiZXJyb3JFbGVtZW50cyIsImdldEFsbEJ5VGV4dCIsInRvSGF2ZUxlbmd0aCIsInRvSGF2ZVRleHRDb250ZW50IiwicXVlcnlCeVRleHQiLCJub3QiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2Nob2ljZS10aWxlLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIsIGZpcmVFdmVudCwgc2NyZWVuIH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgJ0B0ZXN0aW5nLWxpYnJhcnkvamVzdC1kb20nO1xuaW1wb3J0IHsgQ2hvaWNlVGlsZSB9IGZyb20gJy4uL2Nob2ljZS10aWxlJztcblxuLy8gTW9jayBkZXBlbmRlbmNpZXNcbmplc3QubW9jaygnQGRuZC1raXQvY29yZScsICgpID0+ICh7XG4gIHVzZURyYWdnYWJsZTogKCkgPT4gKHtcbiAgICBhdHRyaWJ1dGVzOiB7ICdkYXRhLWRyYWdnYWJsZSc6ICd0cnVlJyB9LFxuICAgIGxpc3RlbmVyczogeyBvblBvaW50ZXJEb3duOiBqZXN0LmZuKCkgfSxcbiAgICBzZXROb2RlUmVmOiBqZXN0LmZuKCksXG4gICAgdHJhbnNmb3JtOiBudWxsLFxuICAgIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICB9KSxcbiAgdXNlRHJvcHBhYmxlOiAoKSA9PiAoe1xuICAgIHNldE5vZGVSZWY6IGplc3QuZm4oKSxcbiAgICBpc092ZXI6IGZhbHNlLFxuICB9KSxcbn0pKTtcblxuamVzdC5tb2NrKCdAcGllLWxpYi9lZGl0YWJsZS1odG1sLXRpcC10YXAnLCAoKSA9PiAoe1xuICBfX2VzTW9kdWxlOiB0cnVlLFxuICBkZWZhdWx0OiAoeyBtYXJrdXAsIG9uQ2hhbmdlLCBkaXNhYmxlZCwgcGxhY2Vob2xkZXIsIGVycm9yIH0pID0+IChcbiAgICA8ZGl2IGRhdGEtdGVzdGlkPVwiZWRpdGFibGUtaHRtbFwiPlxuICAgICAgPGlucHV0XG4gICAgICAgIGRhdGEtdGVzdGlkPVwiZWRpdGFibGUtaW5wdXRcIlxuICAgICAgICB2YWx1ZT17bWFya3VwfVxuICAgICAgICBvbkNoYW5nZT17KGUpID0+IG9uQ2hhbmdlKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAvPlxuICAgICAge2Vycm9yICYmIDxkaXYgZGF0YS10ZXN0aWQ9XCJlZGl0YWJsZS1lcnJvclwiPntlcnJvcn08L2Rpdj59XG4gICAgPC9kaXY+XG4gICksXG4gIERFRkFVTFRfUExVR0lOUzogWydib2xkJywgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAnYnVsbGV0ZWQtbGlzdCcsICdudW1iZXJlZC1saXN0J10sXG59KSk7XG5cbmplc3QubW9jaygnQHBpZS1saWIvcmVuZGVyLXVpJywgKCkgPT4gKHtcbiAgY29sb3I6IHtcbiAgICB0ZXJ0aWFyeTogKCkgPT4gJyM2NjY2NjYnLFxuICB9LFxufSkpO1xuXG5kZXNjcmliZSgnQ2hvaWNlVGlsZScsICgpID0+IHtcbiAgbGV0IGRlZmF1bHRQcm9wcztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICBjaG9pY2U6IHtcbiAgICAgICAgaWQ6ICdjMScsXG4gICAgICAgIGxhYmVsOiAnVGVzdCBjaG9pY2UnLFxuICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ2Nob2ljZScsXG4gICAgICB9LFxuICAgICAgaW5kZXg6IDAsXG4gICAgICBjaG9pY2VzOiBbXSxcbiAgICAgIG9uQ2hvaWNlQ2hhbmdlOiBqZXN0LmZuKCksXG4gICAgICBvbkRlbGV0ZTogamVzdC5mbigpLFxuICAgICAgaW1hZ2VTdXBwb3J0OiB7XG4gICAgICAgIGFkZDogamVzdC5mbigpLFxuICAgICAgICBkZWxldGU6IGplc3QuZm4oKSxcbiAgICAgIH0sXG4gICAgICBzcGVsbENoZWNrOiB0cnVlLFxuICAgICAgdG9vbGJhck9wdHM6IHt9LFxuICAgICAgcGx1Z2luUHJvcHM6IHt9LFxuICAgICAgbWF4SW1hZ2VXaWR0aDogeyB1bml0OiAncHgnLCB2YWx1ZTogMzAwIH0sXG4gICAgICBtYXhJbWFnZUhlaWdodDogeyB1bml0OiAncHgnLCB2YWx1ZTogMzAwIH0sXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIG1hdGhNbE9wdGlvbnM6IHt9LFxuICAgIH07XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZW5kZXJpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgd2l0aG91dCBjcmFzaGluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPENob2ljZVRpbGUgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgd2l0aCBjb3JyZWN0IGxhYmVsJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxDaG9pY2VUaWxlIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGlucHV0ID0gc2NyZWVuLmdldEJ5VGVzdElkKCdlZGl0YWJsZS1pbnB1dCcpO1xuICAgICAgZXhwZWN0KGlucHV0KS50b0hhdmVWYWx1ZSgnVGVzdCBjaG9pY2UnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGRyYWcgaGFuZGxlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8Q2hvaWNlVGlsZSB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCBkcmFnSGFuZGxlID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRlc3RpZD1cIkRyYWdIYW5kbGVJY29uXCJdJyk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRyYWdnYWJsZT1cInRydWVcIl0nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGRlbGV0ZSBidXR0b24gd2hlbiBlZGl0YWJsZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPENob2ljZVRpbGUgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgZGVsZXRlQnV0dG9uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpO1xuICAgICAgZXhwZWN0KGRlbGV0ZUJ1dHRvbikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJlbmRlciBkZWxldGUgYnV0dG9uIHdoZW4gbm90IGVkaXRhYmxlJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgY2hvaWNlOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmNob2ljZSxcbiAgICAgICAgICBlZGl0YWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxDaG9pY2VUaWxlIHsuLi5wcm9wc30gLz4pO1xuICAgICAgY29uc3QgYnV0dG9ucyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKTtcbiAgICAgIC8vIE5vIGRlbGV0ZSBidXR0b24gd2hlbiBub3QgZWRpdGFibGVcbiAgICAgIGV4cGVjdChidXR0b25zLmxlbmd0aCkudG9CZSgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2hvdyBwbGFjZWhvbGRlciBmb3IgZW1wdHkgY2hvaWNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgY2hvaWNlOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmNob2ljZSxcbiAgICAgICAgICBsYWJlbDogJycsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICByZW5kZXIoPENob2ljZVRpbGUgey4uLnByb3BzfSAvPik7XG4gICAgICBjb25zdCBpbnB1dCA9IHNjcmVlbi5nZXRCeVRlc3RJZCgnZWRpdGFibGUtaW5wdXQnKTtcbiAgICAgIGV4cGVjdChpbnB1dCkudG9IYXZlQXR0cmlidXRlKCdwbGFjZWhvbGRlcicsICdFbnRlciBhIGNob2ljZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3Qgc2hvdyBwbGFjZWhvbGRlciBmb3IgdGFyZ2V0IHR5cGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBjaG9pY2U6IHtcbiAgICAgICAgICAuLi5kZWZhdWx0UHJvcHMuY2hvaWNlLFxuICAgICAgICAgIHR5cGU6ICd0YXJnZXQnLFxuICAgICAgICAgIGxhYmVsOiAnJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIHJlbmRlcig8Q2hvaWNlVGlsZSB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGlucHV0ID0gc2NyZWVuLmdldEJ5VGVzdElkKCdlZGl0YWJsZS1pbnB1dCcpO1xuICAgICAgZXhwZWN0KGlucHV0KS50b0hhdmVBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJywgJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3Qgc2hvdyBwbGFjZWhvbGRlciBmb3IgTGFUZVggY29udGVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGNob2ljZToge1xuICAgICAgICAgIC4uLmRlZmF1bHRQcm9wcy5jaG9pY2UsXG4gICAgICAgICAgbGFiZWw6ICc8c3BhbiBkYXRhLWxhdGV4PVwiXFxcXGZyYWN7MX17Mn1cIj48L3NwYW4+JyxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIHJlbmRlcig8Q2hvaWNlVGlsZSB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGlucHV0ID0gc2NyZWVuLmdldEJ5VGVzdElkKCdlZGl0YWJsZS1pbnB1dCcpO1xuICAgICAgZXhwZWN0KGlucHV0KS50b0hhdmVBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJywgJycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaW50ZXJhY3Rpb25zJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY2FsbCBvbkRlbGV0ZSB3aGVuIGRlbGV0ZSBidXR0b24gaXMgY2xpY2tlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPENob2ljZVRpbGUgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgZGVsZXRlQnV0dG9uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpO1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGVsZXRlQnV0dG9uKTtcblxuICAgICAgZXhwZWN0KGRlZmF1bHRQcm9wcy5vbkRlbGV0ZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIG9uQ2hvaWNlQ2hhbmdlIHdoZW4gbGFiZWwgaXMgY2hhbmdlZCcsICgpID0+IHtcbiAgICAgIHJlbmRlcig8Q2hvaWNlVGlsZSB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCBpbnB1dCA9IHNjcmVlbi5nZXRCeVRlc3RJZCgnZWRpdGFibGUtaW5wdXQnKTtcblxuICAgICAgZmlyZUV2ZW50LmNoYW5nZShpbnB1dCwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdVcGRhdGVkIGNob2ljZScgfSB9KTtcblxuICAgICAgZXhwZWN0KGRlZmF1bHRQcm9wcy5vbkNob2ljZUNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMuY2hvaWNlLFxuICAgICAgICBsYWJlbDogJ1VwZGF0ZWQgY2hvaWNlJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgYWxsb3cgY2hhbmdlcyB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgY2hvaWNlOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmNob2ljZSxcbiAgICAgICAgICBlZGl0YWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICByZW5kZXIoPENob2ljZVRpbGUgey4uLnByb3BzfSAvPik7XG4gICAgICBjb25zdCBpbnB1dCA9IHNjcmVlbi5nZXRCeVRlc3RJZCgnZWRpdGFibGUtaW5wdXQnKTtcblxuICAgICAgZXhwZWN0KGlucHV0KS50b0JlRGlzYWJsZWQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Vycm9ycycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGRpc3BsYXkgZXJyb3IgbWVzc2FnZSB3aGVuIGVkaXRhYmxlIGFuZCBlcnJvciBleGlzdHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBlcnJvcjogJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnLFxuICAgICAgfTtcblxuICAgICAgcmVuZGVyKDxDaG9pY2VUaWxlIHsuLi5wcm9wc30gLz4pO1xuICAgICAgY29uc3QgZXJyb3JFbGVtZW50cyA9IHNjcmVlbi5nZXRBbGxCeVRleHQoJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnKTtcbiAgICAgIGV4cGVjdChlcnJvckVsZW1lbnRzKS50b0hhdmVMZW5ndGgoMik7IC8vIGVycm9yIGFwcGVhcnMgaW4gYm90aCBFZGl0YWJsZUh0bWwgYW5kIHRoZSBjb21wb25lbnRcbiAgICAgIGV4cGVjdChlcnJvckVsZW1lbnRzWzBdKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXNzIGVycm9yIHRvIEVkaXRhYmxlSHRtbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGVycm9yOiAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcsXG4gICAgICB9O1xuXG4gICAgICByZW5kZXIoPENob2ljZVRpbGUgey4uLnByb3BzfSAvPik7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGVzdElkKCdlZGl0YWJsZS1lcnJvcicpKS50b0hhdmVUZXh0Q29udGVudCgnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgZGlzcGxheSBlcnJvciB3aGVuIG5vdCBlZGl0YWJsZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGNob2ljZToge1xuICAgICAgICAgIC4uLmRlZmF1bHRQcm9wcy5jaG9pY2UsXG4gICAgICAgICAgZWRpdGFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnLFxuICAgICAgfTtcblxuICAgICAgcmVuZGVyKDxDaG9pY2VUaWxlIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHNjcmVlbi5xdWVyeUJ5VGV4dCgnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2ltYWdlIHN1cHBvcnQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBwYXNzIGltYWdlU3VwcG9ydCB0byBFZGl0YWJsZUh0bWwnLCAoKSA9PiB7XG4gICAgICByZW5kZXIoPENob2ljZVRpbGUgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRlc3RJZCgnZWRpdGFibGUtaHRtbCcpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXNzIG1heEltYWdlV2lkdGggYW5kIG1heEltYWdlSGVpZ2h0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgbWF4SW1hZ2VXaWR0aDogeyB1bml0OiAncHgnLCB2YWx1ZTogNTAwIH0sXG4gICAgICAgIG1heEltYWdlSGVpZ2h0OiB7IHVuaXQ6ICdweCcsIHZhbHVlOiA0MDAgfSxcbiAgICAgIH07XG5cbiAgICAgIHJlbmRlcig8Q2hvaWNlVGlsZSB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXN0SWQoJ2VkaXRhYmxlLWh0bWwnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RyYWcgYW5kIGRyb3AgSURzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgY29ycmVjdCBkcmFnZ2FibGUgSUQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBjaG9pY2U6IHtcbiAgICAgICAgICBpZDogJ2MxJyxcbiAgICAgICAgICBsYWJlbDogJ0Nob2ljZSAxJyxcbiAgICAgICAgICB0eXBlOiAnY2hvaWNlJyxcbiAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIHJlbmRlcig8Q2hvaWNlVGlsZSB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIC8vIFRoZSBjb21wb25lbnQgdXNlcyBkcmFnZ2FibGVJZDogYCR7dHlwZX0tJHtjaG9pY2UuaWR9YCA9PiAnY2hvaWNlLWMxJ1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRlc3RJZCgnZWRpdGFibGUtaHRtbCcpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBjb3JyZWN0IGRyb3BwYWJsZSBJRCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGNob2ljZToge1xuICAgICAgICAgIGlkOiAnYzEnLFxuICAgICAgICAgIGxhYmVsOiAnQ2hvaWNlIDEnLFxuICAgICAgICAgIHR5cGU6ICd0YXJnZXQnLFxuICAgICAgICAgIGVkaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIHJlbmRlcig8Q2hvaWNlVGlsZSB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIC8vIFRoZSBjb21wb25lbnQgdXNlcyBkcm9wcGFibGVJZDogYCR7dHlwZX0tZHJvcC0ke2Nob2ljZS5pZH1gID0+ICd0YXJnZXQtZHJvcC1jMSdcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXN0SWQoJ2VkaXRhYmxlLWh0bWwnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0FBLE9BQUE7QUFDQSxJQUFBRSxXQUFBLEdBQUFGLE9BQUE7QUFFQTtBQUNBRyxJQUFJLENBQUNDLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTztFQUNoQ0MsWUFBWSxFQUFFQSxDQUFBLE1BQU87SUFDbkJDLFVBQVUsRUFBRTtNQUFFLGdCQUFnQixFQUFFO0lBQU8sQ0FBQztJQUN4Q0MsU0FBUyxFQUFFO01BQUVDLGFBQWEsRUFBRUwsSUFBSSxDQUFDTSxFQUFFLENBQUM7SUFBRSxDQUFDO0lBQ3ZDQyxVQUFVLEVBQUVQLElBQUksQ0FBQ00sRUFBRSxDQUFDLENBQUM7SUFDckJFLFNBQVMsRUFBRSxJQUFJ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
@@ -0,0 +1,268 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _react = require("@testing-library/react");
5
+ var _react2 = _interopRequireDefault(require("react"));
6
+ var _lodashEs = require("lodash-es");
7
+ var _nestedProperty = require("nested-property");
8
+ var _design = require("../design");
9
+ var _defaults = _interopRequireDefault(require("../defaults"));
10
+ jest.mock('@pie-lib/config-ui', () => ({
11
+ FeedbackConfig: props => /*#__PURE__*/_react2.default.createElement("div", {
12
+ "data-testid": "feedback-config"
13
+ }),
14
+ FormSection: props => /*#__PURE__*/_react2.default.createElement("div", {
15
+ "data-testid": "form-section"
16
+ }),
17
+ InputContainer: props => /*#__PURE__*/_react2.default.createElement("div", {
18
+ "data-testid": "input-container"
19
+ }),
20
+ layout: {
21
+ ConfigLayout: props => /*#__PURE__*/_react2.default.createElement("div", {
22
+ "data-testid": "config-layout"
23
+ }, props.children)
24
+ },
25
+ settings: {
26
+ Panel: props => /*#__PURE__*/_react2.default.createElement("div", {
27
+ "data-testid": "settings-panel",
28
+ onChange: props.onChange
29
+ }),
30
+ toggle: jest.fn(),
31
+ radio: jest.fn(),
32
+ dropdown: jest.fn()
33
+ }
34
+ }));
35
+ jest.mock('nested-property', () => ({
36
+ set: jest.fn((model, modelPath, v) => {
37
+ model[modelPath] = v;
38
+ return model;
39
+ }),
40
+ get: jest.fn((value, valuePath) => {
41
+ switch (valuePath) {
42
+ case 'value':
43
+ return value[valuePath];
44
+ case 'taget.value':
45
+ return value.target.value;
46
+ default:
47
+ return value;
48
+ }
49
+ })
50
+ }));
51
+ describe('Placement Ordering', () => {
52
+ let onModelChanged;
53
+ let onConfigurationChanged;
54
+ let model;
55
+ let configuration;
56
+ beforeEach(() => {
57
+ onModelChanged = jest.fn();
58
+ onConfigurationChanged = jest.fn();
59
+ model = (0, _lodashEs.cloneDeep)(_defaults.default.model);
60
+ configuration = (0, _lodashEs.cloneDeep)(_defaults.default.configuration);
61
+ });
62
+ describe('logic', () => {
63
+ let instance;
64
+ let modelFn;
65
+ const createInstance = (extras = {}) => {
66
+ const defaults = {
67
+ classes: {},
68
+ className: 'className',
69
+ onModelChanged,
70
+ onConfigurationChanged,
71
+ model,
72
+ configuration
73
+ };
74
+ const props = {
75
+ ...defaults,
76
+ ...extras
77
+ };
78
+ const inst = new _design.Design(props);
79
+ inst.setState = jest.fn((state, callback) => {
80
+ Object.assign(inst.state, typeof state === 'function' ? state(inst.state) : state);
81
+ if (callback) callback();
82
+ });
83
+ return inst;
84
+ };
85
+ beforeEach(() => {
86
+ instance = createInstance();
87
+ });
88
+ describe('applyUpdate', () => {
89
+ beforeEach(() => {
90
+ modelFn = jest.fn().mockReturnValue({
91
+ ...model,
92
+ prompt: 'Updated Item Stem'
93
+ });
94
+ instance.applyUpdate(modelFn);
95
+ });
96
+ it('calls onModelChanged with updated item stem value', () => {
97
+ expect(onModelChanged).toHaveBeenCalledWith({
98
+ ...model,
99
+ prompt: 'Updated Item Stem'
100
+ });
101
+ });
102
+ });
103
+ describe('changeHandler', () => {
104
+ let change;
105
+ beforeEach(() => {
106
+ change = (modelPath, valuePath, value) => {
107
+ const onChoiceAreaLabelChange = instance.changeHandler(modelPath, valuePath);
108
+ onChoiceAreaLabelChange(value);
109
+ };
110
+ });
111
+ it('calls onModelChanged with updated item stem', () => {
112
+ const modelPath = 'prompt';
113
+ const value = 'Updated Choice Area Label';
114
+ change(modelPath, undefined, value);
115
+ expect(onModelChanged).toHaveBeenCalledWith({
116
+ ...model,
117
+ [modelPath]: value
118
+ });
119
+ });
120
+ it('calls onModelChanged with updated item stem', () => {
121
+ const modelPath = 'teacherInstructions';
122
+ const value = 'Updated Choice Area Label';
123
+ change(modelPath, undefined, value);
124
+ expect(onModelChanged).toHaveBeenCalledWith({
125
+ ...model,
126
+ [modelPath]: value
127
+ });
128
+ });
129
+ it('calls onModelChanged with updated choice area label', () => {
130
+ const modelPath = 'choiceLabel';
131
+ const valuePath = 'value';
132
+ const value = 'Updated Choice Area Label';
133
+ change(modelPath, valuePath, {
134
+ value
135
+ });
136
+ expect(onModelChanged).toHaveBeenCalledWith({
137
+ ...model,
138
+ [modelPath]: value
139
+ });
140
+ });
141
+ it('calls onModelChanged with updated answer area label', () => {
142
+ const modelPath = 'targetLabel';
143
+ const valuePath = 'value';
144
+ const value = 'Updated Answer Area Label';
145
+ change(modelPath, valuePath, {
146
+ value
147
+ });
148
+ expect(onModelChanged).toHaveBeenCalledWith({
149
+ ...model,
150
+ [modelPath]: value
151
+ });
152
+ });
153
+ it('calls onModelChanged with updated feedback', () => {
154
+ const modelPath = 'feedback';
155
+ const value = {};
156
+ change(modelPath, undefined, value);
157
+ expect(onModelChanged).toHaveBeenCalledWith({
158
+ ...model,
159
+ [modelPath]: value
160
+ });
161
+ });
162
+ });
163
+ describe('onPromptChange', () => {
164
+ it('calls update model when prompt changes', () => {
165
+ let newItemStem = 'New item stem';
166
+ instance.onPromptChange(newItemStem);
167
+ expect(onModelChanged).toBeCalledWith({
168
+ ...model,
169
+ prompt: newItemStem
170
+ });
171
+ });
172
+ });
173
+ describe('onRationaleChange', () => {
174
+ it('calls update model when prompt changes', () => {
175
+ let newRationale = 'New Rationale';
176
+ instance.onRationaleChange(newRationale);
177
+ expect(onModelChanged).toBeCalledWith({
178
+ ...model,
179
+ rationale: newRationale
180
+ });
181
+ });
182
+ });
183
+ describe('onChoiceAreaLabelChange', () => {
184
+ it('calls update model when choice area label changes', () => {
185
+ let newChoiceAreaLabel = 'New Choice Area Label';
186
+ instance.onChoiceAreaLabelChange(newChoiceAreaLabel);
187
+ expect(onModelChanged).toBeCalledWith({
188
+ ...model,
189
+ choiceLabel: newChoiceAreaLabel
190
+ });
191
+ });
192
+ });
193
+ describe('onAnswerAreaLabelChange', () => {
194
+ it('calls update model when answer area label changes', () => {
195
+ let newAnswerAreaLabel = 'New Answer Area Label';
196
+ instance.onAnswerAreaLabelChange(newAnswerAreaLabel);
197
+ expect(onModelChanged).toBeCalledWith({
198
+ ...model,
199
+ targetLabel: newAnswerAreaLabel
200
+ });
201
+ });
202
+ });
203
+ describe('onFeedbackChange', () => {
204
+ it('calls update model when feedback changes', () => {
205
+ let newFeedback = {
206
+ correct: {
207
+ type: 'custom',
208
+ custom: 'CORRECT'
209
+ },
210
+ incorrect: {
211
+ type: 'custom',
212
+ custom: 'INCORRECT'
213
+ },
214
+ partial: {
215
+ type: 'custom',
216
+ custom: 'PARTIAL'
217
+ }
218
+ };
219
+ instance.onFeedbackChange(newFeedback);
220
+ expect(onModelChanged).toBeCalledWith({
221
+ ...model,
222
+ feedback: newFeedback
223
+ });
224
+ });
225
+ });
226
+ describe('onChoiceEditorChange', () => {
227
+ it('calls update model when choices array changes', () => {
228
+ let choices = [{
229
+ id: 'c1',
230
+ label: 'Choice 1'
231
+ }, {
232
+ id: 'c2',
233
+ label: 'Choice 2'
234
+ }];
235
+ let correctResponse = [{
236
+ id: 'c2'
237
+ }, {
238
+ id: 'c1'
239
+ }];
240
+ instance.onChoiceEditorChange(choices, correctResponse);
241
+ expect(onModelChanged).toBeCalledWith({
242
+ ...model,
243
+ choices,
244
+ correctResponse
245
+ });
246
+ });
247
+ });
248
+ describe('onSettingsChange', () => {
249
+ it('renders with config layout', () => {
250
+ const {
251
+ container
252
+ } = (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_design.Design, {
253
+ model: model,
254
+ configuration: configuration,
255
+ classes: {},
256
+ className: 'className',
257
+ onModelChanged: onModelChanged,
258
+ onConfigurationChanged: onConfigurationChanged
259
+ }));
260
+
261
+ // Check that ConfigLayout renders
262
+ const configLayout = container.querySelector('[data-testid="config-layout"]');
263
+ expect(configLayout).toBeInTheDocument();
264
+ });
265
+ });
266
+ });
267
+ });
268
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX3JlYWN0MiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbG9kYXNoRXMiLCJfbmVzdGVkUHJvcGVydHkiLCJfZGVzaWduIiwiX2RlZmF1bHRzIiwiamVzdCIsIm1vY2siLCJGZWVkYmFja0NvbmZpZyIsInByb3BzIiwiZGVmYXVsdCIsImNyZWF0ZUVsZW1lbnQiLCJGb3JtU2VjdGlvbiIsIklucHV0Q29udGFpbmVyIiwibGF5b3V0IiwiQ29uZmlnTGF5b3V0IiwiY2hpbGRyZW4iLCJzZXR0aW5ncyIsIlBhbmVsIiwib25DaGFuZ2UiLCJ0b2dnbGUiLCJmbiIsInJhZGlvIiwiZHJvcGRvd24iLCJzZXQiLCJtb2RlbCIsIm1vZGVsUGF0aCIsInYiLCJnZXQiLCJ2YWx1ZSIsInZhbHVlUGF0aCIsInRhcmdldCIsImRlc2NyaWJlIiwib25Nb2RlbENoYW5nZWQiLCJvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkIiwiY29uZmlndXJhdGlvbiIsImJlZm9yZUVhY2giLCJjbG9uZURlZXAiLCJkZWZhdWx0VmFsdWVzIiwiaW5zdGFuY2UiLCJtb2RlbEZuIiwiY3JlYXRlSW5zdGFuY2UiLCJleHRyYXMiLCJkZWZhdWx0cyIsImNsYXNzZXMiLCJjbGFzc05hbWUiLCJpbnN0IiwiRGVzaWduIiwic2V0U3RhdGUiLCJzdGF0ZSIsImNhbGxiYWNrIiwiT2JqZWN0IiwiYXNzaWduIiwibW9ja1JldHVyblZhbHVlIiwicHJvbXB0IiwiYXBwbHlVcGRhdGUiLCJpdCIsImV4cGVjdCIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwiY2hhbmdlIiwib25DaG9pY2VBcmVhTGFiZWxDaGFuZ2UiLCJjaGFuZ2VIYW5kbGVyIiwidW5kZWZpbmVkIiwibmV3SXRlbVN0ZW0iLCJvblByb21wdENoYW5nZSIsInRvQmVDYWxsZWRXaXRoIiwibmV3UmF0aW9uYWxlIiwib25SYXRpb25hbGVDaGFuZ2UiLCJyYXRpb25hbGUiLCJuZXdDaG9pY2VBcmVhTGFiZWwiLCJjaG9pY2VMYWJlbCIsIm5ld0Fuc3dlckFyZWFMYWJlbCIsIm9uQW5zd2VyQXJlYUxhYmVsQ2hhbmdlIiwidGFyZ2V0TGFiZWwiLCJuZXdGZWVkYmFjayIsImNvcnJlY3QiLCJ0eXBlIiwiY3VzdG9tIiwiaW5jb3JyZWN0IiwicGFydGlhbCIsIm9uRmVlZGJhY2tDaGFuZ2UiLCJmZWVkYmFjayIsImNob2ljZXMiLCJpZCIsImxhYmVsIiwiY29ycmVjdFJlc3BvbnNlIiwib25DaG9pY2VFZGl0b3JDaGFuZ2UiLCJjb250YWluZXIiLCJyZW5kZXIiLCJjb25maWdMYXlvdXQiLCJxdWVyeVNlbGVjdG9yIiwidG9CZUluVGhlRG9jdW1lbnQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2Rlc2lnbi50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZW5kZXIgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBnZXQsIHNldCB9IGZyb20gJ25lc3RlZC1wcm9wZXJ0eSc7XG5pbXBvcnQgeyBEZXNpZ24gfSBmcm9tICcuLi9kZXNpZ24nO1xuaW1wb3J0IGRlZmF1bHRWYWx1ZXMgZnJvbSAnLi4vZGVmYXVsdHMnO1xuXG5qZXN0Lm1vY2soJ0BwaWUtbGliL2NvbmZpZy11aScsICgpID0+ICh7XG4gIEZlZWRiYWNrQ29uZmlnOiAocHJvcHMpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJmZWVkYmFjay1jb25maWdcIiAvPixcbiAgRm9ybVNlY3Rpb246IChwcm9wcykgPT4gPGRpdiBkYXRhLXRlc3RpZD1cImZvcm0tc2VjdGlvblwiIC8+LFxuICBJbnB1dENvbnRhaW5lcjogKHByb3BzKSA9PiA8ZGl2IGRhdGEtdGVzdGlkPVwiaW5wdXQtY29udGFpbmVyXCIgLz4sXG4gIGxheW91dDoge1xuICAgIENvbmZpZ0xheW91dDogKHByb3BzKSA9PiA8ZGl2IGRhdGEtdGVzdGlkPVwiY29uZmlnLWxheW91dFwiPntwcm9wcy5jaGlsZHJlbn08L2Rpdj4sXG4gIH0sXG4gIHNldHRpbmdzOiB7XG4gICAgUGFuZWw6IChwcm9wcykgPT4gPGRpdiBkYXRhLXRlc3RpZD1cInNldHRpbmdzLXBhbmVsXCIgb25DaGFuZ2U9e3Byb3BzLm9uQ2hhbmdlfSAvPixcbiAgICB0b2dnbGU6IGplc3QuZm4oKSxcbiAgICByYWRpbzogamVzdC5mbigpLFxuICAgIGRyb3Bkb3duOiBqZXN0LmZuKCksXG4gIH0sXG59KSk7XG5cbmplc3QubW9jaygnbmVzdGVkLXByb3BlcnR5JywgKCkgPT4gKHtcbiAgc2V0OiBqZXN0LmZuKChtb2RlbCwgbW9kZWxQYXRoLCB2KSA9PiB7XG4gICAgbW9kZWxbbW9kZWxQYXRoXSA9IHY7XG5cbiAgICByZXR1cm4gbW9kZWw7XG4gIH0pLFxuICBnZXQ6IGplc3QuZm4oKHZhbHVlLCB2YWx1ZVBhdGgpID0+IHtcbiAgICBzd2l0Y2ggKHZhbHVlUGF0aCkge1xuICAgICAgY2FzZSAndmFsdWUnOlxuICAgICAgICByZXR1cm4gdmFsdWVbdmFsdWVQYXRoXTtcbiAgICAgIGNhc2UgJ3RhZ2V0LnZhbHVlJzpcbiAgICAgICAgcmV0dXJuIHZhbHVlLnRhcmdldC52YWx1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH0pLFxufSkpO1xuXG5kZXNjcmliZSgnUGxhY2VtZW50IE9yZGVyaW5nJywgKCkgPT4ge1xuICBsZXQgb25Nb2RlbENoYW5nZWQ7XG4gIGxldCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkO1xuICBsZXQgbW9kZWw7XG4gIGxldCBjb25maWd1cmF0aW9uO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG9uTW9kZWxDaGFuZ2VkID0gamVzdC5mbigpO1xuICAgIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQgPSBqZXN0LmZuKCk7XG4gICAgbW9kZWwgPSBjbG9uZURlZXAoZGVmYXVsdFZhbHVlcy5tb2RlbCk7XG4gICAgY29uZmlndXJhdGlvbiA9IGNsb25lRGVlcChkZWZhdWx0VmFsdWVzLmNvbmZpZ3VyYXRpb24pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbG9naWMnLCAoKSA9PiB7XG4gICAgbGV0IGluc3RhbmNlO1xuICAgIGxldCBtb2RlbEZuO1xuXG4gICAgY29uc3QgY3JlYXRlSW5zdGFuY2UgPSAoZXh0cmFzID0ge30pID0+IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgICBjbGFzc2VzOiB7fSxcbiAgICAgICAgY2xhc3NOYW1lOiAnY2xhc3NOYW1lJyxcbiAgICAgICAgb25Nb2RlbENoYW5nZWQsXG4gICAgICAgIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQsXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0cywgLi4uZXh0cmFzIH07XG4gICAgICBjb25zdCBpbnN0ID0gbmV3IERlc2lnbihwcm9wcyk7XG4gICAgICBpbnN0LnNldFN0YXRlID0gamVzdC5mbigoc3RhdGUsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdC5zdGF0ZSwgdHlwZW9mIHN0YXRlID09PSAnZnVuY3Rpb24nID8gc3RhdGUoaW5zdC5zdGF0ZSkgOiBzdGF0ZSk7XG4gICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGluc3Q7XG4gICAgfTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgaW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSgpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2FwcGx5VXBkYXRlJywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIG1vZGVsRm4gPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHtcbiAgICAgICAgICAuLi5tb2RlbCxcbiAgICAgICAgICBwcm9tcHQ6ICdVcGRhdGVkIEl0ZW0gU3RlbScsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGluc3RhbmNlLmFwcGx5VXBkYXRlKG1vZGVsRm4pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdjYWxscyBvbk1vZGVsQ2hhbmdlZCB3aXRoIHVwZGF0ZWQgaXRlbSBzdGVtIHZhbHVlJywgKCkgPT4ge1xuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5tb2RlbCxcbiAgICAgICAgICBwcm9tcHQ6ICdVcGRhdGVkIEl0ZW0gU3RlbScsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnY2hhbmdlSGFuZGxlcicsICgpID0+IHtcbiAgICAgIGxldCBjaGFuZ2U7XG5cbiAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBjaGFuZ2UgPSAobW9kZWxQYXRoLCB2YWx1ZVBhdGgsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb25DaG9pY2VBcmVhTGFiZWxDaGFuZ2UgPSBpbnN0YW5jZS5jaGFuZ2VIYW5kbGVyKG1vZGVsUGF0aCwgdmFsdWVQYXRoKTtcblxuICAgICAgICAgIG9uQ2hvaWNlQXJlYUxhYmVsQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2FsbHMgb25Nb2RlbENoYW5nZWQgd2l0aCB1cGRhdGVkIGl0ZW0gc3RlbScsICgpID0+IHtcbiAgICAgICAgY29uc3QgbW9kZWxQYXRoID0gJ3Byb21wdCc7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gJ1VwZGF0ZWQgQ2hvaWNlIEFyZWEgTGFiZWwnO1xuXG4gICAgICAgIGNoYW5nZShtb2RlbFBhdGgsIHVuZGVmaW5lZCwgdmFsdWUpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLm1vZGVsLFxuICAgICAgICAgIFttb2RlbFBhdGhdOiB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NhbGxzIG9uTW9kZWxDaGFuZ2VkIHdpdGggdXBkYXRlZCBpdGVtIHN0ZW0nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vZGVsUGF0aCA9ICd0ZWFjaGVySW5zdHJ1Y3Rpb25zJztcbiAgICAgICAgY29uc3QgdmFsdWUgPSAnVXBkYXRlZCBDaG9pY2UgQXJlYSBMYWJlbCc7XG5cbiAgICAgICAgY2hhbmdlKG1vZGVsUGF0aCwgdW5kZWZpbmVkLCB2YWx1ZSk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ubW9kZWwsXG4gICAgICAgICAgW21vZGVsUGF0aF06IHZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2FsbHMgb25Nb2RlbENoYW5nZWQgd2l0aCB1cGRhdGVkIGNob2ljZSBhcmVhIGxhYmVsJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtb2RlbFBhdGggPSAnY2hvaWNlTGFiZWwnO1xuICAgICAgICBjb25zdCB2YWx1ZVBhdGggPSAndmFsdWUnO1xuICAgICAgICBjb25zdCB2YWx1ZSA9ICdVcGRhdGVkIENob2ljZSBBcmVhIExhYmVsJztcblxuICAgICAgICBjaGFuZ2UobW9kZWxQYXRoLCB2YWx1ZVBhdGgsIHsgdmFsdWUgfSk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ubW9kZWwsXG4gICAgICAgICAgW21vZGVsUGF0aF06IHZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2FsbHMgb25Nb2RlbENoYW5nZWQgd2l0aCB1cGRhdGVkIGFuc3dlciBhcmVhIGxhYmVsJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtb2RlbFBhdGggPSAndGFyZ2V0TGFiZWwnO1xuICAgICAgICBjb25zdCB2YWx1ZVBhdGggPSAndmFsdWUnO1xuICAgICAgICBjb25zdCB2YWx1ZSA9ICdVcGRhdGVkIEFuc3dlciBBcmVhIExhYmVsJztcblxuICAgICAgICBjaGFuZ2UobW9kZWxQYXRoLCB2YWx1ZVBhdGgsIHsgdmFsdWUgfSk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ubW9kZWwsXG4gICAgICAgICAgW21vZGVsUGF0aF06IHZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2FsbHMgb25Nb2RlbENoYW5nZWQgd2l0aCB1cGRhdGVkIGZlZWRiYWNrJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtb2RlbFBhdGggPSAnZmVlZGJhY2snO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHt9O1xuXG4gICAgICAgIGNoYW5nZShtb2RlbFBhdGgsIHVuZGVmaW5lZCwgdmFsdWUpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLm1vZGVsLFxuICAgICAgICAgIFttb2RlbFBhdGhdOiB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvblByb21wdENoYW5nZScsICgpID0+IHtcbiAgICAgIGl0KCdjYWxscyB1cGRhdGUgbW9kZWwgd2hlbiBwcm9tcHQgY2hhbmdlcycsICgpID0+IHtcbiAgICAgICAgbGV0IG5ld0l0ZW1TdGVtID0gJ05ldyBpdGVtIHN0ZW0nO1xuXG4gICAgICAgIGluc3RhbmNlLm9uUHJvbXB0Q2hhbmdlKG5ld0l0ZW1TdGVtKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5tb2RlbCxcbiAgICAgICAgICBwcm9tcHQ6IG5ld0l0ZW1TdGVtLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uUmF0aW9uYWxlQ2hhbmdlJywgKCkgPT4ge1xuICAgICAgaXQoJ2NhbGxzIHVwZGF0ZSBtb2RlbCB3aGVuIHByb21wdCBjaGFuZ2VzJywgKCkgPT4ge1xuICAgICAgICBsZXQgbmV3UmF0aW9uYWxlID0gJ05ldyBSYXRpb25hbGUnO1xuXG4gICAgICAgIGluc3RhbmNlLm9uUmF0aW9uYWxlQ2hhbmdlKG5ld1JhdGlvbmFsZSk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ubW9kZWwsXG4gICAgICAgICAgcmF0aW9uYWxlOiBuZXdSYXRpb25hbGUsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25DaG9pY2VBcmVhTGFiZWxDaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBpdCgnY2FsbHMgdXBkYXRlIG1vZGVsIHdoZW4gY2hvaWNlIGFyZWEgbGFiZWwgY2hhbmdlcycsICgpID0+IHtcbiAgICAgICAgbGV0IG5ld0Nob2ljZUFyZWFMYWJlbCA9ICdOZXcgQ2hvaWNlIEFyZWEgTGFiZWwnO1xuXG4gICAgICAgIGluc3RhbmNlLm9uQ2hvaWNlQXJlYUxhYmVsQ2hhbmdlKG5ld0Nob2ljZUFyZWFMYWJlbCk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ubW9kZWwsXG4gICAgICAgICAgY2hvaWNlTGFiZWw6IG5ld0Nob2ljZUFyZWFMYWJlbCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvbkFuc3dlckFyZWFMYWJlbENoYW5nZScsICgpID0+IHtcbiAgICAgIGl0KCdjYWxscyB1cGRhdGUgbW9kZWwgd2hlbiBhbnN3ZXIgYXJlYSBsYWJlbCBjaGFuZ2VzJywgKCkgPT4ge1xuICAgICAgICBsZXQgbmV3QW5zd2VyQXJlYUxhYmVsID0gJ05ldyBBbnN3ZXIgQXJlYSBMYWJlbCc7XG5cbiAgICAgICAgaW5zdGFuY2Uub25BbnN3ZXJBcmVhTGFiZWxDaGFuZ2UobmV3QW5zd2VyQXJlYUxhYmVsKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5tb2RlbCxcbiAgICAgICAgICB0YXJnZXRMYWJlbDogbmV3QW5zd2VyQXJlYUxhYmVsLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uRmVlZGJhY2tDaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBpdCgnY2FsbHMgdXBkYXRlIG1vZGVsIHdoZW4gZmVlZGJhY2sgY2hhbmdlcycsICgpID0+IHtcbiAgICAgICAgbGV0IG5ld0ZlZWRiYWNrID0ge1xuICAgICAgICAgIGNvcnJlY3Q6IHtcbiAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxuICAgICAgICAgICAgY3VzdG9tOiAnQ09SUkVDVCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbmNvcnJlY3Q6IHtcbiAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxuICAgICAgICAgICAgY3VzdG9tOiAnSU5DT1JSRUNUJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhcnRpYWw6IHtcbiAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxuICAgICAgICAgICAgY3VzdG9tOiAnUEFSVElBTCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBpbnN0YW5jZS5vbkZlZWRiYWNrQ2hhbmdlKG5ld0ZlZWRiYWNrKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5tb2RlbCxcbiAgICAgICAgICBmZWVkYmFjazogbmV3RmVlZGJhY2ssXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25DaG9pY2VFZGl0b3JDaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBpdCgnY2FsbHMgdXBkYXRlIG1vZGVsIHdoZW4gY2hvaWNlcyBhcnJheSBjaGFuZ2VzJywgKCkgPT4ge1xuICAgICAgICBsZXQgY2hvaWNlcyA9IFtcbiAgICAgICAgICB7IGlkOiAnYzEnLCBsYWJlbDogJ0Nob2ljZSAxJyB9LFxuICAgICAgICAgIHsgaWQ6ICdjMicsIGxhYmVsOiAnQ2hvaWNlIDInIH0sXG4gICAgICAgIF07XG4gICAgICAgIGxldCBjb3JyZWN0UmVzcG9uc2UgPSBbeyBpZDogJ2MyJyB9LCB7IGlkOiAnYzEnIH1dO1xuXG4gICAgICAgIGluc3RhbmNlLm9uQ2hvaWNlRWRpdG9yQ2hhbmdlKGNob2ljZXMsIGNvcnJlY3RSZXNwb25zZSk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ubW9kZWwsXG4gICAgICAgICAgY2hvaWNlcyxcbiAgICAgICAgICBjb3JyZWN0UmVzcG9uc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25TZXR0aW5nc0NoYW5nZScsICgpID0+IHtcbiAgICAgIGl0KCdyZW5kZXJzIHdpdGggY29uZmlnIGxheW91dCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgICA8RGVzaWduXG4gICAgICAgICAgICBtb2RlbD17bW9kZWx9XG4gICAgICAgICAgICBjb25maWd1cmF0aW9uPXtjb25maWd1cmF0aW9ufVxuICAgICAgICAgICAgY2xhc3Nlcz17e319XG4gICAgICAgICAgICBjbGFzc05hbWU9eydjbGFzc05hbWUnfVxuICAgICAgICAgICAgb25Nb2RlbENoYW5nZWQ9e29uTW9kZWxDaGFuZ2VkfVxuICAgICAgICAgICAgb25Db25maWd1cmF0aW9uQ2hhbmdlZD17b25Db25maWd1cmF0aW9uQ2hhbmdlZH1cbiAgICAgICAgICAvPixcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBDaGVjayB0aGF0IENvbmZpZ0xheW91dCByZW5kZXJzXG4gICAgICAgIGNvbnN0IGNvbmZpZ0xheW91dCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbZGF0YS10ZXN0aWQ9XCJjb25maWctbGF5b3V0XCJdJyk7XG4gICAgICAgIGV4cGVjdChjb25maWdMYXlvdXQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsU0FBQSxHQUFBSCxPQUFBO0FBRUEsSUFBQUksZUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssT0FBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sU0FBQSxHQUFBSixzQkFBQSxDQUFBRixPQUFBO0FBRUFPLElBQUksQ0FBQ0MsSUFBSSxDQUFDLG9CQUFvQixFQUFFLE9BQU87RUFDckNDLGNBQWMsRUFBR0MsS0FBSyxpQkFBS1QsT0FBQSxDQUFBVSxPQUFBLENBQUFDLGFBQUE7SUFBSyxlQUFZO0VBQWlCLENBQUUsQ0FBQztFQUNoRUMsV0FBVyxFQUFHSCxLQUFLLGlCQUFLVCxPQUFBLENBQUFVLE9BQUEsQ0FBQUMsYUFBQTtJQUFLLGVBQVk7RUFBYyxDQUFFLENBQUM7RUFDMURFLGNBQWMsRUFBR0osS0FBSyxpQkFBS1QsT0FBQSxDQUFBVSxPQUFBLENBQUFDLGFBQUE7SUFBSyxlQUFZO0VBQWlCLENBQUUsQ0FBQztFQUNoRUcsTUFBTSxFQUFFO0lBQ05DLFlBQVksRUFBR04sS0FBSyxpQkFBS1QsT0FBQSxDQUFBVSxPQUFBLENBQUFDLGFBQUE7TUFBSyxlQUFZO0lBQWUsR0FBRUYsS0FBSyxDQUFDTyxRQUFjO0VBQ2pGLENBQUM7RUFDREMs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