ckeditor5 1.16.0 → 1.16.1
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.
- checksums.yaml +4 -4
- data/lib/ckeditor5/rails/assets/webcomponents/components/context.mjs +0 -23
- data/lib/ckeditor5/rails/assets/webcomponents/components/editor.mjs +0 -24
- data/lib/ckeditor5/rails/assets/webcomponents/utils.mjs +10 -33
- data/lib/ckeditor5/rails/context/props.rb +2 -17
- data/lib/ckeditor5/rails/editor/props.rb +3 -16
- data/lib/ckeditor5/rails/editor/props_inline_plugin.rb +3 -6
- data/lib/ckeditor5/rails/editor/props_plugin.rb +4 -6
- data/lib/ckeditor5/rails/version.rb +1 -1
- data/lib/ckeditor5/rails.rb +0 -1
- data/spec/lib/ckeditor5/rails/context/props_spec.rb +1 -7
- data/spec/lib/ckeditor5/rails/editor/props_spec.rb +0 -2
- metadata +1 -7
- data/lib/ckeditor5/rails/concerns/checksum.rb +0 -15
- data/lib/ckeditor5/rails/editor/props_base_plugin.rb +0 -19
- data/spec/lib/ckeditor5/rails/concerns/checksum_spec.rb +0 -50
- data/spec/lib/ckeditor5/rails/editor/props_base_plugin_spec.rb +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 95f068ef75561d88a26a68c5aafa6e6f86b55405984e83bf35909085f288f9ba
|
4
|
+
data.tar.gz: d72e733641c5ac8c4f9d1e20731d54ffd2c0e4d88bc3b82618eb62b8c2820049
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31fb63fa1ac20061e1c28150178b7b8f92ca54e99073f2e180a7823d7f76f58c75a9f55e70b9a6f729d9715389b1a349305027e6d6c0c56bb2f7539d1a6bc0ad
|
7
|
+
data.tar.gz: 4019ffcc8e326be64930092815d5ff68436e4c242a67853adf735b4667aa7bec624df66fe9614d0f7e4bb00c67c2c0cf0e1195c43647d397b9f99ab8a0637479
|
@@ -12,12 +12,7 @@ class CKEditorContextComponent extends HTMLElement {
|
|
12
12
|
/** @type {Set<CKEditorComponent>} */
|
13
13
|
#connectedEditors = new Set();
|
14
14
|
|
15
|
-
/** @type {String} Attributes checksum hash */
|
16
|
-
#integrity = '';
|
17
|
-
|
18
15
|
async connectedCallback() {
|
19
|
-
this.#integrity = this.getAttribute('integrity');
|
20
|
-
|
21
16
|
try {
|
22
17
|
execIfDOMReady(() => this.#initializeContext());
|
23
18
|
} catch (error) {
|
@@ -57,22 +52,6 @@ class CKEditorContextComponent extends HTMLElement {
|
|
57
52
|
this.#connectedEditors.delete(editor);
|
58
53
|
}
|
59
54
|
|
60
|
-
/**
|
61
|
-
* Validates editor configuration integrity hash to prevent attacks.
|
62
|
-
*/
|
63
|
-
async #validateIntegrity() {
|
64
|
-
const integrity = await calculateChecksum({
|
65
|
-
plugins: this.getAttribute('plugins'),
|
66
|
-
});
|
67
|
-
|
68
|
-
if (integrity !== this.#integrity) {
|
69
|
-
throw new Error(
|
70
|
-
'Configuration integrity check failed. It means that #integrity attributes mismatch from attributes passed to webcomponent. ' +
|
71
|
-
'This could be a security issue. Please check if you are passing correct attributes to the webcomponent.'
|
72
|
-
);
|
73
|
-
}
|
74
|
-
}
|
75
|
-
|
76
55
|
/**
|
77
56
|
* Initialize CKEditor context with shared configuration
|
78
57
|
*
|
@@ -87,8 +66,6 @@ class CKEditorContextComponent extends HTMLElement {
|
|
87
66
|
this.instance = null;
|
88
67
|
}
|
89
68
|
|
90
|
-
await this.#validateIntegrity();
|
91
|
-
|
92
69
|
const { Context, ContextWatchdog } = await import('ckeditor5');
|
93
70
|
const plugins = await this.#getPlugins();
|
94
71
|
const config = this.#getConfig();
|
@@ -40,9 +40,6 @@ class CKEditorComponent extends HTMLElement {
|
|
40
40
|
/** @type {String} ID of editor within context */
|
41
41
|
#contextEditorId = null;
|
42
42
|
|
43
|
-
/** @type {String} Attributes checksum hash */
|
44
|
-
#integrity = '';
|
45
|
-
|
46
43
|
/** @type {(event: CustomEvent) => void} Event handler for editor change */
|
47
44
|
get oneditorchange() {
|
48
45
|
return this.#getEventHandler('editorchange');
|
@@ -109,11 +106,9 @@ class CKEditorComponent extends HTMLElement {
|
|
109
106
|
/**
|
110
107
|
* Lifecycle callback when element is connected to DOM
|
111
108
|
* Initializes the editor when DOM is ready
|
112
|
-
*
|
113
109
|
* @protected
|
114
110
|
*/
|
115
111
|
connectedCallback() {
|
116
|
-
this.#integrity = this.getAttribute('integrity');
|
117
112
|
this.#context = this.closest('ckeditor-context-component');
|
118
113
|
this.#initialHTML = this.innerHTML;
|
119
114
|
|
@@ -233,23 +228,6 @@ class CKEditorComponent extends HTMLElement {
|
|
233
228
|
return resolveElementReferences(config);
|
234
229
|
}
|
235
230
|
|
236
|
-
/**
|
237
|
-
* Validates editor configuration integrity hash to prevent attacks.
|
238
|
-
*/
|
239
|
-
async #validateIntegrity() {
|
240
|
-
const integrity = await calculateChecksum({
|
241
|
-
translations: this.getAttribute('translations'),
|
242
|
-
plugins: this.getAttribute('plugins'),
|
243
|
-
});
|
244
|
-
|
245
|
-
if (integrity !== this.#integrity) {
|
246
|
-
throw new Error(
|
247
|
-
'Configuration integrity check failed. It means that #integrity attributes mismatch from attributes passed to webcomponent. ' +
|
248
|
-
'This could be a security issue. Please check if you are passing correct attributes to the webcomponent.'
|
249
|
-
);
|
250
|
-
}
|
251
|
-
}
|
252
|
-
|
253
231
|
/**
|
254
232
|
* Creates a new CKEditor instance
|
255
233
|
*
|
@@ -259,8 +237,6 @@ class CKEditorComponent extends HTMLElement {
|
|
259
237
|
* @throws {Error} When initialization fails
|
260
238
|
*/
|
261
239
|
async #initializeEditor(editablesOrContent) {
|
262
|
-
await this.#validateIntegrity();
|
263
|
-
|
264
240
|
const Editor = await this.#getEditorConstructor();
|
265
241
|
const [plugins, translations] = await Promise.all([
|
266
242
|
this.#getPlugins(),
|
@@ -66,18 +66,16 @@ function loadAsyncImports(imports = []) {
|
|
66
66
|
return imported;
|
67
67
|
};
|
68
68
|
|
69
|
-
return Promise.all(
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
})
|
80
|
-
);
|
69
|
+
return Promise.all(imports.map(item => {
|
70
|
+
switch(item.type) {
|
71
|
+
case 'inline':
|
72
|
+
return loadInlinePlugin(item);
|
73
|
+
|
74
|
+
case 'external':
|
75
|
+
default:
|
76
|
+
return loadExternalPlugin(item);
|
77
|
+
}
|
78
|
+
}));
|
81
79
|
}
|
82
80
|
|
83
81
|
/**
|
@@ -155,24 +153,3 @@ function resolveElementReferences(obj) {
|
|
155
153
|
function uid() {
|
156
154
|
return Math.random().toString(36).substring(2);
|
157
155
|
}
|
158
|
-
|
159
|
-
/**
|
160
|
-
* Calculates checksum for an object.
|
161
|
-
*/
|
162
|
-
async function calculateChecksum(obj) {
|
163
|
-
const objCopy = { ...obj, checksum: undefined };
|
164
|
-
|
165
|
-
return sha256(JSON.stringify(objCopy));
|
166
|
-
}
|
167
|
-
|
168
|
-
/**
|
169
|
-
* Calculates SHA-256 hash for a string
|
170
|
-
*/
|
171
|
-
async function sha256(str) {
|
172
|
-
const buffer = new TextEncoder().encode(str);
|
173
|
-
const hashBuffer = await crypto.subtle.digest('SHA-256', buffer);
|
174
|
-
|
175
|
-
return Array.from(new Uint8Array(hashBuffer))
|
176
|
-
.map(b => b.toString(16).padStart(2, '0'))
|
177
|
-
.join('');
|
178
|
-
}
|
@@ -3,16 +3,14 @@
|
|
3
3
|
module CKEditor5::Rails
|
4
4
|
module Context
|
5
5
|
class Props
|
6
|
-
include CKEditor5::Rails::Concerns::Checksum
|
7
|
-
|
8
6
|
def initialize(config)
|
9
7
|
@config = config
|
10
8
|
end
|
11
9
|
|
12
10
|
def to_attributes
|
13
11
|
{
|
14
|
-
|
15
|
-
|
12
|
+
plugins: serialize_plugins,
|
13
|
+
config: serialize_config
|
16
14
|
}
|
17
15
|
end
|
18
16
|
|
@@ -20,19 +18,6 @@ module CKEditor5::Rails
|
|
20
18
|
|
21
19
|
attr_reader :config
|
22
20
|
|
23
|
-
def integrity_checksum
|
24
|
-
unsafe_attributes = serialized_attributes.slice(:plugins)
|
25
|
-
|
26
|
-
calculate_object_checksum(unsafe_attributes)
|
27
|
-
end
|
28
|
-
|
29
|
-
def serialized_attributes
|
30
|
-
@serialized_attributes ||= {
|
31
|
-
plugins: serialize_plugins,
|
32
|
-
config: serialize_config
|
33
|
-
}
|
34
|
-
end
|
35
|
-
|
36
21
|
def serialize_plugins
|
37
22
|
(config[:plugins] || []).map { |plugin| Editor::PropsPlugin.normalize(plugin).to_h }.to_json
|
38
23
|
end
|
@@ -5,8 +5,6 @@ require_relative 'editable_height_normalizer'
|
|
5
5
|
|
6
6
|
module CKEditor5::Rails::Editor
|
7
7
|
class Props
|
8
|
-
include CKEditor5::Rails::Concerns::Checksum
|
9
|
-
|
10
8
|
EDITOR_TYPES = {
|
11
9
|
classic: 'ClassicEditor',
|
12
10
|
inline: 'InlineEditor',
|
@@ -27,9 +25,8 @@ module CKEditor5::Rails::Editor
|
|
27
25
|
|
28
26
|
def to_attributes
|
29
27
|
{
|
30
|
-
**serialized_attributes,
|
31
28
|
type: EDITOR_TYPES[@type],
|
32
|
-
|
29
|
+
**serialized_attributes
|
33
30
|
}
|
34
31
|
end
|
35
32
|
|
@@ -41,24 +38,14 @@ module CKEditor5::Rails::Editor
|
|
41
38
|
|
42
39
|
attr_reader :controller_context, :watchdog, :type, :config, :editable_height
|
43
40
|
|
44
|
-
def integrity_checksum
|
45
|
-
unsafe_attributes = serialized_attributes.slice(:translations, :plugins)
|
46
|
-
|
47
|
-
calculate_object_checksum(unsafe_attributes)
|
48
|
-
end
|
49
|
-
|
50
41
|
def serialized_attributes
|
51
|
-
|
52
|
-
|
53
|
-
attributes = {
|
42
|
+
{
|
54
43
|
translations: serialize_translations,
|
55
44
|
plugins: serialize_plugins,
|
56
45
|
config: serialize_config,
|
57
46
|
watchdog: watchdog
|
58
47
|
}
|
59
|
-
|
60
|
-
attributes.merge!(editable_height ? { 'editable-height' => editable_height } : {})
|
61
|
-
@serialized_attributes = attributes
|
48
|
+
.merge(editable_height ? { 'editable-height' => editable_height } : {})
|
62
49
|
end
|
63
50
|
|
64
51
|
def serialize_translations
|
@@ -1,14 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative 'props_base_plugin'
|
4
|
-
|
5
3
|
module CKEditor5::Rails::Editor
|
6
|
-
class PropsInlinePlugin
|
7
|
-
attr_reader :code
|
4
|
+
class PropsInlinePlugin
|
5
|
+
attr_reader :name, :code
|
8
6
|
|
9
7
|
def initialize(name, code)
|
10
|
-
|
11
|
-
|
8
|
+
@name = name
|
12
9
|
@code = code
|
13
10
|
validate_code!
|
14
11
|
end
|
@@ -1,14 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative 'props_base_plugin'
|
4
|
-
|
5
3
|
module CKEditor5::Rails::Editor
|
6
|
-
class PropsPlugin
|
7
|
-
attr_reader :js_import_meta
|
4
|
+
class PropsPlugin
|
5
|
+
attr_reader :name, :js_import_meta
|
8
6
|
|
9
|
-
|
10
|
-
super(name)
|
7
|
+
delegate :to_h, to: :import_meta
|
11
8
|
|
9
|
+
def initialize(name, premium: false, **js_import_meta)
|
12
10
|
@name = name
|
13
11
|
@js_import_meta = if js_import_meta.empty?
|
14
12
|
{ import_name: premium ? 'ckeditor5-premium-features' : 'ckeditor5' }
|
data/lib/ckeditor5/rails.rb
CHANGED
@@ -5,7 +5,6 @@ module CKEditor5
|
|
5
5
|
require_relative 'rails/version'
|
6
6
|
require_relative 'rails/version_detector'
|
7
7
|
require_relative 'rails/semver'
|
8
|
-
require_relative 'rails/concerns/checksum'
|
9
8
|
require_relative 'rails/assets/assets_bundle'
|
10
9
|
require_relative 'rails/assets/assets_bundle_html_serializer'
|
11
10
|
require_relative 'rails/helpers'
|
@@ -25,15 +25,9 @@ RSpec.describe CKEditor5::Rails::Context::Props do
|
|
25
25
|
describe '#to_attributes' do
|
26
26
|
subject(:attributes) { props.to_attributes }
|
27
27
|
|
28
|
-
it 'returns integrity property' do
|
29
|
-
expect(attributes[:integrity]).to eq(
|
30
|
-
'24e46c3ee19f6764930b38ecdf62c0ac824a0acbe6616b46199d892afb211acb'
|
31
|
-
)
|
32
|
-
end
|
33
|
-
|
34
28
|
it 'returns a hash with plugins and config keys' do
|
35
29
|
expect(attributes).to be_a(Hash)
|
36
|
-
expect(attributes.keys).to match_array(%i[plugins
|
30
|
+
expect(attributes.keys).to match_array(%i[plugins config])
|
37
31
|
end
|
38
32
|
|
39
33
|
describe ':plugins key' do
|
@@ -28,13 +28,11 @@ RSpec.describe CKEditor5::Rails::Editor::Props do
|
|
28
28
|
|
29
29
|
it 'includes required attributes' do
|
30
30
|
attributes = props.to_attributes
|
31
|
-
|
32
31
|
expect(attributes).to include(
|
33
32
|
type: 'ClassicEditor',
|
34
33
|
translations: String,
|
35
34
|
plugins: String,
|
36
35
|
config: String,
|
37
|
-
integrity: '358d88b83d041f208d94ac957b2fd68135f1caab5c0d101d33cf04d5d39d81ef',
|
38
36
|
watchdog: true
|
39
37
|
)
|
40
38
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ckeditor5
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.16.
|
4
|
+
version: 1.16.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mateusz Bagiński
|
@@ -55,7 +55,6 @@ files:
|
|
55
55
|
- lib/ckeditor5/rails/cdn/ckeditor_bundle.rb
|
56
56
|
- lib/ckeditor5/rails/cdn/helpers.rb
|
57
57
|
- lib/ckeditor5/rails/cdn/url_generator.rb
|
58
|
-
- lib/ckeditor5/rails/concerns/checksum.rb
|
59
58
|
- lib/ckeditor5/rails/context/helpers.rb
|
60
59
|
- lib/ckeditor5/rails/context/props.rb
|
61
60
|
- lib/ckeditor5/rails/editor/editable_height_normalizer.rb
|
@@ -63,7 +62,6 @@ files:
|
|
63
62
|
- lib/ckeditor5/rails/editor/helpers/config_helpers.rb
|
64
63
|
- lib/ckeditor5/rails/editor/helpers/editor_helpers.rb
|
65
64
|
- lib/ckeditor5/rails/editor/props.rb
|
66
|
-
- lib/ckeditor5/rails/editor/props_base_plugin.rb
|
67
65
|
- lib/ckeditor5/rails/editor/props_inline_plugin.rb
|
68
66
|
- lib/ckeditor5/rails/editor/props_plugin.rb
|
69
67
|
- lib/ckeditor5/rails/engine.rb
|
@@ -89,13 +87,11 @@ files:
|
|
89
87
|
- spec/lib/ckeditor5/rails/cdn/ckeditor_bundle_spec.rb
|
90
88
|
- spec/lib/ckeditor5/rails/cdn/helpers_spec.rb
|
91
89
|
- spec/lib/ckeditor5/rails/cdn/url_generator_spec.rb
|
92
|
-
- spec/lib/ckeditor5/rails/concerns/checksum_spec.rb
|
93
90
|
- spec/lib/ckeditor5/rails/context/helpers_spec.rb
|
94
91
|
- spec/lib/ckeditor5/rails/context/props_spec.rb
|
95
92
|
- spec/lib/ckeditor5/rails/editor/editable_height_normalizer_spec.rb
|
96
93
|
- spec/lib/ckeditor5/rails/editor/helpers/config_helpers_spec.rb
|
97
94
|
- spec/lib/ckeditor5/rails/editor/helpers/editor_helpers_spec.rb
|
98
|
-
- spec/lib/ckeditor5/rails/editor/props_base_plugin_spec.rb
|
99
95
|
- spec/lib/ckeditor5/rails/editor/props_inline_plugin_spec.rb
|
100
96
|
- spec/lib/ckeditor5/rails/editor/props_plugin_spec.rb
|
101
97
|
- spec/lib/ckeditor5/rails/editor/props_spec.rb
|
@@ -146,13 +142,11 @@ test_files:
|
|
146
142
|
- spec/lib/ckeditor5/rails/cdn/ckeditor_bundle_spec.rb
|
147
143
|
- spec/lib/ckeditor5/rails/cdn/helpers_spec.rb
|
148
144
|
- spec/lib/ckeditor5/rails/cdn/url_generator_spec.rb
|
149
|
-
- spec/lib/ckeditor5/rails/concerns/checksum_spec.rb
|
150
145
|
- spec/lib/ckeditor5/rails/context/helpers_spec.rb
|
151
146
|
- spec/lib/ckeditor5/rails/context/props_spec.rb
|
152
147
|
- spec/lib/ckeditor5/rails/editor/editable_height_normalizer_spec.rb
|
153
148
|
- spec/lib/ckeditor5/rails/editor/helpers/config_helpers_spec.rb
|
154
149
|
- spec/lib/ckeditor5/rails/editor/helpers/editor_helpers_spec.rb
|
155
|
-
- spec/lib/ckeditor5/rails/editor/props_base_plugin_spec.rb
|
156
150
|
- spec/lib/ckeditor5/rails/editor/props_inline_plugin_spec.rb
|
157
151
|
- spec/lib/ckeditor5/rails/editor/props_plugin_spec.rb
|
158
152
|
- spec/lib/ckeditor5/rails/editor/props_spec.rb
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'digest'
|
4
|
-
require 'json'
|
5
|
-
|
6
|
-
module CKEditor5::Rails::Concerns
|
7
|
-
module Checksum
|
8
|
-
private
|
9
|
-
|
10
|
-
def calculate_object_checksum(obj)
|
11
|
-
json = JSON.generate(obj)
|
12
|
-
Digest::SHA256.hexdigest(json)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module CKEditor5::Rails
|
4
|
-
module Editor
|
5
|
-
class PropsBasePlugin
|
6
|
-
include Concerns::Checksum
|
7
|
-
|
8
|
-
attr_reader :name
|
9
|
-
|
10
|
-
def initialize(name)
|
11
|
-
@name = name
|
12
|
-
end
|
13
|
-
|
14
|
-
def to_h
|
15
|
-
raise NotImplementedError, 'This method must be implemented in a subclass'
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe CKEditor5::Rails::Concerns::Checksum do
|
6
|
-
let(:dummy_class) do
|
7
|
-
Class.new do
|
8
|
-
include CKEditor5::Rails::Concerns::Checksum
|
9
|
-
|
10
|
-
public :calculate_object_checksum
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
subject(:instance) { dummy_class.new }
|
15
|
-
|
16
|
-
describe '#calculate_object_checksum' do
|
17
|
-
it 'returns a 16-character string' do
|
18
|
-
result = instance.calculate_object_checksum({ test: 'value' })
|
19
|
-
expect(result).to eq(
|
20
|
-
'f98be16ebfa861cb39a61faff9e52b33f5bcc16bb6ae72e728d226dc07093932'
|
21
|
-
)
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'returns consistent checksums for the same input' do
|
25
|
-
input = { name: 'test', value: 123 }
|
26
|
-
first_result = instance.calculate_object_checksum(input)
|
27
|
-
second_result = instance.calculate_object_checksum(input)
|
28
|
-
expect(first_result).to eq(second_result)
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'returns different checksums for different inputs' do
|
32
|
-
result1 = instance.calculate_object_checksum({ a: 1 })
|
33
|
-
result2 = instance.calculate_object_checksum({ a: 2 })
|
34
|
-
expect(result1).not_to eq(result2)
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'handles arrays' do
|
38
|
-
result = instance.calculate_object_checksum([1, 2, 3])
|
39
|
-
expect(result).to eq(
|
40
|
-
'a615eeaee21de5179de080de8c3052c8da901138406ba71c38c032845f7d54f4'
|
41
|
-
)
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'is order dependent for hashes' do
|
45
|
-
result1 = instance.calculate_object_checksum({ a: 1, b: 2 })
|
46
|
-
result2 = instance.calculate_object_checksum({ b: 2, a: 1 })
|
47
|
-
expect(result1).not_to eq(result2)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe CKEditor5::Rails::Editor::PropsBasePlugin do
|
6
|
-
let(:concrete_class) do
|
7
|
-
Class.new(described_class) do
|
8
|
-
def to_unsafe_h
|
9
|
-
{ type: :test, name: name }
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
let(:instance) { concrete_class.new(:TestPlugin) }
|
15
|
-
|
16
|
-
describe '#initialize' do
|
17
|
-
it 'sets the name attribute' do
|
18
|
-
expect(instance.name).to eq(:TestPlugin)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe '#to_h' do
|
23
|
-
it 'raises NotImplementedError' do
|
24
|
-
expect { instance.to_h }.to raise_error(NotImplementedError)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|