diff --git a/test/specs/dom_components/model/Symbols.js b/test/specs/dom_components/model/Symbols.js
index 82de07d16..a78a8d5c7 100644
--- a/test/specs/dom_components/model/Symbols.js
+++ b/test/specs/dom_components/model/Symbols.js
@@ -1,10 +1,15 @@
import Editor from 'editor';
+import { keySymbol, keySymbols } from 'dom_components/model/Component';
describe('Symbols', () => {
let editor;
let wrapper;
const createSymbol = comp => comp.clone({ symbol: 1 });
const simpleComp = '
Component
';
+ const compMultipleNodes = `
+
Component 1
+
Component 2
+
`;
beforeAll(() => {
editor = new Editor();
@@ -59,4 +64,59 @@ describe('Symbols', () => {
expect(comp2.__getSymbol()).toBe(symbol);
expect(comp2.toHTML()).toBe(symbol.toHTML());
});
+
+ test('Symbols and instances are correctly serialized', () => {
+ const comp = wrapper.append(simpleComp)[0];
+ const symbol = createSymbol(comp);
+ const idComp = comp.getId();
+ const idSymb = symbol.getId();
+ const jsonComp = JSON.parse(JSON.stringify(comp));
+ const jsonSymb = JSON.parse(JSON.stringify(symbol));
+ expect(jsonComp[keySymbol]).toBe(idSymb);
+ expect(jsonSymb[keySymbols]).toEqual([idComp]);
+ });
+
+ test("Removing one instance doesn't affect others", () => {
+ const comp = wrapper.append(simpleComp)[0];
+ const symbol = createSymbol(comp);
+ const comp2 = createSymbol(comp);
+ wrapper.append(comp2);
+ expect(wrapper.components().length).toBe(2);
+ comp.remove();
+ expect(wrapper.components().length).toBe(1);
+ expect(comp2.__getSymbol()).toBe(symbol);
+ });
+
+ test('New component added to an instance is correctly propogated to all others', () => {
+ const comp = wrapper.append(compMultipleNodes)[0];
+ const compLen = comp.components().length;
+ const symbol = createSymbol(comp);
+ // Create and add 2 instances
+ const comp2 = createSymbol(comp);
+ wrapper.append(comp2);
+ const comp3 = createSymbol(comp2);
+ wrapper.append(comp3);
+ const allInst = [comp, comp2, comp3];
+ const all = [...allInst, symbol];
+ all.forEach(cmp => expect(cmp.components().length).toBe(compLen));
+ expect(wrapper.components().length).toBe(3);
+ // Append new component to one of the instances
+ const added = comp3.append(simpleComp, { at: 0 })[0];
+ // The append should be propagated
+ all.forEach(cmp => expect(cmp.components().length).toBe(compLen + 1));
+ // The new added component became part of the symbol instance
+ const addedSymb = added.__getSymbol();
+ const symbAdded = symbol.components().at(0);
+ expect(addedSymb).toBe(symbAdded);
+ allInst.forEach(cmp =>
+ expect(
+ cmp
+ .components()
+ .at(0)
+ .__getSymbol()
+ ).toBe(symbAdded)
+ );
+ // The new main Symbol should keep the track of all instances
+ expect(symbAdded.__getSymbols().length).toBe(allInst.length);
+ });
});