Commit bc66c035 by lmf

增加文件page-builder

parent c24e354c
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
/* eslint-disable max-nested-callbacks */
/* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */
define([
'jquery',
'Magento_PageBuilder/js/content-type/block/mass-converter/widget-directive'
], function ($, WidgetDirective) {
'use strict';
describe('Magento_PageBuilder/js/content-type/block/mass-converter/widget-directive', function () {
var model;
beforeEach(function () {
model = new WidgetDirective();
});
describe('toDom', function () {
it('Should leave html undefined when template is undefined', function () {
var data = {
block_id: 123
},
config = {
html_variable: 'myhtml'
},
result = model.toDom(data, config);
expect(result.myhtml).toBe(undefined);
});
it('Should leave html undefined when block_id is undefined', function () {
var data = {
template: 'foobar'
},
config = {
html_variable: 'myhtml'
},
result = model.toDom(data, config);
expect(result.myhtml).toBe(undefined);
});
it('Should transform html when template and block_id are set', function () {
var data = {
template: 'foobar',
block_id: 123
},
config = {
html_variable: 'myhtml'
},
result = model.toDom(data, config);
expect(result.myhtml).toMatch(/^\{\{widget\s.*\}\}$/);
expect(result.myhtml).toContain(' template="foobar"');
expect(result.myhtml).toContain(' block_id="123"');
expect(result.myhtml).toContain(' type="Magento\\Cms\\Block\\Widget\\Block"');
expect(result.myhtml).toContain(' type_name="CMS Static Block"');
});
});
describe('fromDom', function () {
it('Should parse regular properties', function () {
var expected = {
template: 'foobar',
block_id: '123'
},
config = {
html_variable: 'myhtml'
},
attributes = {
myhtml: '{{widget template="foobar" block_id="123" type_name="CMS Static Block" ' +
'type="Magento\\Cms\\Block\\Widget\\Block"}}'
},
result = model.fromDom(attributes, config);
expect(result.template).toBe(expected.template);
expect(result.block_id).toBe(expected.block_id);
// assert the automatically added properties do not get returned.
expect(result.type).toBe(undefined);
expect(result.type_name).toBe(undefined);
});
});
});
});
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
/* eslint-disable max-nested-callbacks */
/* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */
define([
'jquery',
'Magento_PageBuilder/js/content-type/products/mass-converter/carousel-widget-directive'
], function ($, WidgetDirective) {
'use strict';
describe('Magento_PageBuilder/js/content-type/products/mass-converter/carousel-widget-directive', function () {
var model;
beforeEach(function () {
model = new WidgetDirective();
});
describe('toDom', function () {
it('Should return an empty string when conditions_encoded is null', function () {
var data = {
products_count: 123,
conditions_encoded: null
},
config = {
html_variable: 'myhtml'
},
result = model.toDom(data, config);
expect(result.myhtml).toBe(undefined);
});
it('Should return an empty string when conditions_encoded is false', function () {
var data = {
products_count: 123,
conditions_encoded: false
},
config = {
html_variable: 'myhtml'
},
result = model.toDom(data, config);
expect(result.myhtml).toBe(undefined);
});
it('Should return an empty string when conditions_encoded is empty string', function () {
var data = {
products_count: 123,
conditions_encoded: ''
},
config = {
html_variable: 'myhtml'
},
result = model.toDom(data, config);
expect(result.myhtml).toBe(undefined);
});
it('Should return an empty string when conditions_encoded is empty undefined', function () {
var data = {
products_count: 123
},
config = {
html_variable: 'myhtml'
},
result = model.toDom(data, config);
expect(result.myhtml).toBe(undefined);
});
it('Should transform regular properties', function () {
var data = {
carousel_products_count: 123,
conditions_encoded: '[]',
condition_option: 'condition',
sort_order: 'position'
},
config = {
html_variable: 'myhtml'
},
result = model.toDom(data, config);
expect(result.myhtml).toMatch(/^\{\{widget\s.*\}\}$/);
expect(result.myhtml).toContain(' products_count="123"');
expect(result.myhtml).toContain(' conditions_encoded="[]"');
expect(result.myhtml).toContain(' type="Magento\\CatalogWidget\\Block\\Product\\ProductsList"');
expect(result.myhtml)
.toContain(' template="Magento_PageBuilder::catalog/product/widget/content/carousel.phtml"');
expect(result.myhtml).toContain(' anchor_text=""');
expect(result.myhtml).toContain(' id_path=""');
expect(result.myhtml).toContain(' show_pager="0"');
expect(result.myhtml).toContain(' type_name="Catalog Products Carousel"');
expect(result.myhtml).toContain(' condition_option="condition');
expect(result.myhtml).toContain(' sort_order="position');
expect(result.myhtml).toContain(' condition_option_value=""');
});
it('Should encode conditions_encoded', function () {
var data = {
carousel_products_count: 123,
conditions_encoded: '{"1":{"type":"My\\\\Type","aggregator":"all"}}'
},
config = {
html_variable: 'myhtml'
},
result = model.toDom(data, config),
matchText = '^[`1`:^[`type`:`My||Type`,`aggregator`:`all`^]^]';
expect(result.myhtml).toContain(' conditions_encoded="' + matchText + '"');
expect(result.myhtml).toContain(' type="Magento\\CatalogWidget\\Block\\Product\\ProductsList"');
expect(result.myhtml)
.toContain(' template="Magento_PageBuilder::catalog/product/widget/content/carousel.phtml"');
expect(result.myhtml).toContain(' anchor_text=""');
expect(result.myhtml).toContain(' id_path=""');
expect(result.myhtml).toContain(' show_pager="0"');
expect(result.myhtml).toContain(' type_name="Catalog Products Carousel"');
});
it('Should not add empty sort_order attribute', function () {
var data = {
carousel_products_count: 123,
conditions_encoded: '[]'
},
config = {
html_variable: 'myhtml'
},
result = model.toDom(data, config);
expect(result.myhtml).not.toContain('sort_order');
});
});
describe('fromDom', function () {
it('Should parse regular properties without conditions_encoded', function () {
var expected = {
carousel_products_count: '123',
conditions_encoded: '',
condition_option: 'condition'
},
config = {
html_variable: 'myhtml'
},
attributes = {
myhtml: '{{widget products_count="123"}}'
},
result = model.fromDom(attributes, config);
expect(result.carousel_products_count).toBe(expected.carousel_products_count);
expect(result.conditions_encoded).toBe(expected.conditions_encoded);
expect(result.condition_option).toBe(expected.condition_option);
// assert the automatically added properties do not get returned.
expect(result.type).toBe(undefined);
expect(result.id_path).toBe(undefined);
});
it('Should parse conditions_encoded', function () {
var expected = {
carousel_products_count: '123',
conditions_encoded: '{"1":{"type":"My\\\\Type","aggregator":"all"}}'
},
config = {
html_variable: 'myhtml'
},
attributes = {
myhtml: '{{widget ' +
'products_count="123" ' +
'conditions_encoded="^[`1`:^[`type`:`My||Type`,`aggregator`:`all`^]^]"}}'
},
result = model.fromDom(attributes, config);
expect(result.carousel_products_count).toBe(expected.carousel_products_count);
expect(result.conditions_encoded).toBe(expected.conditions_encoded);
// assert the automatically added properties do not get returned.
expect(result.type).toBe(undefined);
expect(result.id_path).toBe(undefined);
});
});
});
});
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
/* eslint-disable max-nested-callbacks */
/* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */
define([
'jquery',
'Magento_PageBuilder/js/content-type/products/mass-converter/widget-directive'
], function ($, WidgetDirective) {
'use strict';
describe('Magento_PageBuilder/js/content-type/products/mass-converter/widget-directive', function () {
var model;
beforeEach(function () {
model = new WidgetDirective();
});
describe('toDom', function () {
it('Should return an empty string when conditions_encoded is null', function () {
var data = {
products_count: 123,
conditions_encoded: null
},
config = {
html_variable: 'myhtml'
},
result = model.toDom(data, config);
expect(result.myhtml).toBe(undefined);
});
it('Should return an empty string when conditions_encoded is false', function () {
var data = {
products_count: 123,
conditions_encoded: false
},
config = {
html_variable: 'myhtml'
},
result = model.toDom(data, config);
expect(result.myhtml).toBe(undefined);
});
it('Should return an empty string when conditions_encoded is empty string', function () {
var data = {
products_count: 123,
conditions_encoded: ''
},
config = {
html_variable: 'myhtml'
},
result = model.toDom(data, config);
expect(result.myhtml).toBe(undefined);
});
it('Should return an empty string when conditions_encoded is empty undefined', function () {
var data = {
products_count: 123
},
config = {
html_variable: 'myhtml'
},
result = model.toDom(data, config);
expect(result.myhtml).toBe(undefined);
});
it('Should transform regular properties', function () {
var data = {
products_count: 123,
conditions_encoded: '[]',
condition_option: 'condition',
sort_order: 'position'
},
config = {
html_variable: 'myhtml'
},
result = model.toDom(data, config);
expect(result.myhtml).toMatch(/^\{\{widget\s.*\}\}$/);
expect(result.myhtml).toContain(' products_count="123"');
expect(result.myhtml).toContain(' conditions_encoded="[]"');
expect(result.myhtml).toContain(' type="Magento\\CatalogWidget\\Block\\Product\\ProductsList"');
expect(result.myhtml).toContain(' template="Magento_CatalogWidget::product/widget/content/grid.phtml"');
expect(result.myhtml).toContain(' anchor_text=""');
expect(result.myhtml).toContain(' id_path=""');
expect(result.myhtml).toContain(' show_pager="0"');
expect(result.myhtml).toContain(' type_name="Catalog Products List"');
expect(result.myhtml).toContain(' condition_option="condition');
expect(result.myhtml).toContain(' sort_order="position');
expect(result.myhtml).toContain(' condition_option_value=""');
});
it('Should encode conditions_encoded', function () {
var data = {
products_count: 123,
conditions_encoded: '{"1":{"type":"My\\\\Type","aggregator":"all"}}'
},
config = {
html_variable: 'myhtml'
},
result = model.toDom(data, config),
matchText = '^[`1`:^[`type`:`My||Type`,`aggregator`:`all`^]^]';
expect(result.myhtml).toContain(' conditions_encoded="' + matchText + '"');
expect(result.myhtml).toContain(' type="Magento\\CatalogWidget\\Block\\Product\\ProductsList"');
expect(result.myhtml).toContain(' template="Magento_CatalogWidget::product/widget/content/grid.phtml"');
expect(result.myhtml).toContain(' anchor_text=""');
expect(result.myhtml).toContain(' id_path=""');
expect(result.myhtml).toContain(' show_pager="0"');
expect(result.myhtml).toContain(' type_name="Catalog Products List"');
});
it('Should not add empty sort_order attribute', function () {
var data = {
products_count: 123,
conditions_encoded: '[]'
},
config = {
html_variable: 'myhtml'
},
result = model.toDom(data, config);
expect(result.myhtml).not.toContain('sort_order');
});
});
describe('fromDom', function () {
it('Should parse regular properties without conditions_encoded', function () {
var expected = {
products_count: '123',
conditions_encoded: '',
condition_option: 'condition'
},
config = {
html_variable: 'myhtml'
},
attributes = {
myhtml: '{{widget products_count="123"}}'
},
result = model.fromDom(attributes, config);
expect(result.products_count).toBe(expected.products_count);
expect(result.conditions_encoded).toBe(expected.conditions_encoded);
expect(result.condition_option).toBe(expected.condition_option);
// assert the automatically added properties do not get returned.
expect(result.type).toBe(undefined);
expect(result.id_path).toBe(undefined);
});
it('Should parse conditions_encoded', function () {
var expected = {
products_count: '123',
conditions_encoded: '{"1":{"type":"My\\\\Type","aggregator":"all"}}'
},
config = {
html_variable: 'myhtml'
},
attributes = {
myhtml: '{{widget ' +
'products_count="123" ' +
'conditions_encoded="^[`1`:^[`type`:`My||Type`,`aggregator`:`all`^]^]"}}'
},
result = model.fromDom(attributes, config);
expect(result.products_count).toBe(expected.products_count);
expect(result.conditions_encoded).toBe(expected.conditions_encoded);
// assert the automatically added properties do not get returned.
expect(result.type).toBe(undefined);
expect(result.id_path).toBe(undefined);
});
});
});
});
/**
*
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
/* eslint-disable max-nested-callbacks */
define([
'jquery',
'squire'
], function ($, Squire) {
'use strict';
var uploader,
modifierClassSet1 = {
'foo': {
minWidth: 1000
},
'bar': {
minWidth: 3000
},
'baz': {
minWidth: 100,
maxWidth: 200
},
'bash': {
maxWidth: 50
}
},
scenarios = [
{
config: modifierClassSet1,
elementWidth: 1000,
expectedClasses: 'foo'
},
{
config: modifierClassSet1,
elementWidth: 1500,
expectedClasses: 'foo'
},
{
config: modifierClassSet1,
elementWidth: 3100,
expectedClasses: 'foo bar'
},
{
config: modifierClassSet1,
elementWidth: 100,
expectedClasses: 'baz'
},
{
config: modifierClassSet1,
elementWidth: 200,
expectedClasses: 'baz'
},
{
config: modifierClassSet1,
elementWidth: 10,
expectedClasses: 'bash'
},
{
config: modifierClassSet1,
elementWidth: 50,
expectedClasses: 'bash'
}
],
injector = new Squire(),
mocks = {
'Magento_PageBuilder/js/events': {
trigger: jasmine.createSpy()
}
};
beforeEach(function (done) {
injector.mock(mocks);
injector.require(['Magento_PageBuilder/js/form/element/image-uploader'], function (ImageUploader) {
/**
* A stub constructor to bypass the original
* @constructor
*/
var MockUploader = function () {};
MockUploader.prototype = Object.create(ImageUploader.prototype);
MockUploader.prototype.constructor = MockUploader;
uploader = new MockUploader();
uploader.$uploadArea = $('<div/>');
done();
});
});
describe('Magento_PageBuilder/js/form/element/image-uploader', function () {
describe('updateResponsiveClasses', function () {
it('Should do nothing when element is not visible', function () {
spyOn(uploader.$uploadArea, 'is').and.returnValue(false);
spyOn(uploader.$uploadArea, 'removeClass');
spyOn(uploader.$uploadArea, 'addClass');
uploader.updateResponsiveClasses();
// None of the algorithm should have been attempted
expect(uploader.$uploadArea.addClass).not.toHaveBeenCalled();
expect(uploader.$uploadArea.removeClass).not.toHaveBeenCalled();
});
it('Attempts to remove all defined modifier classes', function () {
uploader.elementWidthModifierClasses = {
'foo': {},
'bar': {}
};
spyOn(uploader.$uploadArea, 'is').and.returnValue(true);
spyOn(uploader.$uploadArea, 'removeClass');
uploader.updateResponsiveClasses();
expect(uploader.$uploadArea.removeClass).toHaveBeenCalledWith('foo bar');
});
$.each(scenarios, function (i, scenario) {
it('Should add modifier classes if configuration is met in scenario ' + i, function () {
uploader.elementWidthModifierClasses = scenario.config;
spyOn(uploader.$uploadArea, 'is').and.returnValue(true);
spyOn(uploader.$uploadArea, 'width').and.returnValue(scenario.elementWidth);
spyOn(uploader.$uploadArea, 'addClass');
uploader.updateResponsiveClasses();
expect(uploader.$uploadArea.addClass).toHaveBeenCalledWith(scenario.expectedClasses);
});
});
});
describe('onDeleteFile', function () {
it('Should do nothing when uploader is not associated to the deleted image', function () {
spyOn(uploader, 'getFileId').and.returnValue('foo');
uploader.onDeleteFile({}, {
ids: ['bar']
});
expect(mocks['Magento_PageBuilder/js/events'].trigger).not.toHaveBeenCalled();
});
it('Should trigger an event when uploader is associated to the deleted image', function () {
uploader.id = 'abc123';
/**
* A stub function to spy on.
*/
uploader.value = function () {};
spyOn(uploader, 'value');
spyOn(uploader, 'getFileId').and.returnValue('foo');
uploader.onDeleteFile({}, {
ids: ['foo']
});
expect(mocks['Magento_PageBuilder/js/events'].trigger)
.toHaveBeenCalledWith('image:abc123:deleteFileAfter');
// Assert the instance was reset
expect(uploader.value).toHaveBeenCalledWith([]);
});
});
});
});
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
/* eslint-disable max-nested-callbacks */
define([
'jquery',
'Magento_PageBuilder/js/form/element/page-ui-select',
'ko'
], function ($, PageUiSelect, ko) {
'use strict';
describe('Magento_PageBuilder/js/form/element/page-ui-select', function () {
var model;
beforeEach(function () {
model = new PageUiSelect({
name: 'uiSelect',
dataScope: '',
provider: 'provider'
});
model.value = ko.observableArray([]);
model.cacheOptions.plain = [];
});
describe('"getPath" method', function () {
it('Should return identifier value', function () {
var data = {
value: 10,
label: 'My Option Label',
identifier: 'ID: 30'
};
model.filterInputValue('hello');
model.filterOptionsList();
expect(model.getPath(data)).toBe(data.identifier);
});
it('Should return empty string when identifier is not passed', function () {
var data = {
value: 10,
label: 'My Option Label'
};
model.filterInputValue('hello');
model.filterOptionsList();
expect(model.getPath(data)).toBe('');
});
it('Should return empty string when renderPath is false', function () {
var data = {
value: 10,
label: 'My Option Label'
};
expect(model.getPath(data)).toBe('');
});
});
});
});
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
/* eslint-disable max-nested-callbacks */
define([
'Magento_PageBuilder/js/form/provider/conditions-data-processor'
], function (processor) {
'use strict';
describe('Magento_PageBuilder/js/form/provider/conditions-data-processor', function () {
it('Should delete and then normalize the data to the specified attribute', function () {
var model = {
'condition_option': 'condition',
'parameters[myattr][foobar]': 123,
'parameters[myattr][barfoo]': 123
};
processor(model, 'myattr');
expect(model['parameters[myattr][foobar]']).toBe(undefined);
expect(model['parameters[myattr][barfoo]']).toBe(undefined);
expect(model.myattr).toBe('{"foobar":123,"barfoo":123}');
});
it('Should delete and then normalize the data to the specified deep-nested attribute', function () {
var model = {
'condition_option': 'condition',
'parameters[myattr.foo.bar][foobar]': 123,
'parameters[myattr.foo.bar][barfoo]': 123
};
processor(model, 'myattr.foo.bar');
expect(model['parameters[myattr][foobar]']).toBe(undefined);
expect(model['parameters[myattr][barfoo]']).toBe(undefined);
expect(model.myattr.foo.bar).toBe('{"foobar":123,"barfoo":123}');
});
});
});
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
/* eslint-disable max-nested-callbacks */
define([
'squire'
], function (Squire) {
'use strict';
var injector = new Squire(),
eventObject = {
field: 'value'
},
mocks = {
'Magento_PageBuilderAdminAnalytics/js/page-builder/event-builder': {
build: jasmine.createSpy().and.returnValue(eventObject)
}
},
mixin,
uiEvents,
empty = {},
origSatellite = window._satellite;
beforeEach(function (done) {
injector.mock(mocks);
injector.require([
'Magento_PageBuilderAdminAnalytics/js/page-builder/events-mixin',
'uiEvents'
], function (Mixin, UiEvents) {
mixin = Mixin;
uiEvents = UiEvents;
done();
});
window.digitalData = {
event: empty
};
window._satellite = {
track: jasmine.createSpy()
};
});
afterEach(function () {
try {
injector.clean();
injector.remove();
window._satellite = origSatellite;
} catch (e) {
}
});
describe('Magento_PageBuilderAdminAnalytics/js/page-builder/events-mixin', function () {
it('Check event is pushed to array', function (done) {
mixin(uiEvents).trigger('name', 'arg');
expect(window.digitalData.event).toBe(empty);
window.digitalData.event = [];
setTimeout(function () {
expect(window.digitalData.event).toEqual([eventObject]);
done();
}, 1000);
});
});
});
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
/* eslint-disable max-nested-callbacks */
define([
'Magento_PageBuilder/js/utils/editor',
'jquery'
], function (utils, $) {
'use strict';
describe('Magento_PageBuilder/js/utils/editor.js', function () {
describe('lockImageSize', function () {
it('Should not change the defined image sizes', function () {
var image = document.createElement('img'),
element = document.createElement('div');
image.setAttribute('width', '100%');
$(element).append(image);
utils.lockImageSize(element);
expect(image.style.width).toEqual('100%');
});
});
describe('unlockImageSize', function () {
it('Should unlock locked images sizes only', function () {
var image = document.createElement('img'),
element = document.createElement('div');
$(image).css({
width: '100%',
height: '100%'
});
$(image).attr('data-height-locked', 'true');
$(element).append(image);
utils.unlockImageSize(element);
expect(image.style.width).toEqual('100%');
expect(image.style.height).toEqual('');
});
});
});
});
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
define([
'squire',
'jquery'
], function (Squire, $) {
'use strict';
var mapWidgetInitializer,
injector = new Squire(),
mocks = {
'Magento_PageBuilder/js/utils/map': jasmine.createSpy(),
'googleMaps': jasmine.createSpy()
},
loadWidgetinitializer;
/**
* Load the widget initializer for map
*
* @param {Function} done
*/
loadWidgetinitializer = function (done) {
injector.mock(mocks);
injector.require(
['Magento_PageBuilder/js/content-type/map/appearance/default/widget'],
function (module) {
mapWidgetInitializer = module;
done();
}
);
};
describe('Magento_PageBuilder/js/content-type/map/appearance/default/widget', function () {
beforeEach(loadWidgetinitializer);
it('Does not call googleMap constructor if element is missing data-locations', function () {
var el = $('div');
mapWidgetInitializer(undefined, el);
expect(mocks.googleMaps).not.toHaveBeenCalled();
});
it('Calls googleMap constructor if element has data-locations', function () {
var el = $('<div />'),
locationsJSON = '[{"position": {"latitude": 0, "longitude": 0}}]';
el.attr('data-locations', locationsJSON);
el.attr('data-show-controls', true);
mapWidgetInitializer(undefined, el);
expect(mocks['Magento_PageBuilder/js/utils/map']).toHaveBeenCalledWith(
el[0],
JSON.parse(locationsJSON),
{
disableDefaultUI: false,
mapTypeControl: true
}
);
});
});
});
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
define([
'Magento_PageBuilder/js/content-type/products/appearance/carousel/widget',
'jquery'
], function (sliderWidgetInitializer, $) {
'use strict';
describe('Magento_PageBuilder/js/content-type/products/appearance/carousel/widget', function () {
var config = {
breakpoints: {
desktop: {
conditions: {
'min-width': '1px'
},
options: {
products: {
default: {
slidesToShow: 5
}
}
}
}
}
},
el;
beforeEach(function () {
var childEl = document.createElement('div');
el = document.createElement('div');
el.setAttribute('data-display', true);
el.appendChild(childEl);
});
it('Should call unslick if element has class slick-initialized', function () {
spyOn($.fn, 'slick');
el.children[0].classList.add('slick-initialized');
sliderWidgetInitializer(config, el);
expect($.fn.slick).toHaveBeenCalledWith('unslick');
});
it('Should call slick on element based on its data', function () {
spyOn($.fn, 'slick');
el.setAttribute('data-autoplay', 'false');
el.setAttribute('data-autoplay-speed', 4000);
el.setAttribute('data-infinite-loop', 'false');
el.setAttribute('data-show-arrows', 'false');
el.setAttribute('data-show-dots', 'true');
el.setAttribute('data-carousel-mode', 'default');
sliderWidgetInitializer(config, el);
expect($.fn.slick).toHaveBeenCalledWith({
autoplay: false,
autoplaySpeed: 4000,
arrows: false,
dots: true,
infinite: false,
slidesToShow: 5,
slidesToScroll: 5
});
});
});
});
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
define([
'Magento_PageBuilder/js/content-type/row/appearance/default/widget'
], function (rowWidgetInitializer) {
'use strict';
describe('Magento_PageBuilder/js/content-type/row/appearance/default/widget', function () {
it('Should not call jarallax if enableParallax !== 1', function () {
var el = document.createElement('div');
spyOn(window, 'jarallax');
el.setAttribute('data-enable-parallax', 0);
rowWidgetInitializer(undefined, el);
expect(window.jarallax).not.toHaveBeenCalled();
});
it('Should call jarallax if enableParallax === 1', function () {
var el = document.createElement('div');
spyOn(window, 'jarallax');
el.setAttribute('data-enable-parallax', 1);
rowWidgetInitializer(undefined, el);
expect(window.jarallax).toHaveBeenCalled();
});
it('Should call jarallax on element based on its data', function () {
var el = document.createElement('div');
spyOn(window, 'jarallax');
el.setAttribute('data-enable-parallax', 1);
el.style.backgroundPosition = '0px 50%';
el.style.backgroundRepeat = 'repeat';
el.style.backgroundSize = '100%';
el.setAttribute('data-parallax-speed', 1);
document.body.appendChild(el);
rowWidgetInitializer(undefined, el);
expect(window.jarallax).toHaveBeenCalledWith(el, {
imgPosition: '0px 50%',
imgRepeat: 'repeat',
imgSize: '100%',
speed: 1
});
document.body.removeChild(el);
});
});
});
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
define([
'Magento_PageBuilder/js/content-type/slider/appearance/default/widget',
'Magento_PageBuilder/js/events',
'jquery'
], function (sliderWidgetInitializer, uiEvents, $) {
'use strict';
describe('Magento_PageBuilder/js/content-type/slider/appearance/default/widget', function () {
var el;
beforeEach(function () {
var childEl = document.createElement('div');
el = document.createElement('div');
el.setAttribute('data-display', true);
childEl.setAttribute('data-content-type', 'slide');
childEl.setAttribute('data-display', true);
el.appendChild(childEl);
});
it('Should call unslick if element has class slick-initialized', function () {
spyOn($.fn, 'slick');
el.classList.add('slick-initialized');
sliderWidgetInitializer(undefined, el);
expect($.fn.slick).toHaveBeenCalledWith('unslick');
});
it('Should call slick on element based on its data', function () {
spyOn($.fn, 'slick');
el.setAttribute('data-autoplay', 'true');
el.setAttribute('data-autoplay-speed', 500);
el.setAttribute('data-fade', 'true');
el.setAttribute('data-infinite-loop', 'true');
el.setAttribute('data-show-arrows', 'true');
el.setAttribute('data-show-dots', 'true');
sliderWidgetInitializer(undefined, el);
expect($.fn.slick).toHaveBeenCalledWith({
autoplay: true,
autoplaySpeed: 500,
fade: true,
infinite: true,
arrows: true,
dots: true
});
});
it('Should bind to contentType:redrawAfter event', function () {
spyOn(uiEvents, 'on');
sliderWidgetInitializer(undefined, el);
expect(uiEvents.on).toHaveBeenCalledWith('contentType:redrawAfter', jasmine.any(Function));
});
});
});
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
define([
'Magento_PageBuilder/js/content-type/tabs/appearance/default/widget',
'jquery'
], function (tabsInitializerWidget, $) {
'use strict';
describe('Magento_PageBuilder/js/content-type/tabs/appearance/default/widget', function () {
it('Should call $.ui.tabs with active based on element\'s activeTab data', function () {
var el = document.createElement('div');
spyOn($.ui, 'tabs');
el.setAttribute('data-active-tab', 1);
tabsInitializerWidget(undefined, el);
expect($.ui.tabs).toHaveBeenCalledWith({
active: 1,
create: jasmine.any(Function),
activate: jasmine.any(Function)
}, el);
});
it('Should call $.ui.tabs with inactive state if missing element\'s activeTab data', function () {
var el = document.createElement('div');
spyOn($.ui, 'tabs');
tabsInitializerWidget(undefined, el);
expect($.ui.tabs).toHaveBeenCalledWith({
active: 0,
create: jasmine.any(Function),
activate: jasmine.any(Function)
}, el);
});
});
});
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
define([
'squire',
'jquery'
], function (Squire, $) {
'use strict';
var widgetInitializer,
injector = new Squire(),
el,
mocks = {
'mage/apply/main': {
applyFor: jasmine.createSpy()
}
},
loadWidgetInitializer,
removeCreatedElement;
/**
* Load the widget initializer for the tests
*
* @param {Function} done
*/
loadWidgetInitializer = function (done) {
injector.mock(mocks);
injector.require(['Magento_PageBuilder/js/widget-initializer'], function (module) {
widgetInitializer = module;
done();
});
};
/**
* Remove any created elements
*/
removeCreatedElement = function () {
if (el !== undefined) {
el.remove();
}
};
describe('Magento_PageBuilder/js/content-type/map/appearance/default/widget', function () {
beforeEach(loadWidgetInitializer);
afterEach(removeCreatedElement);
it('Calls mage.applyFor on each element with each item present in config', function () {
var data,
applyForMock;
el = $('<div class="unique-element-class-attr"></div>');
el.appendTo('body');
data = {
config: {
'.unique-element-class-attr': {
awesome: false,
cool: {}
}
},
breakpoints: {},
currentViewport: {}
};
widgetInitializer(data);
applyForMock = mocks['mage/apply/main'].applyFor;
expect(applyForMock).toHaveBeenCalledWith(jasmine.any(Object), {
breakpoints: {},
currentViewport: {}
}, 'awesome');
expect(applyForMock).toHaveBeenCalledWith(jasmine.any(Object), {
breakpoints: {},
currentViewport: {}
}, 'cool');
// Due to jQuery objects not being === we must use jQuery's is to validate if the elements are the same
expect(el.is(applyForMock.calls.mostRecent().args[0])).toBeTruthy();
});
});
});
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
define([
'Magento_PageBuilder/js/widget/show-on-hover',
'jquery'
], function (showOnHoverInitializerWidget, $) {
'use strict';
var el;
afterEach(function () {
if (el !== undefined) {
el.remove();
}
});
describe('Magento_PageBuilder/js/widget/show-on-hover', function () {
it('Should call hover twice if both data attributes match config value', function () {
var config = {
dataRole: 'thing',
buttonSelector: '.button-selector',
showOverlay: 1
};
el = $(
'<div>' +
'<div class="button-selector" ' +
'data-content-type="thing" ' +
'data-show-overlay="1" ' +
'data-show-button="1">' +
'<a></a>' +
'</div>' +
'</div>'
);
el.appendTo('body');
spyOn($.fn, 'hover');
showOnHoverInitializerWidget(config);
expect($.fn.hover).toHaveBeenCalledTimes(2);
});
it('Should call hover zero times if no data attributes match config value', function () {
var config = {
dataRole: 'thing',
buttonSelector: '.button-selector',
showOverlay: 1
};
el = $(
'<div>' +
'<div class="button-selector" ' +
'data-content-type="thing" ' +
'data-show-overlay="0" ' +
'data-show-button="0">' +
'<a></a>' +
'</div>' +
'</div>'
);
el.appendTo('body');
spyOn($.fn, 'hover');
showOnHoverInitializerWidget(config);
expect($.fn.hover).not.toHaveBeenCalled();
});
it('Should call hover one time if only data-show-overlay matches config value', function () {
var config = {
dataRole: 'thing',
buttonSelector: '.button-selector',
showOverlay: 1
};
el = $(
'<div>' +
'<div class="button-selector" ' +
'data-content-type="thing" ' +
'data-show-overlay="1" ' +
'data-show-button="0">' +
'<a></a>' +
'</div>' +
'</div>'
);
el.appendTo('body');
spyOn($.fn, 'hover');
showOnHoverInitializerWidget(config);
expect($.fn.hover).toHaveBeenCalledTimes(1);
});
it('Should call hover one time if only data-show-button matches config value', function () {
var config = {
dataRole: 'thing',
buttonSelector: '.button-selector',
showOverlay: 1
};
el = $(
'<div>' +
'<div class="button-selector" ' +
'data-content-type="thing" ' +
'data-show-overlay="0" ' +
'data-show-button="1">' +
'<a></a>' +
'</div>' +
'</div>'
);
el.appendTo('body');
spyOn($.fn, 'hover');
showOnHoverInitializerWidget(config);
expect($.fn.hover).toHaveBeenCalledTimes(1);
});
it('Should call hover zero times if data-content-type does not match config value', function () {
var config = {
dataRole: 'thing2',
buttonSelector: '.button-selector',
showOverlay: 1
};
el = $(
'<div>' +
'<div class="button-selector" ' +
'data-content-type="thing" ' +
'data-show-overlay="1" ' +
'data-show-button="1">' +
'<a></a>' +
'</div>' +
'</div>'
);
el.appendTo('body');
spyOn($.fn, 'hover');
showOnHoverInitializerWidget(config);
expect($.fn.hover).not.toHaveBeenCalled();
});
});
});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment