Package not found. Please check the package name and try again.

@pie-lib/config-ui 13.0.12 → 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 -38
  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":"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","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":[]}