@pie-lib/editable-html-tip-tap 2.1.11 → 2.2.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 (99) hide show
  1. package/CHANGELOG.md +0 -84
  2. package/lib/__tests__/EditableHtml.test.js +831 -0
  3. package/lib/__tests__/EditableHtml.test.js.map +1 -0
  4. package/lib/__tests__/constants.test.js +21 -0
  5. package/lib/__tests__/constants.test.js.map +1 -0
  6. package/lib/__tests__/div-to-paragraph-conversion.test.js +213 -0
  7. package/lib/__tests__/div-to-paragraph-conversion.test.js.map +1 -0
  8. package/lib/__tests__/extensions.test.js +209 -0
  9. package/lib/__tests__/extensions.test.js.map +1 -0
  10. package/lib/__tests__/index.test.js +250 -0
  11. package/lib/__tests__/index.test.js.map +1 -0
  12. package/lib/__tests__/size-utils.test.js +57 -0
  13. package/lib/__tests__/size-utils.test.js.map +1 -0
  14. package/lib/__tests__/theme.test.js +17 -0
  15. package/lib/__tests__/theme.test.js.map +1 -0
  16. package/lib/components/__tests__/AltDialog.test.js +201 -0
  17. package/lib/components/__tests__/AltDialog.test.js.map +1 -0
  18. package/lib/components/__tests__/CharacterPicker.test.js +455 -0
  19. package/lib/components/__tests__/CharacterPicker.test.js.map +1 -0
  20. package/lib/components/__tests__/CssIcon.test.js +58 -0
  21. package/lib/components/__tests__/CssIcon.test.js.map +1 -0
  22. package/lib/components/__tests__/DragInTheBlank.test.js +295 -0
  23. package/lib/components/__tests__/DragInTheBlank.test.js.map +1 -0
  24. package/lib/components/__tests__/ExplicitConstructedResponse.test.js +345 -0
  25. package/lib/components/__tests__/ExplicitConstructedResponse.test.js.map +1 -0
  26. package/lib/components/__tests__/ImageToolbar.test.js +185 -0
  27. package/lib/components/__tests__/ImageToolbar.test.js.map +1 -0
  28. package/lib/components/__tests__/InlineDropdown.test.js +839 -0
  29. package/lib/components/__tests__/InlineDropdown.test.js.map +1 -0
  30. package/lib/components/__tests__/InsertImageHandler.test.js +171 -0
  31. package/lib/components/__tests__/InsertImageHandler.test.js.map +1 -0
  32. package/lib/components/__tests__/MediaDialog.test.js +433 -0
  33. package/lib/components/__tests__/MediaDialog.test.js.map +1 -0
  34. package/lib/components/__tests__/MediaToolbar.test.js +126 -0
  35. package/lib/components/__tests__/MediaToolbar.test.js.map +1 -0
  36. package/lib/components/__tests__/MediaWrapper.test.js +96 -0
  37. package/lib/components/__tests__/MediaWrapper.test.js.map +1 -0
  38. package/lib/components/__tests__/MenuBar.test.js +502 -0
  39. package/lib/components/__tests__/MenuBar.test.js.map +1 -0
  40. package/lib/components/__tests__/RespArea.test.js +171 -0
  41. package/lib/components/__tests__/RespArea.test.js.map +1 -0
  42. package/lib/components/__tests__/TableIcons.test.js +153 -0
  43. package/lib/components/__tests__/TableIcons.test.js.map +1 -0
  44. package/lib/components/__tests__/TextAlign.test.js +209 -0
  45. package/lib/components/__tests__/TextAlign.test.js.map +1 -0
  46. package/lib/components/__tests__/TiptapContainer.test.js +196 -0
  47. package/lib/components/__tests__/TiptapContainer.test.js.map +1 -0
  48. package/lib/components/__tests__/characterUtils.test.js +178 -0
  49. package/lib/components/__tests__/characterUtils.test.js.map +1 -0
  50. package/lib/components/__tests__/choice.test.js +213 -0
  51. package/lib/components/__tests__/choice.test.js.map +1 -0
  52. package/lib/components/__tests__/custom-popper.test.js +108 -0
  53. package/lib/components/__tests__/custom-popper.test.js.map +1 -0
  54. package/lib/components/__tests__/done-button.test.js +72 -0
  55. package/lib/components/__tests__/done-button.test.js.map +1 -0
  56. package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
  57. package/lib/components/__tests__/toolbar-buttons.test.js.map +1 -0
  58. package/lib/components/respArea/DragInTheBlank/__tests__/choice.test.js +90 -0
  59. package/lib/components/respArea/DragInTheBlank/__tests__/choice.test.js.map +1 -0
  60. package/lib/components/respArea/MathTemplated.js +2 -2
  61. package/lib/components/respArea/MathTemplated.js.map +1 -1
  62. package/lib/components/respArea/__tests__/MathTemplated.test.js +217 -0
  63. package/lib/components/respArea/__tests__/MathTemplated.test.js.map +1 -0
  64. package/lib/extensions/__tests__/css.test.js +214 -0
  65. package/lib/extensions/__tests__/css.test.js.map +1 -0
  66. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +175 -0
  67. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js.map +1 -0
  68. package/lib/extensions/__tests__/divNode.test.js +108 -0
  69. package/lib/extensions/__tests__/divNode.test.js.map +1 -0
  70. package/lib/extensions/__tests__/ensure-empty-root-div.test.js +50 -0
  71. package/lib/extensions/__tests__/ensure-empty-root-div.test.js.map +1 -0
  72. package/lib/extensions/__tests__/ensure-list-item-content-is-div.test.js +60 -0
  73. package/lib/extensions/__tests__/ensure-list-item-content-is-div.test.js.map +1 -0
  74. package/lib/extensions/__tests__/extended-list-item.test.js +13 -0
  75. package/lib/extensions/__tests__/extended-list-item.test.js.map +1 -0
  76. package/lib/extensions/__tests__/extended-table-cell.test.js +15 -0
  77. package/lib/extensions/__tests__/extended-table-cell.test.js.map +1 -0
  78. package/lib/extensions/__tests__/extended-table.test.js +200 -0
  79. package/lib/extensions/__tests__/extended-table.test.js.map +1 -0
  80. package/lib/extensions/__tests__/image-component.test.js +432 -0
  81. package/lib/extensions/__tests__/image-component.test.js.map +1 -0
  82. package/lib/extensions/__tests__/image.test.js +313 -0
  83. package/lib/extensions/__tests__/image.test.js.map +1 -0
  84. package/lib/extensions/__tests__/math.test.js +1399 -0
  85. package/lib/extensions/__tests__/math.test.js.map +1 -0
  86. package/lib/extensions/__tests__/media-node-view.test.js +307 -0
  87. package/lib/extensions/__tests__/media-node-view.test.js.map +1 -0
  88. package/lib/extensions/__tests__/media.test.js +292 -0
  89. package/lib/extensions/__tests__/media.test.js.map +1 -0
  90. package/lib/extensions/__tests__/responseArea.test.js +736 -0
  91. package/lib/extensions/__tests__/responseArea.test.js.map +1 -0
  92. package/lib/utils/__tests__/helper.test.js +107 -0
  93. package/lib/utils/__tests__/helper.test.js.map +1 -0
  94. package/lib/utils/__tests__/toolbar.test.js +38 -0
  95. package/lib/utils/__tests__/toolbar.test.js.map +1 -0
  96. package/package.json +7 -7
  97. package/src/components/respArea/MathTemplated.jsx +1 -1
  98. package/src/components/respArea/__tests__/MathTemplated.test.jsx +1 -1
  99. package/LICENSE.md +0 -5
