/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
ZoomTest = TestCase('ZoomTest');
ZoomTest.prototype.setUp = function() {
/*:DOC +=
*/
this.zoomElement = jQuery('[data-role=zoom-test]');
};
ZoomTest.prototype.tearDown = function() {
this.zoomDestroy();
};
ZoomTest.prototype.zoomDestroy = function() {
if(this.zoomElement.data('zoom')) {
this.zoomElement.zoom('destroy');
}
};
ZoomTest.prototype.zoomCreate = function(options, element) {
return (element || this.zoomElement).zoom(options || {} ).data('zoom');
};
ZoomTest.prototype.testInit = function() {
this.zoomElement.zoom();
assertTrue(this.zoomElement.is(':mage-zoom'));
};
ZoomTest.prototype.testCreate = function() {
var zoomInstance = this.zoomCreate(),
_setZoomData = jsunit.stub(zoomInstance, '_setZoomData'),
_render = jsunit.stub(zoomInstance, '_render'),
_bind = jsunit.stub(zoomInstance, '_bind'),
_hide = jsunit.stub(zoomInstance, '_hide'),
_largeImageLoaded = jsunit.stub(zoomInstance, '_largeImageLoaded');
zoomInstance.largeImage = [{
complete: false
}];
zoomInstance._create();
assertTrue(_setZoomData.callCount === 1);
assertTrue(_render.callCount === 1);
assertTrue(_bind.callCount === 1);
assertNull(_largeImageLoaded.callCount);
assertTrue(_hide.callCount === 2);
_setZoomData.reset();
_render.reset();
_bind.reset();
_hide.reset();
zoomInstance.largeImage[0].complete = true;
zoomInstance._create();
assertTrue(_setZoomData.callCount === 1);
assertTrue(_render.callCount === 1);
assertTrue(_bind.callCount === 1);
assertTrue(_largeImageLoaded.callCount === 1);
assertTrue(_hide.callCount === 2);
};
ZoomTest.prototype.testRender = function() {
var zoomInstance = this.zoomCreate(),
_renderControl = jsunit.stub(zoomInstance, '_renderControl'),
_renderLargeImage = jsunit.stub(zoomInstance, '_renderLargeImage');
_renderControl.returnCallback = function(control) {
return jQuery('', {'data-control': control});
};
zoomInstance._render();
assertTrue(_renderControl.callCount === 4);
assertTrue(zoomInstance.element.find('[data-control=track]').length > 0);
assertTrue(zoomInstance.element.find('[data-control=lens]').length > 0);
assertTrue(zoomInstance.element.find('[data-control=display]').length > 0);
assertTrue(zoomInstance.element.find('[data-control=notice]').length > 0);
assertTrue(_renderLargeImage.callCount === 1);
};
ZoomTest.prototype.testToggleNotice = function() {
var zoomInstance = this.zoomCreate(),
getZoomRatio = jsunit.stub(zoomInstance, 'getZoomRatio');
zoomInstance.noticeOriginal = 'notice original';
zoomInstance.options.controls.notice = {
text: 'test text'
};
zoomInstance.notice.text('');
zoomInstance.largeImageSrc = 'image.large.jpg';
zoomInstance.activated = false;
getZoomRatio.returnValue = 2;
zoomInstance._toggleNotice();
assertEquals(zoomInstance.notice.text(), zoomInstance.options.controls.notice.text);
assertTrue(getZoomRatio.callCount === 1);
zoomInstance.notice.text('');
zoomInstance.largeImageSrc = null;
zoomInstance.activated = false;
getZoomRatio.returnValue = 2;
zoomInstance._toggleNotice();
assertEquals(zoomInstance.notice.text(), zoomInstance.noticeOriginal);
zoomInstance.notice.text('');
zoomInstance.largeImageSrc = 'image.large.jpg';
zoomInstance.activated = true;
getZoomRatio.returnValue = 2;
zoomInstance._toggleNotice();
assertEquals(zoomInstance.notice.text(), zoomInstance.noticeOriginal);
zoomInstance.notice.text('');
zoomInstance.largeImageSrc = 'image.large.jpg';
zoomInstance.activated = false;
getZoomRatio.returnValue = 0;
zoomInstance._toggleNotice();
assertEquals(zoomInstance.notice.text(), zoomInstance.noticeOriginal);
};
ZoomTest.prototype.testRefresh = function() {
var zoomInstance = this.zoomCreate(),
_refreshControl = jsunit.stub(zoomInstance, '_refreshControl');
zoomInstance._refresh();
assertTrue(_refreshControl.callCount === 3);
assertTrue(_refreshControl.callArgsStack[0][0] === 'display');
assertTrue(_refreshControl.callArgsStack[1][0] === 'track');
assertTrue(_refreshControl.callArgsStack[2][0] === 'lens');
};
ZoomTest.prototype.testBind = function() {
var zoomInstance = this.zoomCreate(),
_on = jsunit.stub(zoomInstance, '_on'),
events = {};
zoomInstance.largeImage = jQuery('');
zoomInstance._bind();
assertTrue(_on.callCount > 0);
assertTrue(
_on.callArgsStack[0][0][
zoomInstance.options.startZoomEvent +
' ' +
zoomInstance.options.selectors.image
] === 'show'
);
assertTrue(
jQuery.type(_on.callArgsStack[0][0][
zoomInstance.options.stopZoomEvent +
' ' +
zoomInstance.options.selectors.track
]) === 'function'
);
assertTrue(_on.callArgsStack[0][0]['mousemove ' + zoomInstance.options.selectors.track] === '_move');
assertTrue(_on.callArgsStack[0][0].imageupdated === '_onImageUpdated');
assertTrue(_on.callArgsStack[1][0].is(zoomInstance.largeImage));
assertTrue(_on.callArgsStack[1][1].load === '_largeImageLoaded');
};
ZoomTest.prototype.testEnable = function() {
var zoomInstance = this.zoomCreate(),
_onImageUpdated = jsunit.stub(zoomInstance, '_onImageUpdated');
zoomInstance.enable();
assertTrue(_onImageUpdated.callCount === 1);
};
ZoomTest.prototype.testDisable = function() {
var zoomInstance = this.zoomCreate();
zoomInstance.noticeOriginal = 'original notice';
zoomInstance.notice.text('');
zoomInstance.disable();
assertEquals(zoomInstance.noticeOriginal, zoomInstance.notice.text());
};
ZoomTest.prototype.testShow = function() {
var zoomInstance = this.zoomCreate(),
e = {
preventDefault: jsunit.stub(),
stopImmediatePropagation: jsunit.stub()
},
getZoomRatio = jsunit.stub(zoomInstance, 'getZoomRatio'),
_show = jsunit.stub(zoomInstance, '_show'),
_refresh = jsunit.stub(zoomInstance, '_refresh'),
_toggleNotice = jsunit.stub(zoomInstance, '_toggleNotice'),
_trigger = jsunit.stub(zoomInstance, '_trigger');
getZoomRatio.returnValue = 0;
zoomInstance.show(e);
assertTrue(e.preventDefault.callCount === 1);
e.preventDefault.reset();
getZoomRatio.reset();
getZoomRatio.returnValue = 2;
zoomInstance.largeImageSrc = 'image.large.jpg';
zoomInstance.show(e);
assertTrue(e.preventDefault.callCount === 1);
assertTrue(e.stopImmediatePropagation.callCount === 1);
assertTrue(zoomInstance.activated);
assertTrue(_show.callCount > 0);
assertTrue(_refresh.callCount === 1);
assertTrue(_toggleNotice.callCount === 1);
assertTrue(_trigger.callCount === 1);
assertTrue(_trigger.lastCallArgs[0] === 'show');
};
ZoomTest.prototype.testHide = function() {
var zoomInstance = this.zoomCreate(),
_hide = jsunit.stub(zoomInstance, '_hide'),
_toggleNotice = jsunit.stub(zoomInstance, '_toggleNotice'),
_trigger = jsunit.stub(zoomInstance, '_trigger');
zoomInstance.hide();
assertTrue(_hide.callCount > 0);
assertTrue(_toggleNotice.callCount === 1);
assertTrue(_trigger.callCount === 1);
assertTrue(_trigger.lastCallArgs[0] === 'hide');
};
ZoomTest.prototype.testOnImageUpdated = function() {
var zoomInstance = this.zoomCreate(),
_setZoomData = jsunit.stub(zoomInstance, '_setZoomData'),
_refreshLargeImage = jsunit.stub(zoomInstance, '_refreshLargeImage'),
_refresh = jsunit.stub(zoomInstance, '_refresh'),
hide = jsunit.stub(zoomInstance, 'hide'),
testImage = jQuery('');
zoomInstance.options.selectors.image = "[data-role=test-image]";
zoomInstance.element.append(testImage);
zoomInstance.image = testImage;
zoomInstance._onImageUpdated();
assertNull(_setZoomData.callCount);
assertNull(_refreshLargeImage.callCount);
assertNull(_refresh.callCount);
assertNull(hide.callCount);
zoomInstance.image = jQuery('');
zoomInstance.largeImageSrc = null;
zoomInstance._onImageUpdated();
assertTrue(_setZoomData.callCount === 1);
assertNull(_refreshLargeImage.callCount);
assertNull(_refresh.callCount);
assertTrue(hide.callCount === 1);
_setZoomData.reset();
hide.reset();
zoomInstance.largeImageSrc = 'image.large.jpg';
zoomInstance._onImageUpdated();
assertTrue(_setZoomData.callCount === 1);
assertTrue(_refreshLargeImage.callCount === 1);
assertTrue(_refresh.callCount === 1);
assertNull(hide.callCount);
};
ZoomTest.prototype.testLargeImageLoaded = function() {
var zoomInstance = this.zoomCreate(),
_toggleNotice = jsunit.stub(zoomInstance, '_toggleNotice'),
_getAspectRatio = jsunit.stub(zoomInstance, '_getAspectRatio'),
_getWhiteBordersOffset = jsunit.stub(zoomInstance, '_getWhiteBordersOffset'),
processStopTriggered = false,
image = jQuery('');
_getWhiteBordersOffset.returnValue = 1;
zoomInstance.element.append(image);
zoomInstance.options.selectors.image = '[data-role=test-image]';
zoomInstance.image = image;
_getAspectRatio.returnCallback = function(image) {
if (image.is(zoomInstance.image)) {
return 0;
} else {
return 1;
}
};
jQuery(zoomInstance.options.selectors.image).on('processStop', function() {
processStopTriggered = true;
});
zoomInstance.ratio = 1;
zoomInstance._largeImageLoaded();
assertNull(zoomInstance.ratio);
assertTrue(_toggleNotice.callCount === 1);
assertTrue(processStopTriggered);
assertTrue(_getAspectRatio.callCount > 0);
assertTrue(_getWhiteBordersOffset.callCount === 1);
assertEquals(zoomInstance.whiteBordersOffset, _getWhiteBordersOffset.returnValue);
};
ZoomTest.prototype.testRefreshLargeImage = function() {
var zoomInstance = this.zoomCreate(),
css = {top: 0, left: 0};
zoomInstance.largeImage = jQuery('
');
zoomInstance.largeImageSrc = 'large.image.jpg';
zoomInstance._refreshLargeImage();
assertNotUndefined(zoomInstance.largeImage.prop('src'));
assertEquals(zoomInstance.largeImage.css('top'), css.top + 'px');
assertEquals(zoomInstance.largeImage.css('left'), css.left + 'px');
};
ZoomTest.prototype.testRenderLargeImage = function() {
var zoomInstance = this.zoomCreate();
zoomInstance.element.append(jQuery(''));
zoomInstance.options.selectors.image = '[data-role=test-image]';
var image = zoomInstance._renderLargeImage();
assertTrue(image.is('img'));
assertTrue(image.is(zoomInstance.largeImage));
};
ZoomTest.prototype.testGetZoomRatio = function() {
var zoomInstance = this.zoomCreate(),
imageSize = {width: 100, height: 100},
largeImageSize = {width: 200, height: 200};
zoomInstance.ratio = null;
zoomInstance.image = jQuery('
', imageSize);
zoomInstance.largeImageSize = largeImageSize;
var zoomRatio = zoomInstance.getZoomRatio();
assertEquals(zoomRatio, (largeImageSize.width / imageSize.width));
zoomInstance.ratio = 100;
zoomRatio = zoomInstance.getZoomRatio();
assertEquals(zoomRatio, zoomInstance.ratio);
};
ZoomTest.prototype.testGetAspectRatio = function() {
var zoomInstance = this.zoomCreate(),
aspectRatio = zoomInstance._getAspectRatio(),
size = {width: 200, height: 100};
assertNull(aspectRatio);
aspectRatio = zoomInstance._getAspectRatio(jQuery('', size));
assertEquals((Math.round((size.width / size.height) * 100) / 100), aspectRatio);
};