dynamicweb/cms/tests/frontend/unit/cms.plugins.test.js

2452 lines
94 KiB
JavaScript

/* globals window, document */
'use strict';
import Plugin from '../../../static/cms/js/modules/cms.plugins';
import CMS, { Helpers, KEYS } from '../../../static/cms/js/modules/cms.base';
import Modal from '../../../static/cms/js/modules/cms.modal';
import Messages from '../../../static/cms/js/modules/cms.messages';
import Clipboard from '../../../static/cms/js/modules/cms.clipboard';
import $ from 'jquery';
import { rewire, resetRewire } from './helpers/rewire';
vi.mock('../../../static/cms/js/modules/loader', async () => {
const { lazyMock, registerActual } = await import('./helpers/rewire');
registerActual('loader', await vi.importActual('../../../static/cms/js/modules/loader'));
return lazyMock('loader', { showLoader: 'showLoader', hideLoader: 'hideLoader' });
});
vi.mock('../../../static/cms/js/modules/cms.modal', async () => {
const { lazyMock, registerActual } = await import('./helpers/rewire');
registerActual('cms.modal', await vi.importActual('../../../static/cms/js/modules/cms.modal'));
return lazyMock('cms.modal', { default: 'Modal' });
});
vi.mock('../../../static/cms/js/modules/cms.structureboard', async () => {
const { lazyMock } = await import('./helpers/rewire');
return lazyMock('cms.structureboard', { default: 'StructureBoard' });
});
window.CMS = CMS;
CMS.API = CMS.API || {};
CMS.API.Helpers = Helpers;
CMS.KEYS = KEYS;
CMS.$ = $;
CMS.Plugin = Plugin;
CMS.Modal = Modal;
CMS.Messages = Messages;
CMS.Clipboard = Clipboard;
CMS.API.Clipboard = new CMS.Clipboard();
var showLoader;
var hideLoader;
describe('CMS.Plugin', function() {
fixture.setBase('cms/tests/frontend/unit/fixtures');
it('creates a Plugin class', function() {
expect(CMS.Plugin).toBeDefined();
});
it('has public API', function() {
expect(CMS.Plugin.prototype.addPlugin).toEqual(jasmine.any(Function));
expect(CMS.Plugin.prototype.editPlugin).toEqual(jasmine.any(Function));
expect(CMS.Plugin.prototype.copyPlugin).toEqual(jasmine.any(Function));
expect(CMS.Plugin.prototype.cutPlugin).toEqual(jasmine.any(Function));
expect(CMS.Plugin.prototype.pastePlugin).toEqual(jasmine.any(Function));
expect(CMS.Plugin.prototype.movePlugin).toEqual(jasmine.any(Function));
expect(CMS.Plugin.prototype.deletePlugin).toEqual(jasmine.any(Function));
expect(CMS.Plugin.prototype.destroy).toEqual(jasmine.any(Function));
expect(CMS.Plugin.prototype.cleanup).toEqual(jasmine.any(Function));
expect(CMS.Plugin.prototype.editPluginPostAjax).toEqual(jasmine.any(Function));
});
beforeEach(function(done) {
showLoader = jasmine.createSpy();
hideLoader = jasmine.createSpy();
rewire('showLoader', showLoader);
rewire('hideLoader', hideLoader);
$(function() {
CMS.settings = {
dragbars: [],
states: []
};
// isStructureReady()/isContentReady() are module private, and
// legacy_mode is what makes both of them true
CMS.config = $.extend(true, { settings: {} }, CMS.config);
CMS.config.settings.legacy_mode = true;
spyOn(CMS.API.Helpers, 'setSettings').and.callFake(function(value) {
CMS.settings = $.extend(true, {}, CMS.settings, value);
});
done();
});
});
afterEach(function() {
Plugin.aliasPluginDuplicatesMap = {};
Plugin.staticPlaceholderDuplicatesMap = {};
$(document).off('dblclick.cms.plugin pointerover.cms.plugin pointerout.cms.plugin');
resetRewire('showLoader');
resetRewire('hideLoader');
});
describe('instance', function() {
var plugin1;
var plugin2;
var placeholder1;
var generic;
beforeEach(function(done) {
fixture.load('plugins.html');
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
lang: {}
};
CMS.settings = {
dragbars: [],
states: []
};
$(function() {
plugin1 = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
plugin2 = new CMS.Plugin('cms-plugin-2', {
type: 'plugin',
plugin_id: 2,
plugin_type: 'RandomPlugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/2/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/2/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
placeholder1 = new CMS.Plugin('cms-placeholder-1', {
type: 'placeholder',
placeholder_id: 1
});
generic = new CMS.Plugin('cms-plugin-cms-page-changelist-33');
done();
});
});
afterEach(function() {
fixture.cleanup();
});
it('has ui depending on the type', function() {
expect(plugin1.ui).toEqual(jasmine.any(Object));
expect(plugin2.ui).toEqual(jasmine.any(Object));
expect(placeholder1.ui).toEqual(jasmine.any(Object));
expect(generic.ui).toEqual(jasmine.any(Object));
expect(plugin1.ui.container).toExist();
expect(plugin1.ui.dragbar).not.toBeDefined();
expect(plugin1.ui.draggable).toExist();
expect(plugin1.ui.draggables).not.toExist();
expect(plugin1.ui.submenu).toExist();
expect(plugin1.ui.dropdown).toExist();
expect(plugin1.ui.dragitem).toExist();
expect(plugin2.ui.container).toExist();
expect(plugin2.ui.dragbar).not.toBeDefined();
expect(plugin2.ui.draggable).toExist();
expect(plugin2.ui.draggables).toExist();
expect(plugin2.ui.submenu).toExist();
expect(plugin2.ui.dropdown).toExist();
expect(plugin2.ui.dragitem).toExist();
expect(placeholder1.ui.container).toExist();
expect(placeholder1.ui.dragbar).toExist();
expect(placeholder1.ui.draggable.selector).toEqual('.cms-draggable-null');
expect(placeholder1.ui.draggables).toExist();
expect(placeholder1.ui.submenu).toExist();
expect(placeholder1.ui.dropdown).toExist();
expect(placeholder1.ui.dragitem).not.toBeDefined();
expect(generic.ui.container).toExist();
expect(generic.ui.dragbar).not.toBeDefined();
expect(generic.ui.draggable).not.toBeDefined();
expect(generic.ui.draggables).not.toBeDefined();
expect(generic.ui.submenu).not.toBeDefined();
expect(generic.ui.dropdown).not.toBeDefined();
expect(generic.ui.dragitem).not.toBeDefined();
});
it('has options', function() {
expect(plugin1.options).toEqual({
type: 'plugin',
placeholder_id: 1,
plugin_type: 'TextPlugin',
plugin_id: 1,
plugin_parent: null,
plugin_restriction: jasmine.any(Array),
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
expect(plugin1.options.plugin_restriction.length).toEqual(0);
expect(plugin2.options).toEqual({
type: 'plugin',
placeholder_id: 1,
plugin_type: 'RandomPlugin',
plugin_id: 2,
plugin_parent: null,
plugin_restriction: jasmine.any(Array),
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/2/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/2/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
expect(plugin2.options.plugin_restriction.length).toEqual(0);
expect(placeholder1.options).toEqual({
type: 'placeholder',
placeholder_id: 1,
plugin_type: '',
plugin_id: null,
plugin_parent: null,
plugin_restriction: jasmine.any(Array),
urls: {
add_plugin: '',
edit_plugin: '',
move_plugin: '',
copy_plugin: '',
delete_plugin: ''
}
});
expect(placeholder1.options.plugin_restriction.length).toEqual(0);
expect(generic.options).toEqual({
type: '',
placeholder_id: null,
plugin_type: '',
plugin_id: null,
plugin_parent: null,
plugin_restriction: jasmine.any(Array),
urls: {
add_plugin: '',
edit_plugin: '',
move_plugin: '',
copy_plugin: '',
delete_plugin: ''
}
});
expect(generic.options.plugin_restriction.length).toEqual(0);
});
it('sets its options to the dom node', function() {
expect(plugin1.ui.container.data('cms')).toEqual(jasmine.arrayContaining([plugin1.options]));
expect(plugin2.ui.container.data('cms')).toEqual(jasmine.arrayContaining([plugin2.options]));
expect(placeholder1.ui.container.data('cms')).toEqual(placeholder1.options);
expect(generic.ui.container.data('cms')).toEqual(jasmine.arrayContaining([generic.options]));
});
it('doesnt reset the ui if the same plugin is initialized twice (alias case)', function() {
spyOn(Plugin.prototype, '_setPlugin');
spyOn(Plugin.prototype, '_setPlaceholder');
spyOn(Plugin.prototype, '_setGeneric');
expect(Plugin.aliasPluginDuplicatesMap[plugin1.options.plugin_id]).toEqual(true);
new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
expect(Plugin.aliasPluginDuplicatesMap[plugin1.options.plugin_id]).toEqual(true);
expect(Plugin.prototype._setPlugin).not.toHaveBeenCalled();
expect(Plugin.prototype._setPlaceholder).not.toHaveBeenCalled();
expect(Plugin.prototype._setGeneric).not.toHaveBeenCalled();
});
it('doesnt reset the ui if the same placeholder is initialized twice (static placeholders)', function() {
spyOn(Plugin.prototype, '_setPlugin');
spyOn(Plugin.prototype, '_setPlaceholder');
spyOn(Plugin.prototype, '_setGeneric');
expect(Plugin.staticPlaceholderDuplicatesMap[placeholder1.options.placeholder_id]).toEqual(true);
new CMS.Plugin('cms-placeholder-1', {
type: 'placeholder',
placeholder_id: 1
});
expect(Plugin.staticPlaceholderDuplicatesMap[placeholder1.options.placeholder_id]).toEqual(true);
expect(Plugin.prototype._setPlugin).not.toHaveBeenCalled();
expect(Plugin.prototype._setPlaceholder).not.toHaveBeenCalled();
expect(Plugin.prototype._setGeneric).not.toHaveBeenCalled();
});
it('checks if pasting into this plugin is allowed', function() {
jasmine.clock().install();
spyOn(CMS.Plugin.prototype, '_checkIfPasteAllowed');
Plugin.aliasPluginDuplicatesMap = {};
Plugin.staticPlaceholderDuplicatesMap = {};
plugin1 = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1
});
jasmine.clock().tick(1);
expect(CMS.Plugin.prototype._checkIfPasteAllowed.calls.count()).toEqual(1);
placeholder1 = new CMS.Plugin('cms-placeholder-1', {
type: 'placeholder',
placeholder_id: 1
});
jasmine.clock().tick(1);
expect(CMS.Plugin.prototype._checkIfPasteAllowed.calls.count()).toEqual(2);
generic = new CMS.Plugin('cms-plugin-cms-page-changelist-33');
jasmine.clock().tick(1);
expect(CMS.Plugin.prototype._checkIfPasteAllowed.calls.count()).toEqual(2);
jasmine.clock().uninstall();
});
it('removes the template tags around the plugin markup', function() {
expect($('template')).not.toBeInDOM();
});
it('adds correct classes to the markup of the plugin', function() {
expect($('.plugin1')).toHaveClass('cms-plugin cms-plugin-1');
expect($('.plugin2')).toHaveClass('cms-plugin cms-plugin-2');
expect($('.generic')).toHaveClass(
'cms-plugin cms-plugin-cms-page-changelist-33 cms-render-model cms-render-model-block'
);
});
describe('handles no top-level element in plugin markup', function() {
var plugin;
beforeEach(function(done) {
fixture.load('plugins_complex_markup.html');
$(function() {
done();
});
});
var testsMap = [
{
pluginId: 99,
name: 'element + element',
expected: [
'<div class="plugin99-1 cms-plugin cms-plugin-99 cms-plugin-start">' +
'element</div>',
'<div class="plugin99-2 cms-plugin cms-plugin-99 cms-plugin-end">' +
'and another element</div>'
]
},
{
pluginId: 100,
name: 'textnode + element',
expected: [
'<cms-plugin class="cms-plugin-text-node cms-plugin cms-plugin-100 cms-plugin-start">\n' +
' text </cms-plugin>',
'<div class="plugin100 cms-plugin cms-plugin-100 cms-plugin-end"> and element</div>'
]
},
{
pluginId: 101,
name: 'textnode + element + textnode',
expected: [
'<cms-plugin class="cms-plugin-text-node cms-plugin cms-plugin-101 cms-plugin-start">\n' +
' text </cms-plugin>',
'<div class="plugin101 cms-plugin cms-plugin-101">element</div>',
'<cms-plugin class="cms-plugin-text-node cms-plugin cms-plugin-101 cms-plugin-end">' +
' another text\n </cms-plugin>'
]
},
{
pluginId: 102,
name: 'element + textnode',
expected: [
'<div class="plugin102 cms-plugin cms-plugin-102 cms-plugin-start">element</div>',
'<cms-plugin class="cms-plugin-text-node cms-plugin cms-plugin-102 cms-plugin-end">' +
' and text\n </cms-plugin>'
]
},
{
pluginId: 103,
name: 'textnode',
expected: [
'<cms-plugin class="cms-plugin-text-node cms-plugin cms-plugin-103 ' +
'cms-plugin-start cms-plugin-end">\n' +
' only text node\n </cms-plugin>'
]
},
{
pluginId: 104,
name: 'textnode + comment',
expected: [
'<cms-plugin class="cms-plugin-text-node cms-plugin cms-plugin-104 ' +
'cms-plugin-start cms-plugin-end">\n' +
' text node </cms-plugin>'
]
},
{
pluginId: 105,
name: 'comment + textnode',
expected: [
'<cms-plugin class="cms-plugin-text-node cms-plugin cms-plugin-105 ' +
'cms-plugin-start cms-plugin-end">' +
' and a text node\n' +
' </cms-plugin>'
]
},
{
pluginId: 106,
name: 'textnode + comment + textnode',
expected: [
'<cms-plugin class="cms-plugin-text-node cms-plugin cms-plugin-106 cms-plugin-start">\n' +
' text node </cms-plugin>',
'<cms-plugin class="cms-plugin-text-node cms-plugin cms-plugin-106 cms-plugin-end">' +
' and a text node\n' +
' </cms-plugin>'
]
},
{
pluginId: 107,
name: 'whitespace textnode + comment + textnode',
expected: [
'<cms-plugin class="cms-plugin-text-node cms-plugin cms-plugin-107 ' +
'cms-plugin-start cms-plugin-end">' +
' and a text node\n' +
' </cms-plugin>'
]
}
];
testsMap.forEach(function(test) {
it('handles ' + test.name, function() {
plugin = new CMS.Plugin('cms-plugin-' + test.pluginId, {
type: 'plugin',
plugin_id: test.pluginId
});
expect($.map(plugin.ui.container, el => el.outerHTML)).toEqual(test.expected);
});
});
});
});
describe('multiple instances of the same plugin', function() {
var plugin;
beforeEach(function(done) {
fixture.load('plugins_complex_markup.html');
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
lang: {}
};
CMS.settings = {
dragbars: [],
states: []
};
$(function() {
plugin = new CMS.Plugin('cms-plugin-108', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
done();
});
});
afterEach(function() {
fixture.cleanup();
});
it('handles it correctly', function() {
expect(plugin.ui.container.length).toEqual(2);
});
});
describe('.addPlugin()', function() {
var plugin;
var modalConstructor = jasmine.createSpy();
class FakeModal {
constructor(...args) {
modalConstructor(...args);
this.ui = {
frame: $('.cms-modal-frame'),
modal: $('.cms-modal')
};
}
}
beforeEach(function(done) {
fixture.load('plugins.html');
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
lang: {}
};
CMS.settings = {
dragbars: [],
states: []
};
jasmine.Ajax.install();
$(function() {
spyOn(CMS.API.Helpers, 'addEventListener');
spyOn(Plugin.prototype, '_getPluginAddPosition').and.returnValue(42);
plugin = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
rewire('Modal', FakeModal);
FakeModal.prototype.on = jasmine.createSpy();
FakeModal.prototype.open = jasmine.createSpy();
done();
});
});
afterEach(function() {
resetRewire('Modal');
jasmine.Ajax.uninstall();
fixture.cleanup();
});
it('opens the edit modal with correct url', function() {
plugin.addPlugin('TextPlugin', 'Text plugin', 12, true);
expect(modalConstructor).toHaveBeenCalledWith({
onClose: false,
redirectOnClose: false
});
expect(FakeModal.prototype.open).toHaveBeenCalledWith({
url: jasmine.any(String),
title: 'Text plugin'
});
expect(FakeModal.prototype.open.calls.mostRecent().args[0].url).toMatch('/en/admin/cms/page/add-plugin?');
expect(FakeModal.prototype.open.calls.mostRecent().args[0].url).toMatch('placeholder_id=1');
expect(FakeModal.prototype.open.calls.mostRecent().args[0].url).toMatch('plugin_type=TextPlugin');
expect(FakeModal.prototype.open.calls.mostRecent().args[0].url).toMatch('plugin_language=en');
expect(FakeModal.prototype.open.calls.mostRecent().args[0].url).toMatch('plugin_parent=12');
expect(FakeModal.prototype.open.calls.mostRecent().args[0].url).toMatch('plugin_position=42');
expect(FakeModal.prototype.open.calls.mostRecent().args[0].url).toMatch('cms_path=');
});
it('skips the edit modal when configured', function() {
plugin.addPlugin('TextPlugin', 'Text plugin', 12, false);
expect(modalConstructor).toHaveBeenCalledWith({
onClose: false,
redirectOnClose: false
});
expect(FakeModal.prototype.open).toHaveBeenCalledWith({
url: '#',
title: 'Text plugin'
});
});
it('opens the modal with correct url', function() {
plugin.options.onClose = 'mock';
plugin.options.redirectOnClose = 'another mock';
plugin.addPlugin('TextPlugin', 'Text plugin');
expect(modalConstructor).toHaveBeenCalledWith({
onClose: 'mock',
redirectOnClose: 'another mock'
});
expect(FakeModal.prototype.open).toHaveBeenCalledWith({
url:
'/en/admin/cms/page/add-plugin/' +
`?placeholder_id=1&plugin_type=TextPlugin&cms_path=${CMS_PATH}` +
'&plugin_language=en&plugin_position=42',
title: 'Text plugin'
});
});
it('adds event to remove any existing "add plugin" placeholders', function() {
plugin.addPlugin('TextPlugin', 'Text plugin');
expect(CMS.API.Helpers.addEventListener).toHaveBeenCalledWith(
'modal-closed.add-plugin',
jasmine.any(Function)
);
$('<div class="cms-add-plugin-placeholder"></div>').prependTo('body');
CMS.API.Helpers.addEventListener.calls.argsFor(0)[1]({}, { instance: plugin.modal });
expect($('.cms-add-plugin-placeholder')).not.toExist();
});
});
describe('.editPlugin()', function() {
var plugin;
var modalConstructor = jasmine.createSpy();
class FakeModal {
constructor(...args) {
modalConstructor(...args);
}
}
beforeEach(function(done) {
rewire('Modal', FakeModal);
spyOn(CMS.API.Helpers, 'addEventListener');
FakeModal.prototype.open = jasmine.createSpy();
fixture.load('plugins.html');
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
lang: {}
};
CMS.settings = {
dragbars: [],
states: []
};
$(function() {
plugin = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
done();
});
});
afterEach(function() {
resetRewire('Modal');
fixture.cleanup();
});
it('creates and opens a modal to edit a plugin', function() {
plugin.editPlugin('/edit-url', 'Test Plugin', 'breadcrumb');
expect(FakeModal.prototype.open).toHaveBeenCalledWith({
url: '/edit-url',
title: 'Test Plugin',
breadcrumbs: 'breadcrumb',
width: 850
});
});
it('creates and opens a modal to edit freshly created plugin', function() {
plugin.editPlugin('/edit-plugin-url', 'Random Plugin', ['breadcrumb']);
expect(FakeModal.prototype.open).toHaveBeenCalledWith({
url: '/edit-plugin-url',
title: 'Random Plugin',
breadcrumbs: ['breadcrumb'],
width: 850
});
});
it('adds events to remove the "add plugin" placeholder', function() {
plugin.editPlugin('/edit-plugin-url', 'Random Plugin', ['breadcrumb']);
expect(CMS.API.Helpers.addEventListener).toHaveBeenCalledWith(
'modal-closed.edit-plugin modal-loaded.edit-plugin',
jasmine.any(Function)
);
$('<div class="cms-add-plugin-placeholder"></div>').prependTo('body');
CMS.API.Helpers.addEventListener.calls.argsFor(0)[1]({}, { instance: plugin.modal });
expect($('.cms-add-plugin-placeholder')).not.toExist();
});
});
describe('.copyPlugin()', function() {
var plugin;
beforeEach(function(done) {
fixture.load('plugins.html');
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
clipboard: {
id: 'clipboardId'
},
lang: {
success: 'Voila!',
error: 'Test error occurred: '
}
};
CMS.settings = {
dragbars: [],
states: []
};
spyOn(CMS.API.Helpers, 'reloadBrowser');
jasmine.Ajax.install();
$(function() {
CMS.API.Messages = new CMS.Messages();
CMS.API.StructureBoard = {
invalidateState: jasmine.createSpy()
};
CMS.API.Toolbar = {
hideLoader: jasmine.createSpy()
};
spyOn(CMS.API.Messages, 'open');
plugin = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
done();
});
});
afterEach(function() {
fixture.cleanup();
jasmine.Ajax.uninstall();
});
it('makes a request to the API', function() {
expect(plugin.copyPlugin(plugin.options)).toEqual(undefined);
var request = jasmine.Ajax.requests.mostRecent();
expect(request.url).toEqual(`/en/admin/cms/page/copy-plugins/?cms_path=${CMS_PATH}`);
expect(request.method).toEqual('POST');
expect(request.data()).toEqual({
source_placeholder_id: ['1'],
source_plugin_id: ['1'],
source_language: ['en'],
target_plugin_id: [''],
target_placeholder_id: ['clipboardId'],
target_language: ['en'],
csrfmiddlewaretoken: ['CSRF_TOKEN']
});
});
it('does not make a request if CMS.API is locked', function() {
CMS.API.locked = true;
expect(plugin.copyPlugin(plugin.options)).toEqual(false);
expect(jasmine.Ajax.requests.count()).toEqual(0);
CMS.API.locked = false;
});
it('shows the success message if request succeeds', function() {
spyOn($, 'ajax').and.callFake(function(ajax) {
ajax.success();
CMS.API.locked = false;
});
plugin.copyPlugin(plugin.options);
expect(CMS.API.Messages.open).toHaveBeenCalledWith({
message: 'Voila!'
});
expect(CMS.API.Helpers.reloadBrowser).not.toHaveBeenCalledWith();
expect(CMS.API.StructureBoard.invalidateState).toHaveBeenCalledWith('COPY', undefined);
});
it('shows the error message if request failed', function() {
spyOn($, 'ajax').and.callFake(function(ajax) {
ajax.error({
responseText: 'everything is wrong'
});
});
plugin.copyPlugin(plugin.options);
expect(CMS.API.Messages.open).toHaveBeenCalledWith({
message: 'Test error occurred: everything is wrong',
error: true
});
});
// not supposed to happen
it('shows generic error message if request failed', function() {
CMS.config.lang.error = '';
spyOn($, 'ajax').and.callFake(function(ajax) {
ajax.error({
responseText: '',
status: 418,
statusText: "I'm a teapot"
});
});
plugin.copyPlugin(plugin.options);
expect(CMS.API.Messages.open).toHaveBeenCalledWith({
message: "418 I'm a teapot",
error: true
});
});
it('locks/unlocks the CMS.API if request is successful', function() {
spyOn($, 'ajax').and.callFake(function(ajax) {
expect(CMS.API.locked).toEqual(true);
ajax.success();
expect(CMS.API.locked).toEqual(false);
});
CMS.API.locked = false;
plugin.copyPlugin(plugin.options);
});
it('locks/unlocks the CMS.API if request is not successful', function() {
spyOn($, 'ajax').and.callFake(function(ajax) {
expect(CMS.API.locked).toEqual(true);
ajax.error({});
expect(CMS.API.locked).toEqual(false);
});
CMS.API.locked = false;
plugin.copyPlugin(plugin.options);
});
it('clears the clipboard first if no options were passed', function() {
CMS.API.Clipboard = new CMS.Clipboard();
spyOn(CMS.API.Clipboard, 'clear').and.callFake(function(callback) {
callback();
});
spyOn($, 'ajax').and.callFake(function(ajax) {
expect(ajax.data).toEqual({
source_placeholder_id: 1,
source_plugin_id: 1,
source_language: 'es',
target_plugin_id: '',
target_placeholder_id: 'clipboardId',
target_language: 'es',
csrfmiddlewaretoken: 'CSRF_TOKEN'
});
CMS.API.locked = false;
});
CMS.config.request.language = 'es';
plugin.copyPlugin();
});
it('clears the clipboard first if source language was passed', function() {
CMS.API.Clipboard = new CMS.Clipboard();
spyOn(CMS.API.Clipboard, 'clear').and.callFake(function(callback) {
callback();
});
spyOn($, 'ajax').and.callFake(function(ajax) {
expect(ajax.data).toEqual({
source_placeholder_id: 1,
source_plugin_id: '',
source_language: 'de',
target_plugin_id: '',
target_placeholder_id: 1,
target_language: 'es',
csrfmiddlewaretoken: 'CSRF_TOKEN'
});
CMS.API.locked = false;
});
CMS.config.request.language = 'es';
plugin.copyPlugin(undefined, 'de');
});
});
describe('.cutPlugin()', function() {
var plugin;
beforeEach(function(done) {
fixture.load('plugins.html');
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
clipboard: {
id: 'clipboardId'
},
lang: {
success: 'Voila!',
error: 'Test error occurred: '
}
};
CMS.settings = {
dragbars: [],
states: []
};
CMS.API.StructureBoard = {
getId: function(el) {
if (el.is('.cms-dragbar')) {
return 1;
}
if (el.is('.cms-draggable')) {
return false;
}
},
getIds: function() {
return [3, 2, 1];
},
invalidateState: jasmine.createSpy()
};
spyOn(CMS.API.Helpers, 'reloadBrowser');
$(function() {
CMS.API.Messages = new CMS.Messages();
spyOn(CMS.API.Messages, 'open');
plugin = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
done();
});
});
afterEach(function() {
fixture.cleanup();
});
it('makes a request to the API', function() {
spyOn($, 'ajax').and.callFake(function(ajax) {
ajax.success();
});
expect(plugin.cutPlugin()).toEqual(undefined);
expect($.ajax).toHaveBeenCalledWith({
url: `/en/admin/cms/page/move-plugin/?cms_path=${CMS_PATH}`,
type: 'POST',
data: {
placeholder_id: 'clipboardId',
plugin_id: 1,
plugin_parent: '',
target_language: 'en',
csrfmiddlewaretoken: 'CSRF_TOKEN'
},
success: jasmine.any(Function),
error: jasmine.any(Function)
});
CMS.API.locked = false;
});
it('shows the success message if request succeeds', function() {
spyOn($, 'ajax').and.callFake(function(ajax) {
ajax.success();
CMS.API.locked = false;
});
plugin.cutPlugin();
expect(CMS.API.Messages.open).toHaveBeenCalledWith({
message: 'Voila!'
});
});
it('does not reload the browser if request succeeds', function() {
spyOn($, 'ajax').and.callFake(function(ajax) {
ajax.success();
CMS.API.locked = false;
});
plugin.cutPlugin();
expect(CMS.API.Helpers.reloadBrowser).not.toHaveBeenCalled();
});
it('shows the error message if request failed', function() {
spyOn($, 'ajax').and.callFake(function(ajax) {
ajax.error({
responseText: 'Cannot cut a plugin'
});
});
plugin.cutPlugin();
expect(CMS.API.Messages.open).toHaveBeenCalledWith({
message: 'Test error occurred: Cannot cut a plugin',
error: true
});
});
// not supposed to happen
it('shows generic error message if request failed', function() {
spyOn($, 'ajax').and.callFake(function(ajax) {
ajax.error({
responseText: '',
status: 418,
statusText: "I'm a teapot"
});
});
CMS.config.lang.error = '';
plugin.cutPlugin();
expect(CMS.API.Messages.open).toHaveBeenCalledWith({
message: "418 I'm a teapot",
error: true
});
});
it('does not make a request if CMS.API is locked', function() {
CMS.API.locked = true;
expect(plugin.cutPlugin()).toEqual(false);
expect(jasmine.Ajax.requests.count()).toEqual(0);
CMS.API.locked = false;
});
it('locks the CMS.API before making the request', function() {
CMS.API.locked = false;
spyOn($, 'ajax');
plugin.cutPlugin();
expect(CMS.API.locked).toEqual(true);
CMS.API.locked = false;
});
it('unlocks the CMS.API if request is successful', function() {
spyOn($, 'ajax').and.callFake(function(ajax) {
expect(CMS.API.locked).toEqual(true);
ajax.success();
expect(CMS.API.locked).toEqual(false);
});
CMS.API.locked = false;
plugin.cutPlugin();
});
it('unlocks the CMS.API if request is not successful', function() {
spyOn($, 'ajax').and.callFake(function(ajax) {
expect(CMS.API.locked).toEqual(true);
ajax.error({});
expect(CMS.API.locked).toEqual(false);
});
CMS.API.locked = false;
plugin.cutPlugin();
});
});
describe('.pastePlugin()', function() {
var plugin;
var clipboardPlugin;
var placeholder;
beforeEach(function(done) {
fixture.load('plugins.html', 'clipboard.html', true);
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
clipboard: {
id: 'clipboardId'
},
lang: {
success: 'Voila!',
error: 'Test error occurred: '
}
};
CMS.settings = {
dragbars: [],
states: []
};
$(function() {
CMS.Plugin._initializeGlobalHandlers();
CMS.API.StructureBoard = {
getId: function() {
return 2;
},
getIds: function() {
return [];
}
};
rewire('StructureBoard', {
actualizePluginCollapseStatus: jasmine.createSpy()
});
spyOn(CMS.Plugin.prototype, 'movePlugin');
CMS._plugins = [
[
'cms-plugin-3',
{
type: 'plugin',
plugin_id: 3,
plugin_type: 'ClipboardPlugin'
}
],
[
'cms-plugin-2',
{
type: 'plugin',
plugin_id: 2,
plugin_type: 'RandomPlugin',
placeholder_id: 2,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/2/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/2/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
}
]
];
clipboardPlugin = new CMS.Plugin(...CMS._plugins[0]);
plugin = new CMS.Plugin(...CMS._plugins[1]);
placeholder = new CMS.Plugin('cms-placeholder-2', {
type: 'placeholder',
placeholder_id: 2
});
done();
});
});
afterEach(function() {
fixture.cleanup();
});
it("moves the clipboard draggable dom node to plugin's child list", function() {
var clipboard = $('.cms-clipboard');
var clipboardDraggable = clipboard.find('.cms-draggable:first');
var clipboardPluginDOM = clipboard.find('.cms-plugin:first');
expect(clipboard).toExist();
expect(clipboardDraggable).toExist();
expect(clipboardPluginDOM).toExist();
plugin.pastePlugin();
expect(plugin.ui.draggables).toContainElement('.cms-draggable-3');
});
it("moves the clipboard draggable dom node placeholder's child list", function() {
var clipboard = $('.cms-clipboard');
var clipboardDraggable = clipboard.find('.cms-draggable:first');
var clipboardPluginDOM = clipboard.find('.cms-plugin:first');
expect(clipboard).toExist();
expect(clipboardDraggable).toExist();
expect(clipboardPluginDOM).toExist();
placeholder.pastePlugin();
expect(placeholder.ui.draggables).toContainElement('.cms-draggable-3');
});
it('triggers correct events on a freshly pasted clipboard plugin', function(done) {
var clipboardPluginDOM = $('.cms-clipboard .cms-draggable:first');
clipboardPluginDOM.on('cms-paste-plugin-update', function() {
done();
});
plugin.pastePlugin();
});
it('triggers correct events on a child list where the plugin was just moved', function(done) {
plugin.ui.draggables.on('cms-structure-update', function() {
setTimeout(function() {
done();
}, 10);
});
plugin.pastePlugin();
});
it('triggers movePlugin on paste plugin eventually', function() {
plugin.pastePlugin();
expect(clipboardPlugin.movePlugin).toHaveBeenCalledWith({
type: 'plugin',
placeholder_id: 2,
plugin_type: 'RandomPlugin',
plugin_id: 2,
plugin_parent: null,
plugin_restriction: jasmine.arrayContaining([]),
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/2/',
move_plugin: '/en/admin/cms/page/move-plugin/',
copy_plugin: '/en/admin/cms/page/copy-plugins/',
delete_plugin: '/en/admin/cms/page/delete-plugin/2/'
},
target: 2,
parent: 2,
move_a_copy: true
});
});
});
describe('.movePlugin()', function() {
var plugin;
beforeEach(function(done) {
fixture.load('plugins.html');
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
clipboard: {
id: 'clipboardId'
},
lang: {
success: 'Voila!',
error: 'Test error occurred: '
}
};
CMS.settings = {
dragbars: [],
states: []
};
spyOn(CMS.API.Helpers, 'reloadBrowser');
jasmine.Ajax.install();
$(function() {
CMS.API.Messages = new CMS.Messages();
spyOn(CMS.API.Messages, 'open');
CMS.API.StructureBoard = {
getId: function(el) {
if (el.is('.cms-dragbar')) {
return 1;
}
if (el.is('.cms-draggable')) {
return false;
}
},
invalidateState: jasmine.createSpy()
};
CMS.API.Toolbar = {
ui: {
revert: $('.cms-toolbar-revert'),
window: $(window)
},
onPublishAvailable: jasmine.createSpy()
};
plugin = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
done();
});
});
afterEach(function() {
fixture.cleanup();
jasmine.Ajax.uninstall();
});
it('makes a request to the API', function() {
CMS.API.locked = false;
expect(plugin.movePlugin()).toEqual(undefined);
var request = jasmine.Ajax.requests.mostRecent();
expect(request.url).toEqual(`/en/admin/cms/page/move-plugin/?cms_path=${CMS_PATH}`);
expect(request.method).toEqual('POST');
expect(request.data()).toEqual({
plugin_id: ['1'],
plugin_parent: [''],
target_language: ['en'],
csrfmiddlewaretoken: ['CSRF_TOKEN']
});
CMS.API.locked = false;
});
it('does not make a request if CMS.API is locked', function() {
CMS.API.locked = true;
expect(plugin.movePlugin()).toEqual(false);
expect(jasmine.Ajax.requests.count()).toEqual(0);
CMS.API.locked = false;
});
it('does not make a request if there is no placeholder in chain of parents', function() {
CMS.API.StructureBoard.getId = function() {
return false;
};
expect(plugin.movePlugin()).toEqual(false);
expect(jasmine.Ajax.requests.count()).toEqual(0);
CMS.API.locked = false;
});
it('does not reload the browser', function() {
CMS.API.locked = false;
spyOn($, 'ajax').and.callFake(function(ajax) {
ajax.success();
});
plugin.options.position = 42;
plugin.movePlugin();
expect(CMS.API.Helpers.reloadBrowser).not.toHaveBeenCalled();
expect(CMS.API.StructureBoard.invalidateState).toHaveBeenCalledWith('MOVE', {
placeholder_id: 1,
plugin_id: 1,
plugin_parent: '',
target_language: 'en',
target_position: 42,
csrfmiddlewaretoken: 'CSRF_TOKEN'
});
});
it('shows and hides the loader if success', function(done) {
spyOn($, 'ajax').and.callFake(function(ajax) {
ajax.success({});
expect(hideLoader).toHaveBeenCalledTimes(1);
done();
});
plugin.movePlugin();
expect(showLoader).toHaveBeenCalledTimes(1);
});
it('shows and hides the loader if error', function(done) {
spyOn($, 'ajax').and.callFake(function(ajax) {
ajax.error({});
expect(hideLoader).toHaveBeenCalledTimes(1);
done();
});
plugin.movePlugin();
expect(showLoader).toHaveBeenCalledTimes(1);
});
it('does not show success animation', function() {
spyOn($, 'ajax').and.callFake(function(ajax) {
ajax.success({});
});
spyOn(Plugin, '_highlightPluginStructure');
plugin.movePlugin();
expect(Plugin._highlightPluginStructure).not.toHaveBeenCalled();
});
it('shows the error message if request failed', function() {
spyOn($, 'ajax').and.callFake(function(ajax) {
ajax.error({
responseText: 'Cannot cut a plugin'
});
});
plugin.movePlugin();
expect(CMS.API.Messages.open).toHaveBeenCalledWith({
message: 'Test error occurred: Cannot cut a plugin',
error: true
});
});
// not supposed to happen
it('shows generic error message if request failed', function() {
spyOn($, 'ajax').and.callFake(function(ajax) {
ajax.error({
responseText: '',
status: 418,
statusText: "I'm a teapot"
});
});
CMS.config.lang.error = '';
plugin.movePlugin();
expect(CMS.API.Messages.open).toHaveBeenCalledWith({
message: "418 I'm a teapot",
error: true
});
});
it('locks the CMS.API before making the request', function() {
CMS.API.locked = false;
spyOn($, 'ajax').and.callFake(function() {
expect(CMS.API.locked).toEqual(true);
});
plugin.movePlugin();
});
it('unlocks the CMS.API if request is successful', function() {
CMS.API.locked = false;
spyOn($, 'ajax').and.callFake(function(ajax) {
expect(CMS.API.locked).toEqual(true);
ajax.success({});
expect(CMS.API.locked).toEqual(false);
});
plugin.movePlugin();
});
it('unlocks the CMS.API if request is not successful', function() {
CMS.API.locked = false;
spyOn($, 'ajax').and.callFake(function(ajax) {
expect(CMS.API.locked).toEqual(true);
ajax.error({});
expect(CMS.API.locked).toEqual(false);
});
plugin.movePlugin();
});
});
describe('.deletePlugin()', function() {
var plugin;
var modalConstructor = jasmine.createSpy();
class FakeModal {
constructor(...args) {
modalConstructor(...args);
}
}
FakeModal.prototype.open = jasmine.createSpy();
beforeEach(function(done) {
rewire('Modal', FakeModal);
fixture.load('plugins.html');
spyOn(CMS.API.Helpers, 'addEventListener').and.callThrough();
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
lang: {}
};
CMS.settings = {
dragbars: [],
states: []
};
$(function() {
plugin = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
done();
});
});
afterEach(function() {
resetRewire('Modal');
fixture.cleanup();
});
it('creates and opens a modal for plugin deletion', function() {
plugin.deletePlugin('delete-url', 'Delete name', 'breadcrumb');
expect(FakeModal.prototype.open).toHaveBeenCalledWith({
url: 'delete-url',
title: 'Delete name',
breadcrumbs: 'breadcrumb'
});
});
it('adds events to remove any existing "add plugin" placeholders', function() {
plugin.deletePlugin();
expect(CMS.API.Helpers.addEventListener).toHaveBeenCalledWith(
'modal-loaded.delete-plugin',
jasmine.any(Function)
);
$('<div class="cms-add-plugin-placeholder"></div>').prependTo('body');
CMS.API.Helpers.addEventListener.calls.argsFor(0)[1]({}, { instance: plugin.modal });
expect($('.cms-add-plugin-placeholder')).not.toExist();
});
});
describe('.destroy()', function() {
var plugin;
beforeEach(function(done) {
fixture.load('plugins.html');
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
lang: {}
};
CMS.settings = {
dragbars: [],
states: []
};
$(function() {
plugin = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
plugin_name: 'Test Text Plugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
done();
});
});
it('removes all the plugin markup', function() {
plugin.destroy({ mustCleanup: true });
expect($('.cms-plugin-1').length).toBe(0);
});
it('removes all the plugin events', function() {
CMS.API.Helpers.$document.on(plugin._getNamepacedEvent(Plugin.click), function() {
throw new Error('This event should never be triggered');
});
plugin.destroy();
CMS.API.Helpers.$document.trigger(plugin._getNamepacedEvent(Plugin.click));
});
});
describe('.cleanup()', function() {
var plugin;
beforeEach(function(done) {
fixture.load('plugins.html');
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
lang: {}
};
CMS.settings = {
dragbars: [],
states: []
};
$(function() {
plugin = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
plugin_name: 'Test Text Plugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
done();
});
});
it('removes all the plugin markup', function() {
plugin.cleanup();
expect($('.cms-plugin-1').length).toBe(0);
});
});
describe('.editPluginPostAjax()', function() {
var plugin;
beforeEach(function(done) {
fixture.load('plugins.html');
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
lang: {}
};
CMS.settings = {
dragbars: [],
states: []
};
$(function() {
plugin = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
plugin_name: 'Test Text Plugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
done();
});
});
afterEach(function() {
fixture.cleanup();
});
it('delegates to editPlugin with url coming from response', function() {
spyOn(plugin, 'editPlugin');
plugin.editPluginPostAjax({}, { url: 'test-url', breadcrumb: 'whatever' });
expect(plugin.editPlugin).toHaveBeenCalledWith(
`test-url?cms_path=${CMS_PATH}`,
'Test Text Plugin',
'whatever'
);
});
});
describe('._scrollToElement', function() {
var plugin;
beforeEach(function(done) {
fixture.load('plugins.html');
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
lang: {}
};
CMS.settings = {
dragbars: [],
states: []
};
$(function() {
plugin = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
plugin_name: 'Test Text Plugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
done();
});
});
afterEach(function() {
fixture.cleanup();
});
it('does nothing if element is in viewport already', function() {
spyOn($.fn, 'animate');
plugin._scrollToElement($('.cms-draggable-2'), { duration: 100, offset: 20 });
expect($.fn.animate).not.toHaveBeenCalled();
});
it('animates structureboard to the point when it is in viewport', function() {
// window, element
spyOn($.fn, 'height').and.returnValues(200, 20);
spyOn($.fn, 'position').and.returnValues({
top: 300
});
spyOn($.fn, 'scrollTop').and.returnValues(30);
spyOn($.fn, 'animate');
plugin._scrollToElement($('<div></div>'), { duration: 100, offset: 20 });
expect($.fn.animate).toHaveBeenCalledWith(
{
scrollTop: 300 + 20 + 20 + 30 - 200
},
100
);
});
it('has default values', function() {
// window, element
spyOn($.fn, 'height').and.returnValues(200, 20);
spyOn($.fn, 'position').and.returnValues({
top: 300
});
spyOn($.fn, 'scrollTop').and.returnValues(30);
spyOn($.fn, 'animate');
plugin._scrollToElement($('<div></div>'));
expect($.fn.animate).toHaveBeenCalledWith(
{
scrollTop: 300 + 20 + 50 + 30 - 200
},
200
);
});
});
describe('._setupActions()', function() {
var plugin;
var tmpl =
'<div class="cms-plugin-picker" data-parent-id="mock"><div class="cms-submenu-item {1}">' +
'<a href="{2}" data-add-form="{3}">Submenu item</a>' +
'</div></div>';
beforeEach(function(done) {
fixture.load('plugins.html');
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
lang: {}
};
CMS.settings = {
dragbars: [],
states: []
};
$(function() {
plugin = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
plugin_name: 'Test Text Plugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
CMS.API.Toolbar = {
_delegate: jasmine.createSpy(),
openAjax: jasmine.createSpy(),
onPublishAvailable: jasmine.createSpy()
};
spyOn(CMS.Plugin, '_hideSettingsMenu');
jasmine.clock().install();
jasmine.clock().tick(1);
done();
});
});
afterEach(function() {
jasmine.clock().uninstall();
fixture.cleanup();
});
it('sets up touch event stopper', function() {
expect(plugin.ui.submenu.parent().find('.cms-submenu-edit')).toHandle(Plugin.touchStart);
spyOn($.Event.prototype, 'stopPropagation');
plugin.ui.submenu.parent().find('.cms-submenu-edit').trigger(Plugin.touchStart);
expect($.Event.prototype.stopPropagation).toHaveBeenCalled();
});
it('sets up click handlers on submenu items', function() {
var nav = $(tmpl.replace('{1}', '').replace('{2}', '#href')).find('> div');
var link = nav.find('a');
plugin._setupActions(nav);
expect(link).toHandle(Plugin.click);
spyOn($.Event.prototype, 'preventDefault');
spyOn($.Event.prototype, 'stopPropagation');
link.trigger(Plugin.click);
expect($.Event.prototype.stopPropagation).toHaveBeenCalledTimes(1);
expect($.Event.prototype.preventDefault).toHaveBeenCalledTimes(1);
});
it('by default delegates to toolbar', function() {
var nav = $(tmpl.replace('{1}', '').replace('{2}', '#href')).find('> div');
var link = nav.find('a');
plugin._setupActions(nav);
link.trigger(Plugin.click);
expect(showLoader).toHaveBeenCalledTimes(1);
expect(hideLoader).toHaveBeenCalledTimes(1);
expect(CMS.API.Toolbar._delegate).toHaveBeenCalledTimes(1);
expect(CMS.API.Toolbar._delegate).toHaveBeenCalledWith(link);
});
it('delegates to add plugin', function() {
spyOn(plugin, 'addPlugin');
var nav = $(tmpl.replace('{1}', '')
.replace('{2}', '#shmock')
.replace('{3}', 'perhaps')).find('> div');
var link = nav.find('a');
link.attr('data-rel', 'add');
plugin._setupActions(nav);
link.trigger(Plugin.click);
expect(plugin.addPlugin).toHaveBeenCalledTimes(1);
expect(plugin.addPlugin).toHaveBeenCalledWith('shmock', 'Submenu item', 'mock', 'perhaps');
});
it('delegates to add ajax plugin', function() {
var nav = $(tmpl.replace('{1}', '').replace('{2}', '#shmock')).find('> div');
var link = nav.find('a');
link.attr('data-rel', 'ajax_add');
link.data('on-success', 'ON_SUCCESS');
link.data('post', { data: 'data' });
link.data('text', 'TEXT');
plugin._setupActions(nav);
link.trigger(Plugin.click);
expect(CMS.API.Toolbar.openAjax).toHaveBeenCalledTimes(1);
expect(CMS.API.Toolbar.openAjax).toHaveBeenCalledWith({
url: '#shmock',
post: JSON.stringify({ data: 'data' }),
text: 'TEXT',
callback: jasmine.any(Function),
onSuccess: 'ON_SUCCESS'
});
});
it('delegates to edit plugin', function() {
var nav = $(tmpl.replace('{1}', '').replace('{2}', '#shmock')).find('> div');
var link = nav.find('a');
link.attr('data-rel', 'edit');
spyOn(plugin, 'editPlugin');
spyOn(plugin, '_getPluginBreadcrumbs').and.returnValue('MockBreadcrumb');
plugin.options = {
urls: { edit_plugin: 'edit_plugin_url' },
plugin_name: 'MockPlugin'
};
plugin._setupActions(nav);
link.trigger(Plugin.click);
expect(plugin.editPlugin).toHaveBeenCalledTimes(1);
expect(plugin.editPlugin).toHaveBeenCalledWith(
`edit_plugin_url?cms_path=${CMS_PATH}`,
'MockPlugin',
'MockBreadcrumb'
);
});
it('delegates to copy-from-language', function() {
var nav = $(tmpl.replace('{1}', '').replace('{2}', '#shmock')).find('> div');
var link = nav.find('a');
link.attr('data-rel', 'copy-lang');
link.attr('data-language', 'MOCK LANGUAGE');
spyOn(plugin, 'copyPlugin');
plugin.options = 'MOCKED OPTIONS';
plugin._setupActions(nav);
link.trigger(Plugin.click);
expect(plugin.copyPlugin).toHaveBeenCalledTimes(1);
expect(plugin.copyPlugin).toHaveBeenCalledWith('MOCKED OPTIONS', 'MOCK LANGUAGE');
});
it('delegates to copyPlugin', function() {
var nav = $(tmpl.replace('{1}', '').replace('{2}', '#shmock')).find('> div');
var link = nav.find('a');
link.attr('data-rel', 'copy');
link.parent().addClass('cms-submenu-item-disabled');
spyOn(plugin, 'copyPlugin');
plugin.options = 'MOCKED OPTIONS';
plugin._setupActions(nav);
link.trigger(Plugin.click);
expect(plugin.copyPlugin).not.toHaveBeenCalled();
expect(hideLoader).toHaveBeenCalledTimes(1);
link.parent().removeClass('cms-submenu-item-disabled');
link.trigger(Plugin.click);
expect(plugin.copyPlugin).toHaveBeenCalledTimes(1);
expect(hideLoader).toHaveBeenCalledTimes(1);
});
it('delegates to cutPlugin', function() {
var nav = $(tmpl.replace('{1}', '').replace('{2}', '#shmock')).find('> div');
var link = nav.find('a');
link.attr('data-rel', 'cut');
spyOn(plugin, 'cutPlugin');
plugin._setupActions(nav);
link.trigger(Plugin.click);
expect(plugin.cutPlugin).toHaveBeenCalledTimes(1);
});
it('delegates to pastePlugin', function() {
var nav = $(tmpl.replace('{1}', '').replace('{2}', '#shmock')).find('> div');
var link = nav.find('a');
link.attr('data-rel', 'paste');
link.parent().addClass('cms-submenu-item-disabled');
spyOn(plugin, 'pastePlugin');
plugin.options = 'MOCKED OPTIONS';
plugin._setupActions(nav);
link.trigger(Plugin.click);
expect(plugin.pastePlugin).not.toHaveBeenCalled();
expect(hideLoader).toHaveBeenCalledTimes(1);
link.parent().removeClass('cms-submenu-item-disabled');
link.trigger(Plugin.click);
expect(plugin.pastePlugin).toHaveBeenCalledTimes(1);
expect(hideLoader).toHaveBeenCalledTimes(2);
});
it('delegates to deletePlugin', function() {
var nav = $(tmpl.replace('{1}', '').replace('{2}', '#shmock')).find('> div');
var link = nav.find('a');
link.attr('data-rel', 'delete');
spyOn(plugin, 'deletePlugin');
spyOn(plugin, '_getPluginBreadcrumbs').and.returnValue('Breadcrumb');
plugin._setupActions(nav);
plugin.options = {
urls: { delete_plugin: 'DELETE_URL' },
plugin_name: 'MockPlugin'
};
link.trigger(Plugin.click);
expect(plugin.deletePlugin).toHaveBeenCalledTimes(1);
expect(plugin.deletePlugin).toHaveBeenCalledWith(
`DELETE_URL?cms_path=${CMS_PATH}`,
'MockPlugin',
'Breadcrumb'
);
});
});
describe('_setupKeyBoardTraversing()', function() {
var plugin;
beforeEach(function(done) {
fixture.load('plugins.html');
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
lang: {}
};
CMS.settings = {
dragbars: [],
states: []
};
$(function() {
plugin = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
plugin_name: 'Test Text Plugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
CMS.API.Toolbar = {
_delegate: jasmine.createSpy(),
openAjax: jasmine.createSpy(),
onPublishAvailable: jasmine.createSpy()
};
done();
});
});
afterEach(function() {
$(document).off('.traverse');
fixture.cleanup();
});
it('returns if there is no plugin picker in the modal', function() {
expect(plugin._setupKeyboardTraversing()).toEqual(undefined);
expect($(document)).not.toHandle(plugin._getNamepacedEvent(Plugin.keyDown, 'traverse'));
});
it('unbinds old traversing keydown events', function() {
$(fixture.el).append('<div class="cms-modal-markup"></div>');
plugin.ui.dragitem.find('.cms-plugin-picker').appendTo('.cms-modal-markup');
var spy = jasmine.createSpy();
$(document).on(plugin._getNamepacedEvent(Plugin.keyDown, 'traverse'), spy);
plugin._setupKeyboardTraversing();
$(document).trigger(plugin._getNamepacedEvent(Plugin.keyDown, 'traverse'));
expect(spy).not.toHaveBeenCalled();
});
it('binds traversing keydown events', function() {
$(fixture.el).append('<div class="cms-modal-markup"></div>');
plugin.ui.dragitem.find('.cms-plugin-picker').show().appendTo('.cms-modal-markup');
plugin._setupKeyboardTraversing();
var down = new $.Event(plugin._getNamepacedEvent(Plugin.keyDown, 'traverse'), {
keyCode: CMS.KEYS.DOWN
});
var down1 = new $.Event(plugin._getNamepacedEvent(Plugin.keyDown, 'traverse'), {
keyCode: CMS.KEYS.TAB
});
var up = new $.Event(plugin._getNamepacedEvent(Plugin.keyDown, 'traverse'), {
keyCode: CMS.KEYS.UP
});
var up1 = new $.Event(plugin._getNamepacedEvent(Plugin.keyDown, 'traverse'), {
keyCode: CMS.KEYS.TAB,
shiftKey: true
});
spyOn($.Event.prototype, 'preventDefault');
$(document).trigger(down);
expect($.Event.prototype.preventDefault).toHaveBeenCalledTimes(1);
$(document).trigger(down1);
expect($.Event.prototype.preventDefault).toHaveBeenCalledTimes(2);
$(document).trigger(up);
expect($.Event.prototype.preventDefault).toHaveBeenCalledTimes(3);
$(document).trigger(up1);
expect($.Event.prototype.preventDefault).toHaveBeenCalledTimes(4);
});
});
describe('_filterPluginsList()', function() {
var plugin;
var picker;
var items;
var titles;
beforeEach(function(done) {
fixture.load('plugins.html');
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
lang: {}
};
CMS.settings = {
dragbars: [],
states: []
};
$(function() {
plugin = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
plugin_name: 'Test Text Plugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
picker = $('.cms-plugin-picker');
picker.appendTo(fixture.el).show();
items = picker.find('.cms-submenu-item');
titles = picker.find('.cms-submenu-item-title');
CMS.API.Toolbar = {
_delegate: jasmine.createSpy(),
openAjax: jasmine.createSpy()
};
done();
});
});
afterEach(function() {
fixture.cleanup();
});
it('shows everything if empty query is given', function() {
expect(items.add(titles)).toBeVisible();
items.add(titles).hide();
expect(items.add(titles)).not.toBeVisible();
expect(plugin._filterPluginsList(picker, $('<input value="">'))).toEqual(false);
expect(items.add(titles)).toBeVisible();
});
it('shows nothing if non-matching query is given', function() {
expect(items.add(titles)).toBeVisible();
items.add(titles).hide();
expect(items.add(titles)).not.toBeVisible();
expect(plugin._filterPluginsList(picker, $('<input value="ask;dfjha;ksjdfhaksjdhf">'))).not.toEqual(false);
expect(items.add(titles)).not.toBeVisible();
});
it('filters plugins', function() {
expect(plugin._filterPluginsList(picker, $('<input value="Text">'))).not.toEqual(false);
expect(items.filter(':visible').length).toEqual(2);
expect(titles.filter(':visible').length).toEqual(1);
expect(titles.filter(':visible').text()).toMatch(/Generic/);
expect(plugin._filterPluginsList(picker, $('<input value="Style">'))).not.toEqual(false);
expect(items.filter(':visible').length).toEqual(2);
expect(titles.filter(':visible').length).toEqual(1);
expect(titles.filter(':visible').text()).toMatch(/Generic/);
});
it('filters categories', function() {
expect(plugin._filterPluginsList(picker, $('<input value="Bootstrap">'))).not.toEqual(false);
expect(items.filter(':visible').length).toEqual(15);
expect(titles.filter(':visible').length).toEqual(1);
expect(titles.filter(':visible').text()).toMatch(/Bootstrap/);
});
});
describe('_getPluginBreadcrumbs()', function() {
var plugin;
beforeEach(function(done) {
fixture.load('plugins.html');
$(function() {
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
lang: {}
};
CMS.settings = {
dragbars: [],
states: []
};
plugin = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
plugin_name: 'Test Text Plugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
done();
});
});
it('returns own breadcrumb if plugin has no parents', function() {
expect(plugin._getPluginBreadcrumbs()).toEqual([
{
url: '/en/admin/cms/page/edit-plugin/1/',
title: 'Test Text Plugin'
}
]);
});
// although this shouldn't happen
it('returns own breadcrumb if plugin has a parent but it does not exist in the registry', function() {
CMS._plugins = null;
plugin.options.plugin_parent = 140;
expect(plugin._getPluginBreadcrumbs()).toEqual([
{
url: '/en/admin/cms/page/edit-plugin/1/',
title: 'Test Text Plugin'
}
]);
});
it('returns array of breadcrumbs if plugin has parent', function() {
CMS._plugins = [
['cms-placeholder-140', {}],
[
'cms-plugin-140',
{
plugin_name: 'Parent plugin',
plugin_parent: 'None',
urls: {
edit_plugin: 'parent-edit-url'
}
}
]
];
plugin.options.plugin_parent = 140;
expect(plugin._getPluginBreadcrumbs()).toEqual([
{
url: 'parent-edit-url',
title: 'Parent plugin'
},
{
url: '/en/admin/cms/page/edit-plugin/1/',
title: 'Test Text Plugin'
}
]);
});
it('returns array of breadcrumbs if plugin has multiple parents', function() {
CMS._plugins = [
['cms-placeholder-140', {}],
[
'cms-plugin-140',
{
plugin_name: 'Parent plugin',
plugin_parent: 130,
urls: {
edit_plugin: 'parent-edit-url'
}
}
],
[
'cms-plugin-130',
{
plugin_name: 'Parent Parent plugin',
urls: {
edit_plugin: 'parent-parent-edit-url'
}
}
]
];
plugin.options.plugin_parent = 140;
expect(plugin._getPluginBreadcrumbs()).toEqual([
{
url: 'parent-parent-edit-url',
title: 'Parent Parent plugin'
},
{
url: 'parent-edit-url',
title: 'Parent plugin'
},
{
url: '/en/admin/cms/page/edit-plugin/1/',
title: 'Test Text Plugin'
}
]);
});
it('is not lazy', function() {
spyOn($, 'grep').and.callThrough();
CMS._plugins = [
[
'cms-plugin-140',
{
plugin_name: 'Parent plugin',
plugin_parent: 'None',
urls: {
edit_plugin: 'parent-edit-url'
}
}
]
];
plugin.options.plugin_parent = 140;
expect(plugin._getPluginBreadcrumbs()).toEqual([
{
url: 'parent-edit-url',
title: 'Parent plugin'
},
{
url: '/en/admin/cms/page/edit-plugin/1/',
title: 'Test Text Plugin'
}
]);
expect($.grep).toHaveBeenCalledTimes(1);
expect(plugin._getPluginBreadcrumbs()).toEqual([
{
url: 'parent-edit-url',
title: 'Parent plugin'
},
{
url: '/en/admin/cms/page/edit-plugin/1/',
title: 'Test Text Plugin'
}
]);
expect($.grep).toHaveBeenCalledTimes(2);
});
});
describe('_getNamepacedEvent', function() {
it('returns a valid namespaced string', function() {
expect(CMS.Plugin.prototype._getNamepacedEvent('click')).toEqual(jasmine.any(String));
expect(CMS.Plugin.prototype._getNamepacedEvent('click', 'traverse')).toMatch(/\.traverse/);
});
});
describe('_getPossibleChildClasses()', function() {
var plugin;
beforeEach(function(done) {
fixture.load('plugins.html');
fixture.load('plugin_child_classes.html');
$(function() {
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
lang: {}
};
CMS.settings = {
dragbars: [],
states: []
};
plugin = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
plugin_name: 'Test Text Plugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
spyOn(plugin, '_getId').and.returnValue(1);
done();
});
});
it('returns markup for child classes based on current plugin/placeholder restrictions', function() {
expect(plugin._getPossibleChildClasses().length).toEqual(163);
expect(plugin._getPossibleChildClasses()).toEqual(jasmine.any($));
});
it('returns markup for child classes based on current plugin/placeholder restrictions', function() {
plugin.options.plugin_restriction = ['Bootstrap3AlertCMSPlugin'];
expect(plugin._getPossibleChildClasses().length).toEqual(2);
expect(plugin._getPossibleChildClasses()).toEqual(jasmine.any($));
expect(plugin._getPossibleChildClasses().eq(0)).toHaveClass('cms-submenu-item-title');
expect(plugin._getPossibleChildClasses().eq(0)).toHaveClass('cms-submenu-item');
expect(plugin._getPossibleChildClasses().eq(1)).not.toHaveClass('cms-submenu-item-title');
expect(plugin._getPossibleChildClasses().eq(1)).toHaveClass('cms-submenu-item');
expect(plugin._getPossibleChildClasses().eq(0)).toHaveText('Bootstrap3');
expect(plugin._getPossibleChildClasses().eq(1)).toHaveText('Alert');
});
it('returns markup for child classes based on current plugin/placeholder restrictions', function() {
plugin.options.plugin_restriction = ['UpcomingPlugin', 'CalendarPlugin', 'TextPlugin'];
expect(plugin._getPossibleChildClasses().length).toEqual(5);
expect(plugin._getPossibleChildClasses()).toEqual(jasmine.any($));
expect(plugin._getPossibleChildClasses().eq(0)).toHaveClass('cms-submenu-item-title');
expect(plugin._getPossibleChildClasses().eq(0)).toHaveClass('cms-submenu-item');
expect(plugin._getPossibleChildClasses().eq(1)).not.toHaveClass('cms-submenu-item-title');
expect(plugin._getPossibleChildClasses().eq(1)).toHaveClass('cms-submenu-item');
expect(plugin._getPossibleChildClasses().eq(2)).not.toHaveClass('cms-submenu-item-title');
expect(plugin._getPossibleChildClasses().eq(2)).toHaveClass('cms-submenu-item');
expect(plugin._getPossibleChildClasses().eq(3)).toHaveClass('cms-submenu-item-title');
expect(plugin._getPossibleChildClasses().eq(3)).toHaveClass('cms-submenu-item');
expect(plugin._getPossibleChildClasses().eq(4)).not.toHaveClass('cms-submenu-item-title');
expect(plugin._getPossibleChildClasses().eq(4)).toHaveClass('cms-submenu-item');
expect(plugin._getPossibleChildClasses().eq(0)).toHaveText('Events');
expect(plugin._getPossibleChildClasses().eq(1)).toHaveText('Calendar');
expect(plugin._getPossibleChildClasses().eq(2)).toHaveText('Upcoming or Past Events');
expect(plugin._getPossibleChildClasses().eq(3)).toHaveText('Generic');
expect(plugin._getPossibleChildClasses().eq(4)).toHaveText('Text');
});
it('attaches event handlers for adding these plugins', function() {
spyOn(CMS.Plugin.prototype, 'addPlugin');
expect(plugin._getPossibleChildClasses().find('a')).toHandle(Plugin.click);
plugin._getPossibleChildClasses().find('a').eq(1).trigger(Plugin.click);
expect(plugin.addPlugin).toHaveBeenCalledTimes(1);
});
it('is not lazy', function() {
plugin.options.plugin_restriction = ['Bootstrap3AlertCMSPlugin'];
spyOn($.fn, 'filter').and.callThrough();
plugin._getPossibleChildClasses();
expect($.fn.filter).toHaveBeenCalledTimes(2);
plugin._getPossibleChildClasses();
plugin._getPossibleChildClasses();
plugin._getPossibleChildClasses();
expect($.fn.filter).toHaveBeenCalledTimes(8);
});
});
describe('CMS.Plugin._highlightPluginContent()', function() {
var plugin;
beforeEach(function(done) {
fixture.load('plugins.html');
$(function() {
CMS.config = {
settings: { legacy_mode: true },
csrf: 'CSRF_TOKEN',
request: {
language: 'en'
},
lang: {}
};
CMS.settings = {
dragbars: [],
states: []
};
plugin = new CMS.Plugin('cms-plugin-1', {
type: 'plugin',
plugin_id: 1,
plugin_type: 'TextPlugin',
plugin_name: 'Test Text Plugin',
placeholder_id: 1,
urls: {
add_plugin: '/en/admin/cms/page/add-plugin/',
edit_plugin: '/en/admin/cms/page/edit-plugin/1/',
move_plugin: '/en/admin/cms/page/move-plugin/',
delete_plugin: '/en/admin/cms/page/delete-plugin/1/',
copy_plugin: '/en/admin/cms/page/copy-plugins/'
}
});
spyOn(plugin, '_getId').and.returnValue(1);
done();
});
});
it('appends / deletes success overlay', function(done) {
spyOn($.fn, 'fadeOut').and.callFake(function(timeout, callback) {
// race condition :(
if (timeout !== 200) {
return;
}
expect(timeout).toEqual(200);
setTimeout(function() {
callback.bind($('.cms-plugin-overlay'))();
expect($('.cms-plugin-overlay')).not.toBeInDOM();
done();
}, 1600);
});
Plugin._highlightPluginContent(1);
expect($('.cms-plugin-overlay')).toBeInDOM();
});
});
});