@@ -0,0 +1,292 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
5
+ var _media = require("../media");
6
+ jest.mock('@tiptap/core', function () {
7
+ return {
8
+ Node: {
9
+ create: jest.fn(function (config) {
10
+ return config;
11
+ })
12
+ },
13
+ mergeAttributes: jest.fn(function () {
14
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
15
+ args[_key] = arguments[_key];
16
+ }
17
+ return Object.assign.apply(Object, [{}].concat(args));
18
+ })
19
+ };
20
+ });
21
+ jest.mock('@tiptap/react', function () {
22
+ return {
23
+ NodeViewWrapper: function NodeViewWrapper(_ref) {
24
+ var children = _ref.children;
25
+ return /*#__PURE__*/React.createElement("div", {
26
+ "data-testid": "node-view-wrapper"
27
+ }, children);
28
+ },
29
+ ReactNodeViewRenderer: jest.fn(function (component) {
30
+ return component;
31
+ })
32
+ };
33
+ });
34
+ jest.mock('react-dom', function () {
35
+ return {
36
+ render: jest.fn()
37
+ };
38
+ });
39
+ jest.mock('../../components/media/MediaDialog', function () {
40
+ return {
41
+ __esModule: true,
42
+ "default": jest.fn(function () {
43
+ return /*#__PURE__*/React.createElement("div", {
44
+ "data-testid": "media-dialog"
45
+ });
46
+ })
47
+ };
48
+ });
49
+ jest.mock('../../components/media/MediaToolbar', function () {
50
+ return {
51
+ __esModule: true,
52
+ "default": jest.fn(function () {
53
+ return /*#__PURE__*/React.createElement("div", {
54
+ "data-testid": "media-toolbar"
55
+ });
56
+ })
57
+ };
58
+ });
59
+ describe('Media', function () {
60
+ describe('configuration', function () {
61
+ it('has correct name', function () {
62
+ expect(_media.Media.name).toBe('media');
63
+ });
64
+ it('is inline', function () {
65
+ expect(_media.Media.inline).toBe(true);
66
+ });
67
+ it('is in inline group', function () {
68
+ expect(_media.Media.group).toBe('inline');
69
+ });
70
+ it('is atomic', function () {
71
+ expect(_media.Media.atom).toBe(true);
72
+ });
73
+ });
74
+ describe('addAttributes', function () {
75
+ it('returns all media attributes with defaults', function () {
76
+ var attributes = _media.Media.addAttributes();
77
+ expect(attributes).toHaveProperty('type');
78
+ expect(attributes).toHaveProperty('src');
79
+ expect(attributes).toHaveProperty('width');
80
+ expect(attributes).toHaveProperty('height');
81
+ expect(attributes).toHaveProperty('title');
82
+ expect(attributes).toHaveProperty('starts');
83
+ expect(attributes).toHaveProperty('ends');
84
+ expect(attributes).toHaveProperty('editing');
85
+ expect(attributes).toHaveProperty('tag');
86
+ expect(attributes).toHaveProperty('url');
87
+ expect(attributes.type["default"]).toBe('video');
88
+ expect(attributes.src["default"]).toBeNull();
89
+ expect(attributes.tag["default"]).toBe('iframe');
90
+ expect(attributes.editing["default"]).toBe(false);
91
+ });
92
+ });
93
+ describe('parseHTML', function () {
94
+ it('returns parsing rules for iframe and audio', function () {
95
+ var rules = _media.Media.parseHTML();
96
+ expect(Array.isArray(rules)).toBe(true);
97
+ expect(rules).toHaveLength(2);
98
+ expect(rules[0].tag).toBe('iframe[data-type="video"]');
99
+ expect(rules[1].tag).toBe('audio');
100
+ });
101
+ it('parses video iframe attributes', function () {
102
+ var rules = _media.Media.parseHTML();
103
+ var mockEl = {
104
+ getAttribute: jest.fn(function (attr) {
105
+ var attrs = {
106
+ src: 'https://video.com/embed',
107
+ width: '640',
108
+ height: '480'
109
+ };
110
+ return attrs[attr] || null;
111
+ }),
112
+ dataset: {
113
+ title: 'Test Video',
114
+ starts: '10',
115
+ ends: '60',
116
+ url: 'https://video.com/watch'
117
+ }
118
+ };
119
+ var result = rules[0].getAttrs(mockEl);
120
+ expect(result.type).toBe('video');
121
+ expect(result.tag).toBe('iframe');
122
+ expect(result.src).toBe('https://video.com/embed');
123
+ expect(result.width).toBe('640');
124
+ expect(result.height).toBe('480');
125
+ expect(result.title).toBe('Test Video');
126
+ });
127
+ it('parses audio element attributes', function () {
128
+ var rules = _media.Media.parseHTML();
129
+ var mockEl = {
130
+ querySelector: jest.fn(function () {
131
+ return {
132
+ getAttribute: jest.fn(function () {
133
+ return 'https://audio.com/file.mp3';
134
+ })
135
+ };
136
+ })
137
+ };
138
+ var result = rules[1].getAttrs(mockEl);
139
+ expect(result.type).toBe('audio');
140
+ expect(result.tag).toBe('audio');
141
+ expect(result.src).toBe('https://audio.com/file.mp3');
142
+ });
143
+ });
144
+ describe('renderHTML', function () {
145
+ it('renders audio element for audio type', function () {
146
+ var HTMLAttributes = {
147
+ tag: 'audio',
148
+ src: 'test.mp3'
149
+ };
150
+ var result = _media.Media.renderHTML({
151
+ HTMLAttributes: HTMLAttributes
152
+ });
153
+ expect(result[0]).toBe('audio');
154
+ expect(result[1]).toEqual({
155
+ controls: 'controls',
156
+ controlsList: 'nodownload'
157
+ });
158
+ expect(result[2][0]).toBe('source');
159
+ expect(result[2][1]).toEqual({
160
+ src: 'test.mp3',
161
+ type: 'audio/mp3'
162
+ });
163
+ });
164
+ it('renders iframe for video type', function () {
165
+ var HTMLAttributes = {
166
+ tag: 'iframe',
167
+ src: 'https://video.com/embed',
168
+ width: '640',
169
+ height: '480'
170
+ };
171
+ var result = _media.Media.renderHTML({
172
+ HTMLAttributes: HTMLAttributes
173
+ });
174
+ expect(result[0]).toBe('iframe');
175
+ expect(result[1]).toHaveProperty('data-type', 'video');
176
+ expect(result[1]).toHaveProperty('frameborder', '0');
177
+ expect(result[1]).toHaveProperty('src', 'https://video.com/embed');
178
+ expect(result[1]).toHaveProperty('width', '640');
179
+ expect(result[1]).toHaveProperty('height', '480');
180
+ });
181
+ it('renders iframe without dimensions if not provided', function () {
182
+ var HTMLAttributes = {
183
+ tag: 'iframe',
184
+ src: 'https://video.com/embed'
185
+ };
186
+ var result = _media.Media.renderHTML({
187
+ HTMLAttributes: HTMLAttributes
188
+ });
189
+ expect(result[1]).not.toHaveProperty('width');
190
+ expect(result[1]).not.toHaveProperty('height');
191
+ });
192
+ });
193
+ describe('addCommands', function () {
194
+ it('returns insertMedia and updateMedia commands', function () {
195
+ var commands = _media.Media.addCommands();
196
+ expect(commands).toHaveProperty('insertMedia');
197
+ expect(commands).toHaveProperty('updateMedia');
198
+ expect((0, _typeof2["default"])(commands.insertMedia)).toBe('function');
199
+ expect((0, _typeof2["default"])(commands.updateMedia)).toBe('function');
200
+ });
201
+ it('insertMedia inserts content with attributes', function () {
202
+ var context = {
203
+ name: 'media'
204
+ };
205
+ var commands = _media.Media.addCommands.call(context);
206
+ var mockCommands = {
207
+ insertContent: jest.fn(function () {
208
+ return true;
209
+ })
210
+ };
211
+ var attrs = {
212
+ type: 'video',
213
+ src: 'test.mp4'
214
+ };
215
+ var result = commands.insertMedia(attrs)({
216
+ commands: mockCommands
217
+ });
218
+ expect(mockCommands.insertContent).toHaveBeenCalledWith({
219
+ type: 'media',
220
+ attrs: attrs
221
+ });
222
+ expect(result).toBe(true);
223
+ });
224
+ it('updateMedia updates attributes', function () {
225
+ var context = {
226
+ name: 'media'
227
+ };
228
+ var commands = _media.Media.addCommands.call(context);
229
+ var mockCommands = {
230
+ updateAttributes: jest.fn(function () {
231
+ return true;
232
+ })
233
+ };
234
+ var attrs = {
235
+ width: '800'
236
+ };
237
+ var result = commands.updateMedia(attrs)({
238
+ commands: mockCommands
239
+ });
240
+ expect(mockCommands.updateAttributes).toHaveBeenCalledWith('media', attrs);
241
+ expect(result).toBe(true);
242
+ });
243
+ });
244
+ describe('addNodeView', function () {
245
+ it('returns ReactNodeViewRenderer result', function () {
246
+ var result = _media.Media.addNodeView();
247
+ expect(result).toBeDefined();
248
+ });
249
+ });
250
+ });
251
+ describe('insertDialog', function () {
252
+ beforeEach(function () {
253
+ document.body.innerHTML = '';
254
+ document.body.style.overflow = 'auto';
255
+ });
256
+ it('creates dialog element', function () {
257
+ var mockCallback = jest.fn();
258
+ var props = {
259
+ type: 'video',
260
+ callback: mockCallback,
261
+ options: {}
262
+ };
263
+ (0, _media.insertDialog)(props);
264
+ var dialog = document.querySelector('.insert-media-dialog');
265
+ expect(dialog).toBeTruthy();
266
+ });
267
+ it('sets body overflow to hidden', function () {
268
+ var mockCallback = jest.fn();
269
+ var props = {
270
+ type: 'video',
271
+ callback: mockCallback,
272
+ options: {}
273
+ };
274
+ (0, _media.insertDialog)(props);
275
+ expect(document.body.style.overflow).toBe('hidden');
276
+ });
277
+ it('removes previous dialogs', function () {
278
+ var existingDialog = document.createElement('div');
279
+ existingDialog.className = 'insert-media-dialog';
280
+ document.body.appendChild(existingDialog);
281
+ var mockCallback = jest.fn();
282
+ var props = {
283
+ type: 'video',
284
+ callback: mockCallback,
285
+ options: {}
286
+ };
287
+ (0, _media.insertDialog)(props);
288
+ var dialogs = document.querySelectorAll('.insert-media-dialog');
289
+ expect(dialogs).toHaveLength(1);
290
+ });
291
+ });
292
+ //# sourceMappingURL=media.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.test.js","names":["_media","require","jest","mock","Node","create","fn","config","mergeAttributes","_len","arguments","length","args","Array","_key","Object","assign","apply","concat","NodeViewWrapper","_ref","children","React","createElement","ReactNodeViewRenderer","component","render","__esModule","describe","it","expect","Media","name","toBe","inline","group","atom","attributes","addAttributes","toHaveProperty","type","src","toBeNull","tag","editing","rules","parseHTML","isArray","toHaveLength","mockEl","getAttribute","attr","attrs","width","height","dataset","title","starts","ends","url","result","getAttrs","querySelector","HTMLAttributes","renderHTML","toEqual","controls","controlsList","not","commands","addCommands","_typeof2","insertMedia","updateMedia","context","call","mockCommands","insertContent","toHaveBeenCalledWith","updateAttributes","addNodeView","toBeDefined","beforeEach","document","body","innerHTML","style","overflow","mockCallback","props","callback","options","insertDialog","dialog","toBeTruthy","existingDialog","className","appendChild","dialogs","querySelectorAll"],"sources":["../../../src/extensions/__tests__/media.test.js"],"sourcesContent":["import { insertDialog, Media } from '../media';\n\njest.mock('@tiptap/core', () => ({\n Node: { create: jest.fn((config) => config) },\n mergeAttributes: jest.fn((...args) => Object.assign({}, ...args)),\n}));\n\njest.mock('@tiptap/react', () => ({\n NodeViewWrapper: ({ children }) => <div data-testid=\"node-view-wrapper\">{children}</div>,\n ReactNodeViewRenderer: jest.fn((component) => component),\n}));\n\njest.mock('react-dom', () => ({\n render: jest.fn(),\n}));\n\njest.mock('../../components/media/MediaDialog', () => ({\n __esModule: true,\n default: jest.fn(() => <div data-testid=\"media-dialog\" />),\n}));\n\njest.mock('../../components/media/MediaToolbar', () => ({\n __esModule: true,\n default: jest.fn(() => <div data-testid=\"media-toolbar\" />),\n}));\n\ndescribe('Media', () => {\n describe('configuration', () => {\n it('has correct name', () => {\n expect(Media.name).toBe('media');\n });\n\n it('is inline', () => {\n expect(Media.inline).toBe(true);\n });\n\n it('is in inline group', () => {\n expect(Media.group).toBe('inline');\n });\n\n it('is atomic', () => {\n expect(Media.atom).toBe(true);\n });\n });\n\n describe('addAttributes', () => {\n it('returns all media attributes with defaults', () => {\n const attributes = Media.addAttributes();\n\n expect(attributes).toHaveProperty('type');\n expect(attributes).toHaveProperty('src');\n expect(attributes).toHaveProperty('width');\n expect(attributes).toHaveProperty('height');\n expect(attributes).toHaveProperty('title');\n expect(attributes).toHaveProperty('starts');\n expect(attributes).toHaveProperty('ends');\n expect(attributes).toHaveProperty('editing');\n expect(attributes).toHaveProperty('tag');\n expect(attributes).toHaveProperty('url');\n\n expect(attributes.type.default).toBe('video');\n expect(attributes.src.default).toBeNull();\n expect(attributes.tag.default).toBe('iframe');\n expect(attributes.editing.default).toBe(false);\n });\n });\n\n describe('parseHTML', () => {\n it('returns parsing rules for iframe and audio', () => {\n const rules = Media.parseHTML();\n\n expect(Array.isArray(rules)).toBe(true);\n expect(rules).toHaveLength(2);\n expect(rules[0].tag).toBe('iframe[data-type=\"video\"]');\n expect(rules[1].tag).toBe('audio');\n });\n\n it('parses video iframe attributes', () => {\n const rules = Media.parseHTML();\n const mockEl = {\n getAttribute: jest.fn((attr) => {\n const attrs = {\n src: 'https://video.com/embed',\n width: '640',\n height: '480',\n };\n return attrs[attr] || null;\n }),\n dataset: {\n title: 'Test Video',\n starts: '10',\n ends: '60',\n url: 'https://video.com/watch',\n },\n };\n\n const result = rules[0].getAttrs(mockEl);\n\n expect(result.type).toBe('video');\n expect(result.tag).toBe('iframe');\n expect(result.src).toBe('https://video.com/embed');\n expect(result.width).toBe('640');\n expect(result.height).toBe('480');\n expect(result.title).toBe('Test Video');\n });\n\n it('parses audio element attributes', () => {\n const rules = Media.parseHTML();\n const mockEl = {\n querySelector: jest.fn(() => ({\n getAttribute: jest.fn(() => 'https://audio.com/file.mp3'),\n })),\n };\n\n const result = rules[1].getAttrs(mockEl);\n\n expect(result.type).toBe('audio');\n expect(result.tag).toBe('audio');\n expect(result.src).toBe('https://audio.com/file.mp3');\n });\n });\n\n describe('renderHTML', () => {\n it('renders audio element for audio type', () => {\n const HTMLAttributes = {\n tag: 'audio',\n src: 'test.mp3',\n };\n\n const result = Media.renderHTML({ HTMLAttributes });\n\n expect(result[0]).toBe('audio');\n expect(result[1]).toEqual({ controls: 'controls', controlsList: 'nodownload' });\n expect(result[2][0]).toBe('source');\n expect(result[2][1]).toEqual({ src: 'test.mp3', type: 'audio/mp3' });\n });\n\n it('renders iframe for video type', () => {\n const HTMLAttributes = {\n tag: 'iframe',\n src: 'https://video.com/embed',\n width: '640',\n height: '480',\n };\n\n const result = Media.renderHTML({ HTMLAttributes });\n\n expect(result[0]).toBe('iframe');\n expect(result[1]).toHaveProperty('data-type', 'video');\n expect(result[1]).toHaveProperty('frameborder', '0');\n expect(result[1]).toHaveProperty('src', 'https://video.com/embed');\n expect(result[1]).toHaveProperty('width', '640');\n expect(result[1]).toHaveProperty('height', '480');\n });\n\n it('renders iframe without dimensions if not provided', () => {\n const HTMLAttributes = {\n tag: 'iframe',\n src: 'https://video.com/embed',\n };\n\n const result = Media.renderHTML({ HTMLAttributes });\n\n expect(result[1]).not.toHaveProperty('width');\n expect(result[1]).not.toHaveProperty('height');\n });\n });\n\n describe('addCommands', () => {\n it('returns insertMedia and updateMedia commands', () => {\n const commands = Media.addCommands();\n\n expect(commands).toHaveProperty('insertMedia');\n expect(commands).toHaveProperty('updateMedia');\n expect(typeof commands.insertMedia).toBe('function');\n expect(typeof commands.updateMedia).toBe('function');\n });\n\n it('insertMedia inserts content with attributes', () => {\n const context = { name: 'media' };\n const commands = Media.addCommands.call(context);\n const mockCommands = {\n insertContent: jest.fn(() => true),\n };\n const attrs = { type: 'video', src: 'test.mp4' };\n\n const result = commands.insertMedia(attrs)({ commands: mockCommands });\n\n expect(mockCommands.insertContent).toHaveBeenCalledWith({\n type: 'media',\n attrs,\n });\n expect(result).toBe(true);\n });\n\n it('updateMedia updates attributes', () => {\n const context = { name: 'media' };\n const commands = Media.addCommands.call(context);\n const mockCommands = {\n updateAttributes: jest.fn(() => true),\n };\n const attrs = { width: '800' };\n\n const result = commands.updateMedia(attrs)({ commands: mockCommands });\n\n expect(mockCommands.updateAttributes).toHaveBeenCalledWith('media', attrs);\n expect(result).toBe(true);\n });\n });\n\n describe('addNodeView', () => {\n it('returns ReactNodeViewRenderer result', () => {\n const result = Media.addNodeView();\n\n expect(result).toBeDefined();\n });\n });\n});\n\ndescribe('insertDialog', () => {\n beforeEach(() => {\n document.body.innerHTML = '';\n document.body.style.overflow = 'auto';\n });\n\n it('creates dialog element', () => {\n const mockCallback = jest.fn();\n const props = {\n type: 'video',\n callback: mockCallback,\n options: {},\n };\n\n insertDialog(props);\n\n const dialog = document.querySelector('.insert-media-dialog');\n expect(dialog).toBeTruthy();\n });\n\n it('sets body overflow to hidden', () => {\n const mockCallback = jest.fn();\n const props = {\n type: 'video',\n callback: mockCallback,\n options: {},\n };\n\n insertDialog(props);\n\n expect(document.body.style.overflow).toBe('hidden');\n });\n\n it('removes previous dialogs', () => {\n const existingDialog = document.createElement('div');\n existingDialog.className = 'insert-media-dialog';\n document.body.appendChild(existingDialog);\n\n const mockCallback = jest.fn();\n const props = {\n type: 'video',\n callback: mockCallback,\n options: {},\n };\n\n insertDialog(props);\n\n const dialogs = document.querySelectorAll('.insert-media-dialog');\n expect(dialogs).toHaveLength(1);\n });\n});\n\n"],"mappings":"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","ignoreList":[]}