@pie-lib/mask-markup 1.33.3-next.0 → 1.33.3-next.162
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -67
- package/esm/package.json +3 -0
- package/lib/choices/choice.js +98 -203
- package/lib/choices/choice.js.map +1 -1
- package/lib/choices/index.js +21 -53
- package/lib/choices/index.js.map +1 -1
- package/lib/componentize.js +1 -5
- package/lib/componentize.js.map +1 -1
- package/lib/components/blank.js +303 -361
- package/lib/components/blank.js.map +1 -1
- package/lib/components/correct-input.js +41 -65
- package/lib/components/correct-input.js.map +1 -1
- package/lib/components/dropdown.js +218 -257
- package/lib/components/dropdown.js.map +1 -1
- package/lib/components/input.js +10 -17
- package/lib/components/input.js.map +1 -1
- package/lib/constructed-response.js +38 -52
- package/lib/constructed-response.js.map +1 -1
- package/lib/customizable.js +5 -9
- package/lib/customizable.js.map +1 -1
- package/lib/drag-in-the-blank.js +140 -105
- package/lib/drag-in-the-blank.js.map +1 -1
- package/lib/index.js +0 -7
- package/lib/index.js.map +1 -1
- package/lib/inline-dropdown.js +4 -12
- package/lib/inline-dropdown.js.map +1 -1
- package/lib/mask.js +60 -118
- package/lib/mask.js.map +1 -1
- package/lib/serialization.js +8 -48
- package/lib/serialization.js.map +1 -1
- package/lib/with-mask.js +30 -58
- package/lib/with-mask.js.map +1 -1
- package/package.json +20 -12
- package/src/__tests__/drag-in-the-blank.test.js +66 -26
- package/src/__tests__/mask.test.js +147 -112
- package/src/__tests__/with-mask.test.js +44 -19
- package/src/choices/__tests__/index.test.js +38 -25
- package/src/choices/choice.jsx +86 -153
- package/src/choices/index.jsx +9 -3
- package/src/components/__tests__/blank.test.js +92 -156
- package/src/components/__tests__/correct-input.test.js +60 -19
- package/src/components/__tests__/dropdown.test.js +61 -19
- package/src/components/__tests__/input.test.js +72 -20
- package/src/components/blank.jsx +273 -272
- package/src/components/correct-input.jsx +33 -39
- package/src/components/dropdown.jsx +173 -161
- package/src/constructed-response.jsx +22 -18
- package/src/drag-in-the-blank.jsx +131 -42
- package/src/mask.jsx +38 -29
- package/src/with-mask.jsx +7 -4
- package/src/__tests__/__snapshots__/drag-in-the-blank.test.js.snap +0 -316
- package/src/__tests__/__snapshots__/mask.test.js.snap +0 -55
- package/src/__tests__/__snapshots__/with-mask.test.js.snap +0 -62
- package/src/choices/__tests__/__snapshots__/index.test.js.snap +0 -209
- package/src/components/__tests__/__snapshots__/blank.test.js.snap +0 -111
- package/src/components/__tests__/__snapshots__/correct-input.test.js.snap +0 -64
- package/src/components/__tests__/__snapshots__/dropdown.test.js.snap +0 -136
- package/src/components/__tests__/__snapshots__/input.test.js.snap +0 -34
package/lib/with-mask.js
CHANGED
|
@@ -1,85 +1,60 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.withMask = exports.buildLayoutFromMarkup = void 0;
|
|
9
|
-
|
|
10
8
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
11
|
-
|
|
12
9
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
13
|
-
|
|
14
|
-
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
15
|
-
|
|
16
10
|
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
17
|
-
|
|
18
11
|
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
19
|
-
|
|
12
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
20
13
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
21
|
-
|
|
22
14
|
var _react = _interopRequireDefault(require("react"));
|
|
23
|
-
|
|
24
|
-
var _reactDom = _interopRequireDefault(require("react-dom"));
|
|
25
|
-
|
|
26
15
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
27
|
-
|
|
28
16
|
var _mask = _interopRequireDefault(require("./mask"));
|
|
29
|
-
|
|
30
17
|
var _componentize2 = _interopRequireDefault(require("./componentize"));
|
|
31
|
-
|
|
32
18
|
var _serialization = require("./serialization");
|
|
33
|
-
|
|
34
|
-
function
|
|
35
|
-
|
|
36
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
37
|
-
|
|
38
|
-
var buildLayoutFromMarkup = function buildLayoutFromMarkup(markup, type) {
|
|
19
|
+
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
|
|
20
|
+
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
21
|
+
var buildLayoutFromMarkup = exports.buildLayoutFromMarkup = function buildLayoutFromMarkup(markup, type) {
|
|
39
22
|
var _componentize = (0, _componentize2["default"])(markup, type),
|
|
40
|
-
|
|
41
|
-
|
|
23
|
+
processed = _componentize.markup;
|
|
42
24
|
var value = (0, _serialization.deserialize)(processed);
|
|
43
25
|
return value.document;
|
|
44
26
|
};
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return _class = /*#__PURE__*/function (_React$Component) {
|
|
52
|
-
(0, _inherits2["default"])(WithMask, _React$Component);
|
|
53
|
-
|
|
54
|
-
var _super = _createSuper(WithMask);
|
|
55
|
-
|
|
56
|
-
function WithMask() {
|
|
27
|
+
var withMask = exports.withMask = function withMask(type, renderChildren) {
|
|
28
|
+
var _WithMask;
|
|
29
|
+
return _WithMask = /*#__PURE__*/function (_React$Component) {
|
|
30
|
+
function WithMask(props) {
|
|
31
|
+
var _this;
|
|
57
32
|
(0, _classCallCheck2["default"])(this, WithMask);
|
|
58
|
-
|
|
33
|
+
_this = _callSuper(this, WithMask, [props]);
|
|
34
|
+
_this.containerRef = /*#__PURE__*/_react["default"].createRef();
|
|
35
|
+
return _this;
|
|
59
36
|
}
|
|
60
|
-
|
|
61
|
-
(0, _createClass2["default"])(WithMask, [{
|
|
37
|
+
(0, _inherits2["default"])(WithMask, _React$Component);
|
|
38
|
+
return (0, _createClass2["default"])(WithMask, [{
|
|
62
39
|
key: "componentDidUpdate",
|
|
63
40
|
value: function componentDidUpdate(prevProps) {
|
|
64
41
|
if (this.props.markup !== prevProps.markup) {
|
|
65
|
-
|
|
66
|
-
var
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
var mathElements = domNode && domNode.querySelectorAll('[data-latex][data-math-handled="true"]'); // Clean up for fresh MathJax processing
|
|
42
|
+
var domNode = this.containerRef.current;
|
|
43
|
+
var mathElements = domNode && domNode.querySelectorAll('[data-latex][data-math-handled="true"]');
|
|
70
44
|
|
|
45
|
+
// Clean up for fresh MathJax processing
|
|
71
46
|
(mathElements || []).forEach(function (el) {
|
|
72
47
|
// Remove the MathJax container to allow for clean updates
|
|
73
48
|
var mjxContainer = el.querySelector('mjx-container');
|
|
74
|
-
|
|
75
49
|
if (mjxContainer) {
|
|
76
50
|
el.removeChild(mjxContainer);
|
|
77
|
-
}
|
|
78
|
-
|
|
51
|
+
}
|
|
79
52
|
|
|
53
|
+
// Update the innerHTML to match the raw LaTeX data, ensuring it is reprocessed correctly
|
|
80
54
|
var latexCode = el.getAttribute('data-raw');
|
|
81
|
-
el.innerHTML = latexCode;
|
|
55
|
+
el.innerHTML = latexCode;
|
|
82
56
|
|
|
57
|
+
// Remove the attribute to signal that MathJax should reprocess this element
|
|
83
58
|
el.removeAttribute('data-math-handled');
|
|
84
59
|
});
|
|
85
60
|
}
|
|
@@ -88,13 +63,14 @@ var withMask = function withMask(type, renderChildren) {
|
|
|
88
63
|
key: "render",
|
|
89
64
|
value: function render() {
|
|
90
65
|
var _this$props = this.props,
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
66
|
+
markup = _this$props.markup,
|
|
67
|
+
layout = _this$props.layout,
|
|
68
|
+
value = _this$props.value,
|
|
69
|
+
onChange = _this$props.onChange,
|
|
70
|
+
elementType = _this$props.elementType;
|
|
96
71
|
var maskLayout = layout ? layout : buildLayoutFromMarkup(markup, type);
|
|
97
72
|
return /*#__PURE__*/_react["default"].createElement(_mask["default"], {
|
|
73
|
+
containerRef: this.containerRef,
|
|
98
74
|
elementType: elementType,
|
|
99
75
|
layout: maskLayout,
|
|
100
76
|
value: value,
|
|
@@ -103,13 +79,11 @@ var withMask = function withMask(type, renderChildren) {
|
|
|
103
79
|
});
|
|
104
80
|
}
|
|
105
81
|
}]);
|
|
106
|
-
|
|
107
|
-
}(_react["default"].Component), (0, _defineProperty2["default"])(_class, "propTypes", {
|
|
82
|
+
}(_react["default"].Component), (0, _defineProperty2["default"])(_WithMask, "propTypes", {
|
|
108
83
|
/**
|
|
109
84
|
* At the start we'll probably work with markup
|
|
110
85
|
*/
|
|
111
86
|
markup: _propTypes["default"].string,
|
|
112
|
-
|
|
113
87
|
/**
|
|
114
88
|
* Once we start authoring, it may make sense for use to us layout, which will be a simple js object that maps to `slate.Value`.
|
|
115
89
|
*/
|
|
@@ -118,8 +92,6 @@ var withMask = function withMask(type, renderChildren) {
|
|
|
118
92
|
onChange: _propTypes["default"].func,
|
|
119
93
|
customMarkMarkupComponent: _propTypes["default"].func,
|
|
120
94
|
elementType: _propTypes["default"].string
|
|
121
|
-
}),
|
|
95
|
+
}), _WithMask;
|
|
122
96
|
};
|
|
123
|
-
|
|
124
|
-
exports.withMask = withMask;
|
|
125
97
|
//# sourceMappingURL=with-mask.js.map
|
package/lib/with-mask.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"with-mask.js","names":["_react","_interopRequireDefault","require","_propTypes","_mask","_componentize2","_serialization","_callSuper","t","o","e","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","Reflect","construct","constructor","apply","Boolean","prototype","valueOf","call","buildLayoutFromMarkup","exports","markup","type","_componentize","componentize","processed","value","deserialize","document","withMask","renderChildren","_WithMask","_React$Component","WithMask","props","_this","_classCallCheck2","containerRef","React","createRef","_inherits2","_createClass2","key","componentDidUpdate","prevProps","domNode","current","mathElements","querySelectorAll","forEach","el","mjxContainer","querySelector","removeChild","latexCode","getAttribute","innerHTML","removeAttribute","render","_this$props","layout","onChange","elementType","maskLayout","createElement","Component","_defineProperty2","PropTypes","string","object","func","customMarkMarkupComponent"],"sources":["../src/with-mask.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport Mask from './mask';\nimport componentize from './componentize';\nimport { deserialize } from './serialization';\n\nexport const buildLayoutFromMarkup = (markup, type) => {\n const { markup: processed } = componentize(markup, type);\n const value = deserialize(processed);\n return value.document;\n};\n\nexport const withMask = (type, renderChildren) => {\n return class WithMask extends React.Component {\n static propTypes = {\n /**\n * At the start we'll probably work with markup\n */\n markup: PropTypes.string,\n /**\n * Once we start authoring, it may make sense for use to us layout, which will be a simple js object that maps to `slate.Value`.\n */\n layout: PropTypes.object,\n value: PropTypes.object,\n onChange: PropTypes.func,\n customMarkMarkupComponent: PropTypes.func,\n elementType: PropTypes.string,\n };\n\n constructor(props) {\n super(props);\n this.containerRef = React.createRef();\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.markup !== prevProps.markup) {\n const domNode = this.containerRef.current;\n const mathElements = domNode && domNode.querySelectorAll('[data-latex][data-math-handled=\"true\"]');\n\n // Clean up for fresh MathJax processing\n (mathElements || []).forEach((el) => {\n // Remove the MathJax container to allow for clean updates\n const mjxContainer = el.querySelector('mjx-container');\n\n if (mjxContainer) {\n el.removeChild(mjxContainer);\n }\n\n // Update the innerHTML to match the raw LaTeX data, ensuring it is reprocessed correctly\n const latexCode = el.getAttribute('data-raw');\n el.innerHTML = latexCode;\n\n // Remove the attribute to signal that MathJax should reprocess this element\n el.removeAttribute('data-math-handled');\n });\n }\n }\n\n render() {\n const { markup, layout, value, onChange, elementType } = this.props;\n\n const maskLayout = layout ? layout : buildLayoutFromMarkup(markup, type);\n return (\n <Mask\n containerRef={this.containerRef}\n elementType={elementType}\n layout={maskLayout}\n value={value}\n onChange={onChange}\n renderChildren={renderChildren(this.props)}\n />\n );\n }\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-lib/mask-markup",
|
|
3
|
-
"version": "1.33.3-next.
|
|
3
|
+
"version": "1.33.3-next.162+b5949758",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "src/index.js",
|
|
@@ -8,20 +8,20 @@
|
|
|
8
8
|
"access": "public"
|
|
9
9
|
},
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@
|
|
12
|
-
"@
|
|
13
|
-
"@
|
|
14
|
-
"@
|
|
15
|
-
"@pie-lib/
|
|
16
|
-
"@pie-lib/
|
|
11
|
+
"@emotion/react": "^11.14.0",
|
|
12
|
+
"@emotion/style": "^0.8.0",
|
|
13
|
+
"@mui/icons-material": "^7.3.4",
|
|
14
|
+
"@mui/material": "^7.3.4",
|
|
15
|
+
"@pie-lib/drag": "2.22.3-next.155",
|
|
16
|
+
"@pie-lib/editable-html": "11.21.3-next.155",
|
|
17
|
+
"@pie-lib/math-rendering": "3.22.2-next.164",
|
|
18
|
+
"@pie-lib/render-ui": "4.35.3-next.155",
|
|
17
19
|
"classnames": "^2.2.6",
|
|
18
20
|
"debug": "^4.1.1",
|
|
19
|
-
"immutable": "^4.0.0-rc.12",
|
|
20
21
|
"lodash": "^4.17.11",
|
|
21
22
|
"prop-types": "^15.7.2",
|
|
22
|
-
"react": "^
|
|
23
|
-
"react-
|
|
24
|
-
"react-dom": "^16.9.0",
|
|
23
|
+
"react": "^18.2.0",
|
|
24
|
+
"react-dom": "^18.2.0",
|
|
25
25
|
"slate": "^0.36.2",
|
|
26
26
|
"slate-html-serializer": "^0.6.12",
|
|
27
27
|
"slate-prop-types": "^0.4.38",
|
|
@@ -31,5 +31,13 @@
|
|
|
31
31
|
"keywords": [],
|
|
32
32
|
"author": "",
|
|
33
33
|
"license": "ISC",
|
|
34
|
-
"gitHead": "
|
|
34
|
+
"gitHead": "b5949758ca5c537e02a14fbbf99d4cde4729255e",
|
|
35
|
+
"exports": {
|
|
36
|
+
".": {
|
|
37
|
+
"require": "./lib/index.js",
|
|
38
|
+
"import": "./src/index.js",
|
|
39
|
+
"default": "./lib/index.js"
|
|
40
|
+
},
|
|
41
|
+
"./esm": "./esm/index.js"
|
|
42
|
+
}
|
|
35
43
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
3
|
import DragInTheBlank from '../drag-in-the-blank';
|
|
4
4
|
|
|
5
5
|
const markup = `<div>
|
|
@@ -14,6 +14,44 @@ const markup = `<div>
|
|
|
14
14
|
</div>`;
|
|
15
15
|
const choice = (v, id) => ({ value: v, id });
|
|
16
16
|
|
|
17
|
+
// Mock DragProvider and DragDroppablePlaceholder to avoid DndContext requirement
|
|
18
|
+
jest.mock('@pie-lib/drag', () => ({
|
|
19
|
+
DragProvider: ({ children, onDragStart, onDragEnd }) => {
|
|
20
|
+
// Simple wrapper that doesn't require DndContext
|
|
21
|
+
return <div data-testid="drag-provider">{children}</div>;
|
|
22
|
+
},
|
|
23
|
+
DragDroppablePlaceholder: ({ children, disabled, instanceId }) => {
|
|
24
|
+
// Simple wrapper that doesn't require useDroppable
|
|
25
|
+
return <div data-testid="drag-droppable-placeholder">{children}</div>;
|
|
26
|
+
},
|
|
27
|
+
}));
|
|
28
|
+
|
|
29
|
+
// Mock @dnd-kit/core components and hooks used by DragInTheBlank and child components
|
|
30
|
+
jest.mock('@dnd-kit/core', () => ({
|
|
31
|
+
DragOverlay: ({ children }) => <div data-testid="drag-overlay">{children}</div>,
|
|
32
|
+
closestCenter: jest.fn(),
|
|
33
|
+
useDraggable: jest.fn(() => ({
|
|
34
|
+
attributes: {},
|
|
35
|
+
listeners: {},
|
|
36
|
+
setNodeRef: jest.fn(),
|
|
37
|
+
transform: null,
|
|
38
|
+
isDragging: false,
|
|
39
|
+
})),
|
|
40
|
+
useDroppable: jest.fn(() => ({
|
|
41
|
+
setNodeRef: jest.fn(),
|
|
42
|
+
isOver: false,
|
|
43
|
+
active: null,
|
|
44
|
+
})),
|
|
45
|
+
}));
|
|
46
|
+
|
|
47
|
+
jest.mock('@dnd-kit/utilities', () => ({
|
|
48
|
+
CSS: {
|
|
49
|
+
Translate: {
|
|
50
|
+
toString: jest.fn(() => 'translate3d(0, 0, 0)'),
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
}));
|
|
54
|
+
|
|
17
55
|
describe('DragInTheBlank', () => {
|
|
18
56
|
const defaultProps = {
|
|
19
57
|
disabled: false,
|
|
@@ -32,40 +70,42 @@ describe('DragInTheBlank', () => {
|
|
|
32
70
|
0: undefined,
|
|
33
71
|
},
|
|
34
72
|
};
|
|
35
|
-
let wrapper;
|
|
36
|
-
|
|
37
|
-
beforeEach(() => {
|
|
38
|
-
wrapper = shallow(<DragInTheBlank {...defaultProps} />);
|
|
39
|
-
});
|
|
40
73
|
|
|
41
74
|
describe('render', () => {
|
|
42
75
|
it('renders correctly with default props', () => {
|
|
43
|
-
|
|
76
|
+
const { container } = render(<DragInTheBlank {...defaultProps} />);
|
|
77
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
78
|
+
// Check that markup content is rendered
|
|
79
|
+
expect(screen.getByText(/Hey Diddle Diddle/)).toBeInTheDocument();
|
|
80
|
+
expect(screen.getByText(/Hey, diddle, diddle,/)).toBeInTheDocument();
|
|
44
81
|
});
|
|
45
82
|
|
|
46
83
|
it('renders correctly with disabled prop as true', () => {
|
|
47
|
-
|
|
48
|
-
expect(
|
|
84
|
+
const { container } = render(<DragInTheBlank {...defaultProps} disabled={true} />);
|
|
85
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
49
86
|
});
|
|
50
87
|
|
|
51
88
|
it('renders correctly with feedback', () => {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
89
|
+
const { container } = render(
|
|
90
|
+
<DragInTheBlank
|
|
91
|
+
{...defaultProps}
|
|
92
|
+
feedback={{
|
|
93
|
+
0: {
|
|
94
|
+
value: 'Jumped',
|
|
95
|
+
correct: 'Jumped',
|
|
96
|
+
},
|
|
97
|
+
1: {
|
|
98
|
+
value: 'Laughed',
|
|
99
|
+
correct: 'Laughed',
|
|
100
|
+
},
|
|
101
|
+
2: {
|
|
102
|
+
value: 'Spoon',
|
|
103
|
+
correct: 'Spoon',
|
|
104
|
+
},
|
|
105
|
+
}}
|
|
106
|
+
/>
|
|
107
|
+
);
|
|
108
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
69
109
|
});
|
|
70
110
|
});
|
|
71
111
|
});
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
3
|
import Mask from '../mask';
|
|
4
4
|
|
|
5
5
|
describe('Mask', () => {
|
|
6
|
-
|
|
6
|
+
// Don't mock renderChildren - let the component render naturally
|
|
7
7
|
const onChange = jest.fn();
|
|
8
8
|
const defaultProps = {
|
|
9
|
-
renderChildren,
|
|
10
9
|
onChange,
|
|
11
10
|
layout: {
|
|
12
11
|
nodes: [
|
|
@@ -22,131 +21,167 @@ describe('Mask', () => {
|
|
|
22
21
|
},
|
|
23
22
|
value: {},
|
|
24
23
|
};
|
|
25
|
-
let wrapper;
|
|
26
24
|
|
|
27
25
|
beforeEach(() => {
|
|
28
|
-
|
|
26
|
+
onChange.mockClear();
|
|
29
27
|
});
|
|
30
28
|
|
|
31
|
-
describe('
|
|
32
|
-
it('renders
|
|
33
|
-
|
|
29
|
+
describe('rendering', () => {
|
|
30
|
+
it('renders with default props', () => {
|
|
31
|
+
const { container } = render(<Mask {...defaultProps} />);
|
|
32
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
34
33
|
});
|
|
35
34
|
|
|
36
|
-
it('renders
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
nodes: [
|
|
40
|
-
{
|
|
41
|
-
type: 'p',
|
|
42
|
-
nodes: [
|
|
43
|
-
{
|
|
44
|
-
object: 'text',
|
|
45
|
-
leaves: [
|
|
46
|
-
{
|
|
47
|
-
text: 'Foo',
|
|
48
|
-
},
|
|
49
|
-
],
|
|
50
|
-
},
|
|
51
|
-
],
|
|
52
|
-
},
|
|
53
|
-
],
|
|
54
|
-
},
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
expect(wrapper).toMatchSnapshot();
|
|
35
|
+
it('renders text content', () => {
|
|
36
|
+
render(<Mask {...defaultProps} />);
|
|
37
|
+
expect(screen.getByText('Foo')).toBeInTheDocument();
|
|
58
38
|
});
|
|
59
39
|
|
|
60
|
-
it('renders
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
40
|
+
it('renders a paragraph element', () => {
|
|
41
|
+
const { container } = render(
|
|
42
|
+
<Mask
|
|
43
|
+
{...defaultProps}
|
|
44
|
+
layout={{
|
|
45
|
+
nodes: [
|
|
46
|
+
{
|
|
47
|
+
type: 'p',
|
|
48
|
+
nodes: [
|
|
49
|
+
{
|
|
50
|
+
object: 'text',
|
|
51
|
+
leaves: [
|
|
52
|
+
{
|
|
53
|
+
text: 'Foo',
|
|
54
|
+
},
|
|
55
|
+
],
|
|
74
56
|
},
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
},
|
|
82
|
-
],
|
|
83
|
-
},
|
|
84
|
-
],
|
|
85
|
-
},
|
|
86
|
-
],
|
|
87
|
-
},
|
|
88
|
-
],
|
|
89
|
-
},
|
|
90
|
-
});
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
}}
|
|
61
|
+
/>,
|
|
62
|
+
);
|
|
91
63
|
|
|
92
|
-
|
|
64
|
+
// Paragraph is rendered as a styled div, not a <p> tag
|
|
65
|
+
expect(screen.getByText('Foo')).toBeInTheDocument();
|
|
93
66
|
});
|
|
94
67
|
|
|
95
|
-
it
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
{
|
|
106
|
-
marks: [
|
|
107
|
-
{
|
|
108
|
-
data: undefined,
|
|
109
|
-
type: 'italic',
|
|
110
|
-
},
|
|
111
|
-
],
|
|
112
|
-
text: 'x',
|
|
68
|
+
it('renders nested div and paragraph', () => {
|
|
69
|
+
const { container } = render(
|
|
70
|
+
<Mask
|
|
71
|
+
{...defaultProps}
|
|
72
|
+
layout={{
|
|
73
|
+
nodes: [
|
|
74
|
+
{
|
|
75
|
+
type: 'div',
|
|
76
|
+
data: {
|
|
77
|
+
attributes: {},
|
|
113
78
|
},
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
79
|
+
nodes: [
|
|
80
|
+
{
|
|
81
|
+
type: 'p',
|
|
82
|
+
data: {
|
|
83
|
+
attributes: {},
|
|
84
|
+
},
|
|
85
|
+
nodes: [
|
|
86
|
+
{
|
|
87
|
+
object: 'text',
|
|
88
|
+
leaves: [
|
|
89
|
+
{
|
|
90
|
+
text: 'Foo',
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
}}
|
|
100
|
+
/>,
|
|
101
|
+
);
|
|
126
102
|
|
|
127
|
-
expect(
|
|
103
|
+
expect(container.querySelector('div')).toBeInTheDocument();
|
|
104
|
+
// Paragraph is rendered as a styled div, not a <p> tag
|
|
105
|
+
expect(screen.getByText('Foo')).toBeInTheDocument();
|
|
128
106
|
});
|
|
129
107
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
108
|
+
it('renders text with italic marks', () => {
|
|
109
|
+
const { container } = render(
|
|
110
|
+
<Mask
|
|
111
|
+
{...defaultProps}
|
|
112
|
+
layout={{
|
|
113
|
+
nodes: [
|
|
114
|
+
{
|
|
115
|
+
leaves: [{ text: 'Foo ' }],
|
|
116
|
+
object: 'text',
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
leaves: [
|
|
120
|
+
{
|
|
121
|
+
marks: [
|
|
122
|
+
{
|
|
123
|
+
data: undefined,
|
|
124
|
+
type: 'italic',
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
text: 'x',
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
object: 'text',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
leaves: [{ text: ' bar' }],
|
|
134
|
+
object: 'text',
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
object: 'block',
|
|
138
|
+
type: 'div',
|
|
139
|
+
}}
|
|
140
|
+
/>,
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
// Text "Foo " is split with spaces, use regex
|
|
144
|
+
expect(screen.getByText(/Foo/)).toBeInTheDocument();
|
|
145
|
+
expect(screen.getByText('x')).toBeInTheDocument();
|
|
146
|
+
expect(screen.getByText(/bar/)).toBeInTheDocument();
|
|
147
|
+
// Check for italic/em element
|
|
148
|
+
const em = container.querySelector('em, i');
|
|
149
|
+
expect(em).toBeInTheDocument();
|
|
150
|
+
expect(em.textContent).toBe('x');
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('renders tbody without extra space', () => {
|
|
154
|
+
const da = () => ({ data: { attributes: {} } });
|
|
155
|
+
const { container } = render(
|
|
156
|
+
<Mask
|
|
157
|
+
{...defaultProps}
|
|
158
|
+
layout={{
|
|
159
|
+
nodes: [
|
|
160
|
+
{
|
|
161
|
+
type: 'table',
|
|
162
|
+
...da(),
|
|
163
|
+
nodes: [
|
|
164
|
+
{
|
|
165
|
+
type: 'tbody',
|
|
166
|
+
...da(),
|
|
167
|
+
nodes: [
|
|
168
|
+
{
|
|
169
|
+
object: 'text',
|
|
170
|
+
leaves: [{ text: ' ' }],
|
|
171
|
+
},
|
|
172
|
+
{ type: 'tr', ...da(), nodes: [] },
|
|
173
|
+
],
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
}}
|
|
179
|
+
/>,
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
expect(container.querySelector('table')).toBeInTheDocument();
|
|
183
|
+
expect(container.querySelector('tbody')).toBeInTheDocument();
|
|
184
|
+
expect(container.querySelector('tr')).toBeInTheDocument();
|
|
150
185
|
});
|
|
151
186
|
});
|
|
152
187
|
});
|