@pie-lib/config-ui 13.0.13 → 13.1.0-beta

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.
Files changed (47) hide show
  1. package/CHANGELOG.md +0 -42
  2. package/lib/__tests__/alert-dialog.test.js +262 -0
  3. package/lib/__tests__/alert-dialog.test.js.map +1 -0
  4. package/lib/__tests__/checkbox.test.js +227 -0
  5. package/lib/__tests__/checkbox.test.js.map +1 -0
  6. package/lib/__tests__/choice-utils.test.js +14 -0
  7. package/lib/__tests__/choice-utils.test.js.map +1 -0
  8. package/lib/__tests__/form-section.test.js +252 -0
  9. package/lib/__tests__/form-section.test.js.map +1 -0
  10. package/lib/__tests__/help.test.js +270 -0
  11. package/lib/__tests__/help.test.js.map +1 -0
  12. package/lib/__tests__/input.test.js +268 -0
  13. package/lib/__tests__/input.test.js.map +1 -0
  14. package/lib/__tests__/langs.test.js +541 -0
  15. package/lib/__tests__/langs.test.js.map +1 -0
  16. package/lib/__tests__/number-text-field-custom.test.js +362 -0
  17. package/lib/__tests__/number-text-field-custom.test.js.map +1 -0
  18. package/lib/__tests__/number-text-field.test.js +421 -0
  19. package/lib/__tests__/number-text-field.test.js.map +1 -0
  20. package/lib/__tests__/radio-with-label.test.js +233 -0
  21. package/lib/__tests__/radio-with-label.test.js.map +1 -0
  22. package/lib/__tests__/settings-panel.test.js +184 -0
  23. package/lib/__tests__/settings-panel.test.js.map +1 -0
  24. package/lib/__tests__/settings.test.js +653 -0
  25. package/lib/__tests__/settings.test.js.map +1 -0
  26. package/lib/__tests__/tabs.test.js +211 -0
  27. package/lib/__tests__/tabs.test.js.map +1 -0
  28. package/lib/__tests__/two-choice.test.js +124 -0
  29. package/lib/__tests__/two-choice.test.js.map +1 -0
  30. package/lib/__tests__/with-stateful-model.test.js +221 -0
  31. package/lib/__tests__/with-stateful-model.test.js.map +1 -0
  32. package/lib/choice-configuration/__tests__/feedback-menu.test.js +287 -0
  33. package/lib/choice-configuration/__tests__/feedback-menu.test.js.map +1 -0
  34. package/lib/choice-configuration/__tests__/index.test.js +253 -0
  35. package/lib/choice-configuration/__tests__/index.test.js.map +1 -0
  36. package/lib/feedback-config/__tests__/feedback-config.test.js +201 -0
  37. package/lib/feedback-config/__tests__/feedback-config.test.js.map +1 -0
  38. package/lib/feedback-config/__tests__/feedback-selector.test.js +177 -0
  39. package/lib/feedback-config/__tests__/feedback-selector.test.js.map +1 -0
  40. package/lib/layout/__tests__/config.layout.test.js +70 -0
  41. package/lib/layout/__tests__/config.layout.test.js.map +1 -0
  42. package/lib/layout/__tests__/layout-content.test.js +6 -0
  43. package/lib/layout/__tests__/layout-content.test.js.map +1 -0
  44. package/lib/tags-input/__tests__/index.test.js +183 -0
  45. package/lib/tags-input/__tests__/index.test.js.map +1 -0
  46. package/package.json +5 -5
  47. package/LICENSE.md +0 -5
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
6
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _react2 = require("@testing-library/react");
9
+ var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
10
+ var _index = require("../index");
11
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
12
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
13
+ jest.mock('@pie-lib/editable-html-tip-tap', function () {
14
+ return {
15
+ __esModule: true,
16
+ "default": function _default(_ref) {
17
+ var markup = _ref.markup,
18
+ _onChange = _ref.onChange,
19
+ disabled = _ref.disabled;
20
+ return /*#__PURE__*/_react["default"].createElement("textarea", {
21
+ "data-testid": "editable-html",
22
+ defaultValue: markup || '',
23
+ onChange: function onChange(e) {
24
+ return _onChange(e.target.value);
25
+ },
26
+ disabled: disabled
27
+ });
28
+ }
29
+ };
30
+ });
31
+ var defaultFeedback = {
32
+ correct: 'Correct',
33
+ incorrect: 'Incorrect'
34
+ };
35
+ var data = {
36
+ correct: true,
37
+ value: 'foo',
38
+ label: 'Foo',
39
+ feedback: {
40
+ type: 'custom'
41
+ }
42
+ };
43
+ var classes = {
44
+ choiceConfiguration: 'choiceConfiguration'
45
+ };
46
+ describe('ChoiceConfiguration', function () {
47
+ var onChange = jest.fn();
48
+ beforeEach(function () {
49
+ onChange.mockClear();
50
+ });
51
+ describe('rendering', function () {
52
+ it('renders correctly with default props', function () {
53
+ var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.ChoiceConfiguration, {
54
+ classes: classes,
55
+ defaultFeedback: defaultFeedback,
56
+ data: data,
57
+ onChange: onChange
58
+ })),
59
+ container = _render.container;
60
+ expect(container.firstChild).toBeInTheDocument();
61
+ });
62
+ it('renders with checked state', function () {
63
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.ChoiceConfiguration, {
64
+ classes: classes,
65
+ defaultFeedback: defaultFeedback,
66
+ data: data,
67
+ onChange: onChange,
68
+ mode: "checkbox"
69
+ }));
70
+ var checkbox = _react2.screen.getByRole('checkbox');
71
+ expect(checkbox).toBeChecked();
72
+ });
73
+ it('renders without feedback when allowFeedBack is false', function () {
74
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.ChoiceConfiguration, {
75
+ allowFeedBack: false,
76
+ classes: classes,
77
+ defaultFeedback: defaultFeedback,
78
+ data: data,
79
+ onChange: onChange
80
+ }));
81
+ expect(_react2.screen.queryByRole('button', {
82
+ name: /feedback/i
83
+ })).not.toBeInTheDocument();
84
+ });
85
+ it('renders without delete button when allowDelete is false', function () {
86
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.ChoiceConfiguration, {
87
+ allowDelete: false,
88
+ classes: classes,
89
+ defaultFeedback: defaultFeedback,
90
+ data: data,
91
+ onChange: onChange
92
+ }));
93
+ expect(_react2.screen.queryByRole('button', {
94
+ name: /delete/i
95
+ })).not.toBeInTheDocument();
96
+ });
97
+ });
98
+ describe('user interactions', function () {
99
+ it('calls onChange when label is edited', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
100
+ var user, editableHtmlElements, editableHtml;
101
+ return _regenerator["default"].wrap(function (_context) {
102
+ while (1) switch (_context.prev = _context.next) {
103
+ case 0:
104
+ user = _userEvent["default"].setup();
105
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.ChoiceConfiguration, {
106
+ classes: classes,
107
+ defaultFeedback: defaultFeedback,
108
+ data: data,
109
+ onChange: onChange
110
+ }));
111
+ editableHtmlElements = _react2.screen.getAllByTestId('editable-html');
112
+ editableHtml = editableHtmlElements[0];
113
+ _context.next = 1;
114
+ return user.clear(editableHtml);
115
+ case 1:
116
+ _context.next = 2;
117
+ return user.type(editableHtml, 'new label');
118
+ case 2:
119
+ expect(onChange).toHaveBeenCalled();
120
+ expect(onChange).toHaveBeenCalledWith(expect.objectContaining({
121
+ label: expect.stringContaining('new label')
122
+ }));
123
+ case 3:
124
+ case "end":
125
+ return _context.stop();
126
+ }
127
+ }, _callee);
128
+ })));
129
+ it('calls onChange when checkbox is toggled', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
130
+ var user, checkbox;
131
+ return _regenerator["default"].wrap(function (_context2) {
132
+ while (1) switch (_context2.prev = _context2.next) {
133
+ case 0:
134
+ user = _userEvent["default"].setup();
135
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.ChoiceConfiguration, {
136
+ classes: classes,
137
+ defaultFeedback: defaultFeedback,
138
+ data: _objectSpread(_objectSpread({}, data), {}, {
139
+ correct: false
140
+ }),
141
+ onChange: onChange,
142
+ mode: "checkbox"
143
+ }));
144
+ checkbox = _react2.screen.getByRole('checkbox');
145
+ _context2.next = 1;
146
+ return user.click(checkbox);
147
+ case 1:
148
+ expect(onChange).toHaveBeenCalledWith(expect.objectContaining({
149
+ correct: true
150
+ }));
151
+ case 2:
152
+ case "end":
153
+ return _context2.stop();
154
+ }
155
+ }, _callee2);
156
+ })));
157
+ });
158
+ describe('prop variations', function () {
159
+ it('renders with radio mode instead of checkbox', function () {
160
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.ChoiceConfiguration, {
161
+ classes: classes,
162
+ defaultFeedback: defaultFeedback,
163
+ data: data,
164
+ onChange: onChange,
165
+ mode: "radio"
166
+ }));
167
+ var radio = _react2.screen.getByRole('radio');
168
+ expect(radio).toBeInTheDocument();
169
+ });
170
+ it('renders with disabled state', function () {
171
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.ChoiceConfiguration, {
172
+ classes: classes,
173
+ defaultFeedback: defaultFeedback,
174
+ data: data,
175
+ onChange: onChange,
176
+ disabled: true,
177
+ mode: "checkbox"
178
+ }));
179
+ var checkbox = _react2.screen.getByRole('checkbox');
180
+ expect(checkbox).toBeInTheDocument();
181
+ });
182
+ it('renders with custom feedback type', function () {
183
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.ChoiceConfiguration, {
184
+ classes: classes,
185
+ defaultFeedback: defaultFeedback,
186
+ data: _objectSpread(_objectSpread({}, data), {}, {
187
+ feedback: {
188
+ type: 'custom'
189
+ }
190
+ }),
191
+ onChange: onChange,
192
+ mode: "checkbox"
193
+ }));
194
+ var editableElements = _react2.screen.getAllByTestId('editable-html');
195
+ expect(editableElements.length).toBeGreaterThan(0);
196
+ });
197
+ it('renders with incorrect answer', function () {
198
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.ChoiceConfiguration, {
199
+ classes: classes,
200
+ defaultFeedback: defaultFeedback,
201
+ data: _objectSpread(_objectSpread({}, data), {}, {
202
+ correct: false
203
+ }),
204
+ onChange: onChange,
205
+ mode: "checkbox"
206
+ }));
207
+ var checkbox = _react2.screen.getByRole('checkbox');
208
+ expect(checkbox).not.toBeChecked();
209
+ });
210
+ });
211
+ describe('edge cases', function () {
212
+ it('handles data with empty label', function () {
213
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.ChoiceConfiguration, {
214
+ classes: classes,
215
+ defaultFeedback: defaultFeedback,
216
+ data: _objectSpread(_objectSpread({}, data), {}, {
217
+ label: ''
218
+ }),
219
+ onChange: onChange
220
+ }));
221
+ var editableElements = _react2.screen.getAllByTestId('editable-html');
222
+ expect(editableElements.length).toBeGreaterThan(0);
223
+ });
224
+ it('handles multiple feedback types', function () {
225
+ var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.ChoiceConfiguration, {
226
+ classes: classes,
227
+ defaultFeedback: defaultFeedback,
228
+ data: _objectSpread(_objectSpread({}, data), {}, {
229
+ feedback: {
230
+ type: 'default'
231
+ }
232
+ }),
233
+ onChange: onChange
234
+ })),
235
+ rerender = _render2.rerender;
236
+ var editableElements = _react2.screen.getAllByTestId('editable-html');
237
+ expect(editableElements.length).toBeGreaterThan(0);
238
+ rerender(/*#__PURE__*/_react["default"].createElement(_index.ChoiceConfiguration, {
239
+ classes: classes,
240
+ defaultFeedback: defaultFeedback,
241
+ data: _objectSpread(_objectSpread({}, data), {}, {
242
+ feedback: {
243
+ type: 'custom'
244
+ }
245
+ }),
246
+ onChange: onChange
247
+ }));
248
+ editableElements = _react2.screen.getAllByTestId('editable-html');
249
+ expect(editableElements.length).toBeGreaterThan(0);
250
+ });
251
+ });
252
+ });
253
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","names":["_react","_interopRequireDefault","require","_react2","_userEvent","_index","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","jest","mock","__esModule","default","_ref","markup","onChange","disabled","createElement","defaultValue","target","value","defaultFeedback","correct","incorrect","data","label","feedback","type","classes","choiceConfiguration","describe","fn","beforeEach","mockClear","it","_render","render","ChoiceConfiguration","container","expect","firstChild","toBeInTheDocument","mode","checkbox","screen","getByRole","toBeChecked","allowFeedBack","queryByRole","name","not","allowDelete","_asyncToGenerator2","_regenerator","mark","_callee","user","editableHtmlElements","editableHtml","wrap","_context","prev","next","userEvent","setup","getAllByTestId","clear","toHaveBeenCalled","toHaveBeenCalledWith","objectContaining","stringContaining","stop","_callee2","_context2","click","radio","editableElements","toBeGreaterThan","_render2","rerender"],"sources":["../../../src/choice-configuration/__tests__/index.test.jsx"],"sourcesContent":["import React from 'react';\nimport { render, screen } from '@testing-library/react';\nimport userEvent from '@testing-library/user-event';\nimport { ChoiceConfiguration } from '../index';\n\njest.mock('@pie-lib/editable-html-tip-tap', () => ({\n __esModule: true,\n default: ({ markup, onChange, disabled }) => (\n <textarea\n data-testid=\"editable-html\"\n defaultValue={markup || ''}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n />\n ),\n}));\n\nconst defaultFeedback = {\n correct: 'Correct',\n incorrect: 'Incorrect',\n};\n\nconst data = {\n correct: true,\n value: 'foo',\n label: 'Foo',\n feedback: {\n type: 'custom',\n },\n};\n\nconst classes = {\n choiceConfiguration: 'choiceConfiguration',\n};\n\ndescribe('ChoiceConfiguration', () => {\n const onChange = jest.fn();\n\n beforeEach(() => {\n onChange.mockClear();\n });\n\n describe('rendering', () => {\n it('renders correctly with default props', () => {\n const { container } = render(\n <ChoiceConfiguration classes={classes} defaultFeedback={defaultFeedback} data={data} onChange={onChange} />,\n );\n expect(container.firstChild).toBeInTheDocument();\n });\n\n it('renders with checked state', () => {\n render(\n <ChoiceConfiguration\n classes={classes}\n defaultFeedback={defaultFeedback}\n data={data}\n onChange={onChange}\n mode=\"checkbox\"\n />,\n );\n const checkbox = screen.getByRole('checkbox');\n expect(checkbox).toBeChecked();\n });\n\n it('renders without feedback when allowFeedBack is false', () => {\n render(\n <ChoiceConfiguration\n allowFeedBack={false}\n classes={classes}\n defaultFeedback={defaultFeedback}\n data={data}\n onChange={onChange}\n />,\n );\n expect(screen.queryByRole('button', { name: /feedback/i })).not.toBeInTheDocument();\n });\n\n it('renders without delete button when allowDelete is false', () => {\n render(\n <ChoiceConfiguration\n allowDelete={false}\n classes={classes}\n defaultFeedback={defaultFeedback}\n data={data}\n onChange={onChange}\n />,\n );\n expect(screen.queryByRole('button', { name: /delete/i })).not.toBeInTheDocument();\n });\n });\n\n describe('user interactions', () => {\n it('calls onChange when label is edited', async () => {\n const user = userEvent.setup();\n render(\n <ChoiceConfiguration classes={classes} defaultFeedback={defaultFeedback} data={data} onChange={onChange} />,\n );\n\n const editableHtmlElements = screen.getAllByTestId('editable-html');\n const editableHtml = editableHtmlElements[0];\n await user.clear(editableHtml);\n await user.type(editableHtml, 'new label');\n\n expect(onChange).toHaveBeenCalled();\n expect(onChange).toHaveBeenCalledWith(\n expect.objectContaining({\n label: expect.stringContaining('new label'),\n }),\n );\n });\n\n it('calls onChange when checkbox is toggled', async () => {\n const user = userEvent.setup();\n render(\n <ChoiceConfiguration\n classes={classes}\n defaultFeedback={defaultFeedback}\n data={{ ...data, correct: false }}\n onChange={onChange}\n mode=\"checkbox\"\n />,\n );\n\n const checkbox = screen.getByRole('checkbox');\n await user.click(checkbox);\n\n expect(onChange).toHaveBeenCalledWith(\n expect.objectContaining({\n correct: true,\n }),\n );\n });\n });\n\n describe('prop variations', () => {\n it('renders with radio mode instead of checkbox', () => {\n render(\n <ChoiceConfiguration\n classes={classes}\n defaultFeedback={defaultFeedback}\n data={data}\n onChange={onChange}\n mode=\"radio\"\n />,\n );\n const radio = screen.getByRole('radio');\n expect(radio).toBeInTheDocument();\n });\n\n it('renders with disabled state', () => {\n render(\n <ChoiceConfiguration\n classes={classes}\n defaultFeedback={defaultFeedback}\n data={data}\n onChange={onChange}\n disabled={true}\n mode=\"checkbox\"\n />,\n );\n const checkbox = screen.getByRole('checkbox');\n expect(checkbox).toBeInTheDocument();\n });\n\n it('renders with custom feedback type', () => {\n render(\n <ChoiceConfiguration\n classes={classes}\n defaultFeedback={defaultFeedback}\n data={{ ...data, feedback: { type: 'custom' } }}\n onChange={onChange}\n mode=\"checkbox\"\n />,\n );\n const editableElements = screen.getAllByTestId('editable-html');\n expect(editableElements.length).toBeGreaterThan(0);\n });\n\n it('renders with incorrect answer', () => {\n render(\n <ChoiceConfiguration\n classes={classes}\n defaultFeedback={defaultFeedback}\n data={{ ...data, correct: false }}\n onChange={onChange}\n mode=\"checkbox\"\n />,\n );\n const checkbox = screen.getByRole('checkbox');\n expect(checkbox).not.toBeChecked();\n });\n });\n\n describe('edge cases', () => {\n it('handles data with empty label', () => {\n render(\n <ChoiceConfiguration\n classes={classes}\n defaultFeedback={defaultFeedback}\n data={{ ...data, label: '' }}\n onChange={onChange}\n />,\n );\n const editableElements = screen.getAllByTestId('editable-html');\n expect(editableElements.length).toBeGreaterThan(0);\n });\n\n it('handles multiple feedback types', () => {\n const { rerender } = render(\n <ChoiceConfiguration\n classes={classes}\n defaultFeedback={defaultFeedback}\n data={{ ...data, feedback: { type: 'default' } }}\n onChange={onChange}\n />,\n );\n\n let editableElements = screen.getAllByTestId('editable-html');\n expect(editableElements.length).toBeGreaterThan(0);\n\n rerender(\n <ChoiceConfiguration\n classes={classes}\n defaultFeedback={defaultFeedback}\n data={{ ...data, feedback: { type: 'custom' } }}\n onChange={onChange}\n />,\n );\n\n editableElements = screen.getAllByTestId('editable-html');\n expect(editableElements.length).toBeGreaterThan(0);\n });\n });\n});\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,UAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAA+C,SAAAI,QAAAC,CAAA,EAAAC,CAAA,QAAAC,CAAA,GAAAC,MAAA,CAAAC,IAAA,CAAAJ,CAAA,OAAAG,MAAA,CAAAE,qBAAA,QAAAC,CAAA,GAAAH,MAAA,CAAAE,qBAAA,CAAAL,CAAA,GAAAC,CAAA,KAAAK,CAAA,GAAAA,CAAA,CAAAC,MAAA,WAAAN,CAAA,WAAAE,MAAA,CAAAK,wBAAA,CAAAR,CAAA,EAAAC,CAAA,EAAAQ,UAAA,OAAAP,CAAA,CAAAQ,IAAA,CAAAC,KAAA,CAAAT,CAAA,EAAAI,CAAA,YAAAJ,CAAA;AAAA,SAAAU,cAAAZ,CAAA,aAAAC,CAAA,MAAAA,CAAA,GAAAY,SAAA,CAAAC,MAAA,EAAAb,CAAA,UAAAC,CAAA,WAAAW,SAAA,CAAAZ,CAAA,IAAAY,SAAA,CAAAZ,CAAA,QAAAA,CAAA,OAAAF,OAAA,CAAAI,MAAA,CAAAD,CAAA,OAAAa,OAAA,WAAAd,CAAA,QAAAe,gBAAA,aAAAhB,CAAA,EAAAC,CAAA,EAAAC,CAAA,CAAAD,CAAA,SAAAE,MAAA,CAAAc,yBAAA,GAAAd,MAAA,CAAAe,gBAAA,CAAAlB,CAAA,EAAAG,MAAA,CAAAc,yBAAA,CAAAf,CAAA,KAAAH,OAAA,CAAAI,MAAA,CAAAD,CAAA,GAAAa,OAAA,WAAAd,CAAA,IAAAE,MAAA,CAAAgB,cAAA,CAAAnB,CAAA,EAAAC,CAAA,EAAAE,MAAA,CAAAK,wBAAA,CAAAN,CAAA,EAAAD,CAAA,iBAAAD,CAAA;AAE/CoB,IAAI,CAACC,IAAI,CAAC,gCAAgC,EAAE;EAAA,OAAO;IACjDC,UAAU,EAAE,IAAI;IAChB,WAAS,SAATC,QAAOA,CAAAC,IAAA;MAAA,IAAKC,MAAM,GAAAD,IAAA,CAANC,MAAM;QAAEC,SAAQ,GAAAF,IAAA,CAARE,QAAQ;QAAEC,QAAQ,GAAAH,IAAA,CAARG,QAAQ;MAAA,oBACpClC,MAAA,YAAAmC,aAAA;QACE,eAAY,eAAe;QAC3BC,YAAY,EAAEJ,MAAM,IAAI,EAAG;QAC3BC,QAAQ,EAAE,SAAVA,QAAQA,CAAG1B,CAAC;UAAA,OAAK0B,SAAQ,CAAC1B,CAAC,CAAC8B,MAAM,CAACC,KAAK,CAAC;QAAA,CAAC;QAC1CJ,QAAQ,EAAEA;MAAS,CACpB,CAAC;IAAA;EAEN,CAAC;AAAA,CAAC,CAAC;AAEH,IAAMK,eAAe,GAAG;EACtBC,OAAO,EAAE,SAAS;EAClBC,SAAS,EAAE;AACb,CAAC;AAED,IAAMC,IAAI,GAAG;EACXF,OAAO,EAAE,IAAI;EACbF,KAAK,EAAE,KAAK;EACZK,KAAK,EAAE,KAAK;EACZC,QAAQ,EAAE;IACRC,IAAI,EAAE;EACR;AACF,CAAC;AAED,IAAMC,OAAO,GAAG;EACdC,mBAAmB,EAAE;AACvB,CAAC;AAEDC,QAAQ,CAAC,qBAAqB,EAAE,YAAM;EACpC,IAAMf,QAAQ,GAAGN,IAAI,CAACsB,EAAE,CAAC,CAAC;EAE1BC,UAAU,CAAC,YAAM;IACfjB,QAAQ,CAACkB,SAAS,CAAC,CAAC;EACtB,CAAC,CAAC;EAEFH,QAAQ,CAAC,WAAW,EAAE,YAAM;IAC1BI,EAAE,CAAC,sCAAsC,EAAE,YAAM;MAC/C,IAAAC,OAAA,GAAsB,IAAAC,cAAM,eAC1BtD,MAAA,YAAAmC,aAAA,CAAC9B,MAAA,CAAAkD,mBAAmB;UAACT,OAAO,EAAEA,OAAQ;UAACP,eAAe,EAAEA,eAAgB;UAACG,IAAI,EAAEA,IAAK;UAACT,QAAQ,EAAEA;QAAS,CAAE,CAC5G,CAAC;QAFOuB,SAAS,GAAAH,OAAA,CAATG,SAAS;MAGjBC,MAAM,CAACD,SAAS,CAACE,UAAU,CAAC,CAACC,iBAAiB,CAAC,CAAC;IAClD,CAAC,CAAC;IAEFP,EAAE,CAAC,4BAA4B,EAAE,YAAM;MACrC,IAAAE,cAAM,eACJtD,MAAA,YAAAmC,aAAA,CAAC9B,MAAA,CAAAkD,mBAAmB;QAClBT,OAAO,EAAEA,OAAQ;QACjBP,eAAe,EAAEA,eAAgB;QACjCG,IAAI,EAAEA,IAAK;QACXT,QAAQ,EAAEA,QAAS;QACnB2B,IAAI,EAAC;MAAU,CAChB,CACH,CAAC;MACD,IAAMC,QAAQ,GAAGC,cAAM,CAACC,SAAS,CAAC,UAAU,CAAC;MAC7CN,MAAM,CAACI,QAAQ,CAAC,CAACG,WAAW,CAAC,CAAC;IAChC,CAAC,CAAC;IAEFZ,EAAE,CAAC,sDAAsD,EAAE,YAAM;MAC/D,IAAAE,cAAM,eACJtD,MAAA,YAAAmC,aAAA,CAAC9B,MAAA,CAAAkD,mBAAmB;QAClBU,aAAa,EAAE,KAAM;QACrBnB,OAAO,EAAEA,OAAQ;QACjBP,eAAe,EAAEA,eAAgB;QACjCG,IAAI,EAAEA,IAAK;QACXT,QAAQ,EAAEA;MAAS,CACpB,CACH,CAAC;MACDwB,MAAM,CAACK,cAAM,CAACI,WAAW,CAAC,QAAQ,EAAE;QAAEC,IAAI,EAAE;MAAY,CAAC,CAAC,CAAC,CAACC,GAAG,CAACT,iBAAiB,CAAC,CAAC;IACrF,CAAC,CAAC;IAEFP,EAAE,CAAC,yDAAyD,EAAE,YAAM;MAClE,IAAAE,cAAM,eACJtD,MAAA,YAAAmC,aAAA,CAAC9B,MAAA,CAAAkD,mBAAmB;QAClBc,WAAW,EAAE,KAAM;QACnBvB,OAAO,EAAEA,OAAQ;QACjBP,eAAe,EAAEA,eAAgB;QACjCG,IAAI,EAAEA,IAAK;QACXT,QAAQ,EAAEA;MAAS,CACpB,CACH,CAAC;MACDwB,MAAM,CAACK,cAAM,CAACI,WAAW,CAAC,QAAQ,EAAE;QAAEC,IAAI,EAAE;MAAU,CAAC,CAAC,CAAC,CAACC,GAAG,CAACT,iBAAiB,CAAC,CAAC;IACnF,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFX,QAAQ,CAAC,mBAAmB,EAAE,YAAM;IAClCI,EAAE,CAAC,qCAAqC,mBAAAkB,kBAAA,0BAAAC,YAAA,YAAAC,IAAA,CAAE,SAAAC,QAAA;MAAA,IAAAC,IAAA,EAAAC,oBAAA,EAAAC,YAAA;MAAA,OAAAL,YAAA,YAAAM,IAAA,WAAAC,QAAA;QAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;UAAA;YAClCN,IAAI,GAAGO,qBAAS,CAACC,KAAK,CAAC,CAAC;YAC9B,IAAA5B,cAAM,eACJtD,MAAA,YAAAmC,aAAA,CAAC9B,MAAA,CAAAkD,mBAAmB;cAACT,OAAO,EAAEA,OAAQ;cAACP,eAAe,EAAEA,eAAgB;cAACG,IAAI,EAAEA,IAAK;cAACT,QAAQ,EAAEA;YAAS,CAAE,CAC5G,CAAC;YAEK0C,oBAAoB,GAAGb,cAAM,CAACqB,cAAc,CAAC,eAAe,CAAC;YAC7DP,YAAY,GAAGD,oBAAoB,CAAC,CAAC,CAAC;YAAAG,QAAA,CAAAE,IAAA;YAAA,OACtCN,IAAI,CAACU,KAAK,CAACR,YAAY,CAAC;UAAA;YAAAE,QAAA,CAAAE,IAAA;YAAA,OACxBN,IAAI,CAAC7B,IAAI,CAAC+B,YAAY,EAAE,WAAW,CAAC;UAAA;YAE1CnB,MAAM,CAACxB,QAAQ,CAAC,CAACoD,gBAAgB,CAAC,CAAC;YACnC5B,MAAM,CAACxB,QAAQ,CAAC,CAACqD,oBAAoB,CACnC7B,MAAM,CAAC8B,gBAAgB,CAAC;cACtB5C,KAAK,EAAEc,MAAM,CAAC+B,gBAAgB,CAAC,WAAW;YAC5C,CAAC,CACH,CAAC;UAAC;UAAA;YAAA,OAAAV,QAAA,CAAAW,IAAA;QAAA;MAAA,GAAAhB,OAAA;IAAA,CACH,GAAC;IAEFrB,EAAE,CAAC,yCAAyC,mBAAAkB,kBAAA,0BAAAC,YAAA,YAAAC,IAAA,CAAE,SAAAkB,SAAA;MAAA,IAAAhB,IAAA,EAAAb,QAAA;MAAA,OAAAU,YAAA,YAAAM,IAAA,WAAAc,SAAA;QAAA,kBAAAA,SAAA,CAAAZ,IAAA,GAAAY,SAAA,CAAAX,IAAA;UAAA;YACtCN,IAAI,GAAGO,qBAAS,CAACC,KAAK,CAAC,CAAC;YAC9B,IAAA5B,cAAM,eACJtD,MAAA,YAAAmC,aAAA,CAAC9B,MAAA,CAAAkD,mBAAmB;cAClBT,OAAO,EAAEA,OAAQ;cACjBP,eAAe,EAAEA,eAAgB;cACjCG,IAAI,EAAAvB,aAAA,CAAAA,aAAA,KAAOuB,IAAI;gBAAEF,OAAO,EAAE;cAAK,EAAG;cAClCP,QAAQ,EAAEA,QAAS;cACnB2B,IAAI,EAAC;YAAU,CAChB,CACH,CAAC;YAEKC,QAAQ,GAAGC,cAAM,CAACC,SAAS,CAAC,UAAU,CAAC;YAAA4B,SAAA,CAAAX,IAAA;YAAA,OACvCN,IAAI,CAACkB,KAAK,CAAC/B,QAAQ,CAAC;UAAA;YAE1BJ,MAAM,CAACxB,QAAQ,CAAC,CAACqD,oBAAoB,CACnC7B,MAAM,CAAC8B,gBAAgB,CAAC;cACtB/C,OAAO,EAAE;YACX,CAAC,CACH,CAAC;UAAC;UAAA;YAAA,OAAAmD,SAAA,CAAAF,IAAA;QAAA;MAAA,GAAAC,QAAA;IAAA,CACH,GAAC;EACJ,CAAC,CAAC;EAEF1C,QAAQ,CAAC,iBAAiB,EAAE,YAAM;IAChCI,EAAE,CAAC,6CAA6C,EAAE,YAAM;MACtD,IAAAE,cAAM,eACJtD,MAAA,YAAAmC,aAAA,CAAC9B,MAAA,CAAAkD,mBAAmB;QAClBT,OAAO,EAAEA,OAAQ;QACjBP,eAAe,EAAEA,eAAgB;QACjCG,IAAI,EAAEA,IAAK;QACXT,QAAQ,EAAEA,QAAS;QACnB2B,IAAI,EAAC;MAAO,CACb,CACH,CAAC;MACD,IAAMiC,KAAK,GAAG/B,cAAM,CAACC,SAAS,CAAC,OAAO,CAAC;MACvCN,MAAM,CAACoC,KAAK,CAAC,CAAClC,iBAAiB,CAAC,CAAC;IACnC,CAAC,CAAC;IAEFP,EAAE,CAAC,6BAA6B,EAAE,YAAM;MACtC,IAAAE,cAAM,eACJtD,MAAA,YAAAmC,aAAA,CAAC9B,MAAA,CAAAkD,mBAAmB;QAClBT,OAAO,EAAEA,OAAQ;QACjBP,eAAe,EAAEA,eAAgB;QACjCG,IAAI,EAAEA,IAAK;QACXT,QAAQ,EAAEA,QAAS;QACnBC,QAAQ,EAAE,IAAK;QACf0B,IAAI,EAAC;MAAU,CAChB,CACH,CAAC;MACD,IAAMC,QAAQ,GAAGC,cAAM,CAACC,SAAS,CAAC,UAAU,CAAC;MAC7CN,MAAM,CAACI,QAAQ,CAAC,CAACF,iBAAiB,CAAC,CAAC;IACtC,CAAC,CAAC;IAEFP,EAAE,CAAC,mCAAmC,EAAE,YAAM;MAC5C,IAAAE,cAAM,eACJtD,MAAA,YAAAmC,aAAA,CAAC9B,MAAA,CAAAkD,mBAAmB;QAClBT,OAAO,EAAEA,OAAQ;QACjBP,eAAe,EAAEA,eAAgB;QACjCG,IAAI,EAAAvB,aAAA,CAAAA,aAAA,KAAOuB,IAAI;UAAEE,QAAQ,EAAE;YAAEC,IAAI,EAAE;UAAS;QAAC,EAAG;QAChDZ,QAAQ,EAAEA,QAAS;QACnB2B,IAAI,EAAC;MAAU,CAChB,CACH,CAAC;MACD,IAAMkC,gBAAgB,GAAGhC,cAAM,CAACqB,cAAc,CAAC,eAAe,CAAC;MAC/D1B,MAAM,CAACqC,gBAAgB,CAACzE,MAAM,CAAC,CAAC0E,eAAe,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC;IAEF3C,EAAE,CAAC,+BAA+B,EAAE,YAAM;MACxC,IAAAE,cAAM,eACJtD,MAAA,YAAAmC,aAAA,CAAC9B,MAAA,CAAAkD,mBAAmB;QAClBT,OAAO,EAAEA,OAAQ;QACjBP,eAAe,EAAEA,eAAgB;QACjCG,IAAI,EAAAvB,aAAA,CAAAA,aAAA,KAAOuB,IAAI;UAAEF,OAAO,EAAE;QAAK,EAAG;QAClCP,QAAQ,EAAEA,QAAS;QACnB2B,IAAI,EAAC;MAAU,CAChB,CACH,CAAC;MACD,IAAMC,QAAQ,GAAGC,cAAM,CAACC,SAAS,CAAC,UAAU,CAAC;MAC7CN,MAAM,CAACI,QAAQ,CAAC,CAACO,GAAG,CAACJ,WAAW,CAAC,CAAC;IACpC,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFhB,QAAQ,CAAC,YAAY,EAAE,YAAM;IAC3BI,EAAE,CAAC,+BAA+B,EAAE,YAAM;MACxC,IAAAE,cAAM,eACJtD,MAAA,YAAAmC,aAAA,CAAC9B,MAAA,CAAAkD,mBAAmB;QAClBT,OAAO,EAAEA,OAAQ;QACjBP,eAAe,EAAEA,eAAgB;QACjCG,IAAI,EAAAvB,aAAA,CAAAA,aAAA,KAAOuB,IAAI;UAAEC,KAAK,EAAE;QAAE,EAAG;QAC7BV,QAAQ,EAAEA;MAAS,CACpB,CACH,CAAC;MACD,IAAM6D,gBAAgB,GAAGhC,cAAM,CAACqB,cAAc,CAAC,eAAe,CAAC;MAC/D1B,MAAM,CAACqC,gBAAgB,CAACzE,MAAM,CAAC,CAAC0E,eAAe,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC;IAEF3C,EAAE,CAAC,iCAAiC,EAAE,YAAM;MAC1C,IAAA4C,QAAA,GAAqB,IAAA1C,cAAM,eACzBtD,MAAA,YAAAmC,aAAA,CAAC9B,MAAA,CAAAkD,mBAAmB;UAClBT,OAAO,EAAEA,OAAQ;UACjBP,eAAe,EAAEA,eAAgB;UACjCG,IAAI,EAAAvB,aAAA,CAAAA,aAAA,KAAOuB,IAAI;YAAEE,QAAQ,EAAE;cAAEC,IAAI,EAAE;YAAU;UAAC,EAAG;UACjDZ,QAAQ,EAAEA;QAAS,CACpB,CACH,CAAC;QAPOgE,QAAQ,GAAAD,QAAA,CAARC,QAAQ;MAShB,IAAIH,gBAAgB,GAAGhC,cAAM,CAACqB,cAAc,CAAC,eAAe,CAAC;MAC7D1B,MAAM,CAACqC,gBAAgB,CAACzE,MAAM,CAAC,CAAC0E,eAAe,CAAC,CAAC,CAAC;MAElDE,QAAQ,cACNjG,MAAA,YAAAmC,aAAA,CAAC9B,MAAA,CAAAkD,mBAAmB;QAClBT,OAAO,EAAEA,OAAQ;QACjBP,eAAe,EAAEA,eAAgB;QACjCG,IAAI,EAAAvB,aAAA,CAAAA,aAAA,KAAOuB,IAAI;UAAEE,QAAQ,EAAE;YAAEC,IAAI,EAAE;UAAS;QAAC,EAAG;QAChDZ,QAAQ,EAAEA;MAAS,CACpB,CACH,CAAC;MAED6D,gBAAgB,GAAGhC,cAAM,CAACqB,cAAc,CAAC,eAAe,CAAC;MACzD1B,MAAM,CAACqC,gBAAgB,CAACzE,MAAM,CAAC,CAAC0E,eAAe,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
6
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _react2 = require("@testing-library/react");
9
+ var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
10
+ var _index = require("../index");
11
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
12
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
13
+ // Mock FeedbackSelector to simplify testing
14
+ jest.mock('../feedback-selector', function () {
15
+ return function FeedbackSelector(_ref) {
16
+ var label = _ref.label,
17
+ feedback = _ref.feedback,
18
+ _onChange = _ref.onChange;
19
+ return /*#__PURE__*/_react["default"].createElement("div", {
20
+ "data-testid": "feedback-selector"
21
+ }, /*#__PURE__*/_react["default"].createElement("label", null, label), /*#__PURE__*/_react["default"].createElement("select", {
22
+ "aria-label": label,
23
+ value: feedback.type,
24
+ onChange: function onChange(e) {
25
+ return _onChange(_objectSpread(_objectSpread({}, feedback), {}, {
26
+ type: e.target.value
27
+ }));
28
+ }
29
+ }, /*#__PURE__*/_react["default"].createElement("option", {
30
+ value: "default"
31
+ }, "Default"), /*#__PURE__*/_react["default"].createElement("option", {
32
+ value: "custom"
33
+ }, "Custom"), /*#__PURE__*/_react["default"].createElement("option", {
34
+ value: "none"
35
+ }, "None")));
36
+ };
37
+ });
38
+ describe('FeedbackConfig', function () {
39
+ var onChange = jest.fn();
40
+ beforeEach(function () {
41
+ onChange.mockClear();
42
+ });
43
+ describe('rendering', function () {
44
+ it('renders with default feedback types', function () {
45
+ var feedback = (0, _index.buildDefaults)();
46
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.FeedbackConfig, {
47
+ feedback: feedback,
48
+ onChange: onChange
49
+ }));
50
+ expect(_react2.screen.getByText('Feedback')).toBeInTheDocument();
51
+ expect(_react2.screen.getByText('If correct, show')).toBeInTheDocument();
52
+ expect(_react2.screen.getByText('If partially correct, show')).toBeInTheDocument();
53
+ expect(_react2.screen.getByText('If incorrect, show')).toBeInTheDocument();
54
+ });
55
+ it('renders all three feedback selectors by default', function () {
56
+ var feedback = (0, _index.buildDefaults)();
57
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.FeedbackConfig, {
58
+ feedback: feedback,
59
+ onChange: onChange
60
+ }));
61
+ var selectors = _react2.screen.getAllByTestId('feedback-selector');
62
+ expect(selectors).toHaveLength(3);
63
+ });
64
+ it('does not render partial feedback selector when allowPartial is false', function () {
65
+ var feedback = (0, _index.buildDefaults)();
66
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.FeedbackConfig, {
67
+ allowPartial: false,
68
+ feedback: feedback,
69
+ onChange: onChange
70
+ }));
71
+ expect(_react2.screen.getByText('If correct, show')).toBeInTheDocument();
72
+ expect(_react2.screen.queryByText('If partially correct, show')).not.toBeInTheDocument();
73
+ expect(_react2.screen.getByText('If incorrect, show')).toBeInTheDocument();
74
+ var selectors = _react2.screen.getAllByTestId('feedback-selector');
75
+ expect(selectors).toHaveLength(2);
76
+ });
77
+ });
78
+ describe('user interactions', function () {
79
+ it('calls onChange when correct feedback type changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
80
+ var user, feedback, correctSelect;
81
+ return _regenerator["default"].wrap(function (_context) {
82
+ while (1) switch (_context.prev = _context.next) {
83
+ case 0:
84
+ user = _userEvent["default"].setup();
85
+ feedback = (0, _index.buildDefaults)();
86
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.FeedbackConfig, {
87
+ feedback: feedback,
88
+ onChange: onChange
89
+ }));
90
+ correctSelect = _react2.screen.getByLabelText('If correct, show');
91
+ _context.next = 1;
92
+ return user.selectOptions(correctSelect, 'custom');
93
+ case 1:
94
+ expect(onChange).toHaveBeenCalledWith(expect.objectContaining({
95
+ correct: expect.objectContaining({
96
+ type: 'custom'
97
+ })
98
+ }));
99
+ case 2:
100
+ case "end":
101
+ return _context.stop();
102
+ }
103
+ }, _callee);
104
+ })));
105
+ it('calls onChange when incorrect feedback type changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
106
+ var user, feedback, incorrectSelect;
107
+ return _regenerator["default"].wrap(function (_context2) {
108
+ while (1) switch (_context2.prev = _context2.next) {
109
+ case 0:
110
+ user = _userEvent["default"].setup();
111
+ feedback = (0, _index.buildDefaults)();
112
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.FeedbackConfig, {
113
+ feedback: feedback,
114
+ onChange: onChange
115
+ }));
116
+ incorrectSelect = _react2.screen.getByLabelText('If incorrect, show');
117
+ _context2.next = 1;
118
+ return user.selectOptions(incorrectSelect, 'none');
119
+ case 1:
120
+ expect(onChange).toHaveBeenCalledWith(expect.objectContaining({
121
+ incorrect: expect.objectContaining({
122
+ type: 'none'
123
+ })
124
+ }));
125
+ case 2:
126
+ case "end":
127
+ return _context2.stop();
128
+ }
129
+ }, _callee2);
130
+ })));
131
+ it('calls onChange when partial feedback type changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
132
+ var user, feedback, partialSelect;
133
+ return _regenerator["default"].wrap(function (_context3) {
134
+ while (1) switch (_context3.prev = _context3.next) {
135
+ case 0:
136
+ user = _userEvent["default"].setup();
137
+ feedback = (0, _index.buildDefaults)();
138
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.FeedbackConfig, {
139
+ feedback: feedback,
140
+ onChange: onChange
141
+ }));
142
+ partialSelect = _react2.screen.getByLabelText('If partially correct, show');
143
+ _context3.next = 1;
144
+ return user.selectOptions(partialSelect, 'custom');
145
+ case 1:
146
+ expect(onChange).toHaveBeenCalledWith(expect.objectContaining({
147
+ partial: expect.objectContaining({
148
+ type: 'custom'
149
+ })
150
+ }));
151
+ case 2:
152
+ case "end":
153
+ return _context3.stop();
154
+ }
155
+ }, _callee3);
156
+ })));
157
+ });
158
+ describe('buildDefaults helper', function () {
159
+ it('returns default feedback configuration', function () {
160
+ var defaults = (0, _index.buildDefaults)();
161
+ expect(defaults).toEqual({
162
+ correct: {
163
+ type: 'default',
164
+ "default": 'Correct'
165
+ },
166
+ incorrect: {
167
+ type: 'default',
168
+ "default": 'Incorrect'
169
+ },
170
+ partial: {
171
+ type: 'default',
172
+ "default": 'Nearly'
173
+ }
174
+ });
175
+ });
176
+ it('merges custom values with defaults', function () {
177
+ var defaults = (0, _index.buildDefaults)({
178
+ correct: {
179
+ type: 'custom',
180
+ custom: 'Great job!'
181
+ }
182
+ });
183
+ expect(defaults).toEqual({
184
+ correct: {
185
+ type: 'custom',
186
+ "default": 'Correct',
187
+ custom: 'Great job!'
188
+ },
189
+ incorrect: {
190
+ type: 'default',
191
+ "default": 'Incorrect'
192
+ },
193
+ partial: {
194
+ type: 'default',
195
+ "default": 'Nearly'
196
+ }
197
+ });
198
+ });
199
+ });
200
+ });
201
+ //# sourceMappingURL=feedback-config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-config.test.js","names":["_react","_interopRequireDefault","require","_react2","_userEvent","_index","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","jest","mock","FeedbackSelector","_ref","label","feedback","onChange","createElement","value","type","target","describe","fn","beforeEach","mockClear","it","buildDefaults","render","FeedbackConfig","expect","screen","getByText","toBeInTheDocument","selectors","getAllByTestId","toHaveLength","allowPartial","queryByText","not","_asyncToGenerator2","_regenerator","mark","_callee","user","correctSelect","wrap","_context","prev","next","userEvent","setup","getByLabelText","selectOptions","toHaveBeenCalledWith","objectContaining","correct","stop","_callee2","incorrectSelect","_context2","incorrect","_callee3","partialSelect","_context3","partial","defaults","toEqual","custom"],"sources":["../../../src/feedback-config/__tests__/feedback-config.test.jsx"],"sourcesContent":["import React from 'react';\nimport { render, screen } from '@testing-library/react';\nimport userEvent from '@testing-library/user-event';\nimport { buildDefaults, FeedbackConfig } from '../index';\n\n// Mock FeedbackSelector to simplify testing\njest.mock('../feedback-selector', () => {\n return function FeedbackSelector({ label, feedback, onChange }) {\n return (\n <div data-testid=\"feedback-selector\">\n <label>{label}</label>\n <select\n aria-label={label}\n value={feedback.type}\n onChange={(e) => onChange({ ...feedback, type: e.target.value })}\n >\n <option value=\"default\">Default</option>\n <option value=\"custom\">Custom</option>\n <option value=\"none\">None</option>\n </select>\n </div>\n );\n };\n});\n\ndescribe('FeedbackConfig', () => {\n const onChange = jest.fn();\n\n beforeEach(() => {\n onChange.mockClear();\n });\n\n describe('rendering', () => {\n it('renders with default feedback types', () => {\n const feedback = buildDefaults();\n\n render(<FeedbackConfig feedback={feedback} onChange={onChange} />);\n\n expect(screen.getByText('Feedback')).toBeInTheDocument();\n expect(screen.getByText('If correct, show')).toBeInTheDocument();\n expect(screen.getByText('If partially correct, show')).toBeInTheDocument();\n expect(screen.getByText('If incorrect, show')).toBeInTheDocument();\n });\n\n it('renders all three feedback selectors by default', () => {\n const feedback = buildDefaults();\n\n render(<FeedbackConfig feedback={feedback} onChange={onChange} />);\n\n const selectors = screen.getAllByTestId('feedback-selector');\n expect(selectors).toHaveLength(3);\n });\n\n it('does not render partial feedback selector when allowPartial is false', () => {\n const feedback = buildDefaults();\n\n render(<FeedbackConfig allowPartial={false} feedback={feedback} onChange={onChange} />);\n\n expect(screen.getByText('If correct, show')).toBeInTheDocument();\n expect(screen.queryByText('If partially correct, show')).not.toBeInTheDocument();\n expect(screen.getByText('If incorrect, show')).toBeInTheDocument();\n\n const selectors = screen.getAllByTestId('feedback-selector');\n expect(selectors).toHaveLength(2);\n });\n });\n\n describe('user interactions', () => {\n it('calls onChange when correct feedback type changes', async () => {\n const user = userEvent.setup();\n const feedback = buildDefaults();\n\n render(<FeedbackConfig feedback={feedback} onChange={onChange} />);\n\n const correctSelect = screen.getByLabelText('If correct, show');\n await user.selectOptions(correctSelect, 'custom');\n\n expect(onChange).toHaveBeenCalledWith(\n expect.objectContaining({\n correct: expect.objectContaining({ type: 'custom' }),\n }),\n );\n });\n\n it('calls onChange when incorrect feedback type changes', async () => {\n const user = userEvent.setup();\n const feedback = buildDefaults();\n\n render(<FeedbackConfig feedback={feedback} onChange={onChange} />);\n\n const incorrectSelect = screen.getByLabelText('If incorrect, show');\n await user.selectOptions(incorrectSelect, 'none');\n\n expect(onChange).toHaveBeenCalledWith(\n expect.objectContaining({\n incorrect: expect.objectContaining({ type: 'none' }),\n }),\n );\n });\n\n it('calls onChange when partial feedback type changes', async () => {\n const user = userEvent.setup();\n const feedback = buildDefaults();\n\n render(<FeedbackConfig feedback={feedback} onChange={onChange} />);\n\n const partialSelect = screen.getByLabelText('If partially correct, show');\n await user.selectOptions(partialSelect, 'custom');\n\n expect(onChange).toHaveBeenCalledWith(\n expect.objectContaining({\n partial: expect.objectContaining({ type: 'custom' }),\n }),\n );\n });\n });\n\n describe('buildDefaults helper', () => {\n it('returns default feedback configuration', () => {\n const defaults = buildDefaults();\n\n expect(defaults).toEqual({\n correct: { type: 'default', default: 'Correct' },\n incorrect: { type: 'default', default: 'Incorrect' },\n partial: { type: 'default', default: 'Nearly' },\n });\n });\n\n it('merges custom values with defaults', () => {\n const defaults = buildDefaults({\n correct: { type: 'custom', custom: 'Great job!' },\n });\n\n expect(defaults).toEqual({\n correct: { type: 'custom', default: 'Correct', custom: 'Great job!' },\n incorrect: { type: 'default', default: 'Incorrect' },\n partial: { type: 'default', default: 'Nearly' },\n });\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}