@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.
- package/CHANGELOG.md +0 -84
- package/lib/__tests__/EditableHtml.test.js +831 -0
- package/lib/__tests__/EditableHtml.test.js.map +1 -0
- package/lib/__tests__/constants.test.js +21 -0
- package/lib/__tests__/constants.test.js.map +1 -0
- package/lib/__tests__/div-to-paragraph-conversion.test.js +213 -0
- package/lib/__tests__/div-to-paragraph-conversion.test.js.map +1 -0
- package/lib/__tests__/extensions.test.js +209 -0
- package/lib/__tests__/extensions.test.js.map +1 -0
- package/lib/__tests__/index.test.js +250 -0
- package/lib/__tests__/index.test.js.map +1 -0
- package/lib/__tests__/size-utils.test.js +57 -0
- package/lib/__tests__/size-utils.test.js.map +1 -0
- package/lib/__tests__/theme.test.js +17 -0
- package/lib/__tests__/theme.test.js.map +1 -0
- package/lib/components/__tests__/AltDialog.test.js +201 -0
- package/lib/components/__tests__/AltDialog.test.js.map +1 -0
- package/lib/components/__tests__/CharacterPicker.test.js +455 -0
- package/lib/components/__tests__/CharacterPicker.test.js.map +1 -0
- package/lib/components/__tests__/CssIcon.test.js +58 -0
- package/lib/components/__tests__/CssIcon.test.js.map +1 -0
- package/lib/components/__tests__/DragInTheBlank.test.js +295 -0
- package/lib/components/__tests__/DragInTheBlank.test.js.map +1 -0
- package/lib/components/__tests__/ExplicitConstructedResponse.test.js +345 -0
- package/lib/components/__tests__/ExplicitConstructedResponse.test.js.map +1 -0
- package/lib/components/__tests__/ImageToolbar.test.js +185 -0
- package/lib/components/__tests__/ImageToolbar.test.js.map +1 -0
- package/lib/components/__tests__/InlineDropdown.test.js +839 -0
- package/lib/components/__tests__/InlineDropdown.test.js.map +1 -0
- package/lib/components/__tests__/InsertImageHandler.test.js +171 -0
- package/lib/components/__tests__/InsertImageHandler.test.js.map +1 -0
- package/lib/components/__tests__/MediaDialog.test.js +433 -0
- package/lib/components/__tests__/MediaDialog.test.js.map +1 -0
- package/lib/components/__tests__/MediaToolbar.test.js +126 -0
- package/lib/components/__tests__/MediaToolbar.test.js.map +1 -0
- package/lib/components/__tests__/MediaWrapper.test.js +96 -0
- package/lib/components/__tests__/MediaWrapper.test.js.map +1 -0
- package/lib/components/__tests__/MenuBar.test.js +502 -0
- package/lib/components/__tests__/MenuBar.test.js.map +1 -0
- package/lib/components/__tests__/RespArea.test.js +171 -0
- package/lib/components/__tests__/RespArea.test.js.map +1 -0
- package/lib/components/__tests__/TableIcons.test.js +153 -0
- package/lib/components/__tests__/TableIcons.test.js.map +1 -0
- package/lib/components/__tests__/TextAlign.test.js +209 -0
- package/lib/components/__tests__/TextAlign.test.js.map +1 -0
- package/lib/components/__tests__/TiptapContainer.test.js +196 -0
- package/lib/components/__tests__/TiptapContainer.test.js.map +1 -0
- package/lib/components/__tests__/characterUtils.test.js +178 -0
- package/lib/components/__tests__/characterUtils.test.js.map +1 -0
- package/lib/components/__tests__/choice.test.js +213 -0
- package/lib/components/__tests__/choice.test.js.map +1 -0
- package/lib/components/__tests__/custom-popper.test.js +108 -0
- package/lib/components/__tests__/custom-popper.test.js.map +1 -0
- package/lib/components/__tests__/done-button.test.js +72 -0
- package/lib/components/__tests__/done-button.test.js.map +1 -0
- package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
- package/lib/components/__tests__/toolbar-buttons.test.js.map +1 -0
- package/lib/components/respArea/DragInTheBlank/__tests__/choice.test.js +90 -0
- package/lib/components/respArea/DragInTheBlank/__tests__/choice.test.js.map +1 -0
- package/lib/components/respArea/MathTemplated.js +2 -2
- package/lib/components/respArea/MathTemplated.js.map +1 -1
- package/lib/components/respArea/__tests__/MathTemplated.test.js +217 -0
- package/lib/components/respArea/__tests__/MathTemplated.test.js.map +1 -0
- package/lib/extensions/__tests__/css.test.js +214 -0
- package/lib/extensions/__tests__/css.test.js.map +1 -0
- package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +175 -0
- package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js.map +1 -0
- package/lib/extensions/__tests__/divNode.test.js +108 -0
- package/lib/extensions/__tests__/divNode.test.js.map +1 -0
- package/lib/extensions/__tests__/ensure-empty-root-div.test.js +50 -0
- package/lib/extensions/__tests__/ensure-empty-root-div.test.js.map +1 -0
- package/lib/extensions/__tests__/ensure-list-item-content-is-div.test.js +60 -0
- package/lib/extensions/__tests__/ensure-list-item-content-is-div.test.js.map +1 -0
- package/lib/extensions/__tests__/extended-list-item.test.js +13 -0
- package/lib/extensions/__tests__/extended-list-item.test.js.map +1 -0
- package/lib/extensions/__tests__/extended-table-cell.test.js +15 -0
- package/lib/extensions/__tests__/extended-table-cell.test.js.map +1 -0
- package/lib/extensions/__tests__/extended-table.test.js +200 -0
- package/lib/extensions/__tests__/extended-table.test.js.map +1 -0
- package/lib/extensions/__tests__/image-component.test.js +432 -0
- package/lib/extensions/__tests__/image-component.test.js.map +1 -0
- package/lib/extensions/__tests__/image.test.js +313 -0
- package/lib/extensions/__tests__/image.test.js.map +1 -0
- package/lib/extensions/__tests__/math.test.js +1399 -0
- package/lib/extensions/__tests__/math.test.js.map +1 -0
- package/lib/extensions/__tests__/media-node-view.test.js +307 -0
- package/lib/extensions/__tests__/media-node-view.test.js.map +1 -0
- package/lib/extensions/__tests__/media.test.js +292 -0
- package/lib/extensions/__tests__/media.test.js.map +1 -0
- package/lib/extensions/__tests__/responseArea.test.js +736 -0
- package/lib/extensions/__tests__/responseArea.test.js.map +1 -0
- package/lib/utils/__tests__/helper.test.js +107 -0
- package/lib/utils/__tests__/helper.test.js.map +1 -0
- package/lib/utils/__tests__/toolbar.test.js +38 -0
- package/lib/utils/__tests__/toolbar.test.js.map +1 -0
- package/package.json +7 -7
- package/src/components/respArea/MathTemplated.jsx +1 -1
- package/src/components/respArea/__tests__/MathTemplated.test.jsx +1 -1
- 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":[]}
|