gitlab-org--gitlab-foss/spec/frontend/image_diff/replaced_image_diff_spec.js

356 lines
11 KiB
JavaScript

import ReplacedImageDiff from '~/image_diff/replaced_image_diff';
import ImageDiff from '~/image_diff/image_diff';
import { viewTypes } from '~/image_diff/view_types';
import imageDiffHelper from '~/image_diff/helpers/index';
describe('ReplacedImageDiff', () => {
let element;
let replacedImageDiff;
beforeEach(() => {
setFixtures(`
<div id="element">
<div class="two-up">
<div class="js-image-frame">
<img src="${gl.TEST_HOST}/image.png">
</div>
</div>
<div class="swipe">
<div class="js-image-frame">
<img src="${gl.TEST_HOST}/image.png">
</div>
</div>
<div class="onion-skin">
<div class="js-image-frame">
<img src="${gl.TEST_HOST}/image.png">
</div>
</div>
<div class="view-modes-menu">
<div class="two-up">2-up</div>
<div class="swipe">Swipe</div>
<div class="onion-skin">Onion skin</div>
</div>
</div>
`);
element = document.getElementById('element');
});
function setupImageFrameEls() {
replacedImageDiff.imageFrameEls = [];
replacedImageDiff.imageFrameEls[viewTypes.TWO_UP] = element.querySelector(
'.two-up .js-image-frame',
);
replacedImageDiff.imageFrameEls[viewTypes.SWIPE] = element.querySelector(
'.swipe .js-image-frame',
);
replacedImageDiff.imageFrameEls[viewTypes.ONION_SKIN] = element.querySelector(
'.onion-skin .js-image-frame',
);
}
function setupViewModesEls() {
replacedImageDiff.viewModesEls = [];
replacedImageDiff.viewModesEls[viewTypes.TWO_UP] = element.querySelector(
'.view-modes-menu .two-up',
);
replacedImageDiff.viewModesEls[viewTypes.SWIPE] = element.querySelector(
'.view-modes-menu .swipe',
);
replacedImageDiff.viewModesEls[viewTypes.ONION_SKIN] = element.querySelector(
'.view-modes-menu .onion-skin',
);
}
function setupImageEls() {
replacedImageDiff.imageEls = [];
replacedImageDiff.imageEls[viewTypes.TWO_UP] = element.querySelector('.two-up img');
replacedImageDiff.imageEls[viewTypes.SWIPE] = element.querySelector('.swipe img');
replacedImageDiff.imageEls[viewTypes.ONION_SKIN] = element.querySelector('.onion-skin img');
}
it('should extend ImageDiff', () => {
replacedImageDiff = new ReplacedImageDiff(element);
expect(replacedImageDiff instanceof ImageDiff).toEqual(true);
});
describe('init', () => {
beforeEach(() => {
jest.spyOn(ReplacedImageDiff.prototype, 'bindEvents').mockImplementation(() => {});
jest.spyOn(ReplacedImageDiff.prototype, 'generateImageEls').mockImplementation(() => {});
replacedImageDiff = new ReplacedImageDiff(element);
replacedImageDiff.init();
});
it('should set imageFrameEls', () => {
const { imageFrameEls } = replacedImageDiff;
expect(imageFrameEls).toBeDefined();
expect(imageFrameEls[viewTypes.TWO_UP]).toEqual(
element.querySelector('.two-up .js-image-frame'),
);
expect(imageFrameEls[viewTypes.SWIPE]).toEqual(
element.querySelector('.swipe .js-image-frame'),
);
expect(imageFrameEls[viewTypes.ONION_SKIN]).toEqual(
element.querySelector('.onion-skin .js-image-frame'),
);
});
it('should set viewModesEls', () => {
const { viewModesEls } = replacedImageDiff;
expect(viewModesEls).toBeDefined();
expect(viewModesEls[viewTypes.TWO_UP]).toEqual(
element.querySelector('.view-modes-menu .two-up'),
);
expect(viewModesEls[viewTypes.SWIPE]).toEqual(
element.querySelector('.view-modes-menu .swipe'),
);
expect(viewModesEls[viewTypes.ONION_SKIN]).toEqual(
element.querySelector('.view-modes-menu .onion-skin'),
);
});
it('should generateImageEls', () => {
expect(ReplacedImageDiff.prototype.generateImageEls).toHaveBeenCalled();
});
it('should bindEvents', () => {
expect(ReplacedImageDiff.prototype.bindEvents).toHaveBeenCalled();
});
describe('currentView', () => {
it('should set currentView', () => {
replacedImageDiff.init(viewTypes.ONION_SKIN);
expect(replacedImageDiff.currentView).toEqual(viewTypes.ONION_SKIN);
});
it('should default to viewTypes.TWO_UP', () => {
expect(replacedImageDiff.currentView).toEqual(viewTypes.TWO_UP);
});
});
});
describe('generateImageEls', () => {
beforeEach(() => {
jest.spyOn(ReplacedImageDiff.prototype, 'bindEvents').mockImplementation(() => {});
replacedImageDiff = new ReplacedImageDiff(element, {
canCreateNote: false,
renderCommentBadge: false,
});
setupImageFrameEls();
});
it('should set imageEls', () => {
replacedImageDiff.generateImageEls();
const { imageEls } = replacedImageDiff;
expect(imageEls).toBeDefined();
expect(imageEls[viewTypes.TWO_UP]).toEqual(element.querySelector('.two-up img'));
expect(imageEls[viewTypes.SWIPE]).toEqual(element.querySelector('.swipe img'));
expect(imageEls[viewTypes.ONION_SKIN]).toEqual(element.querySelector('.onion-skin img'));
});
});
describe('bindEvents', () => {
beforeEach(() => {
jest.spyOn(ImageDiff.prototype, 'bindEvents').mockImplementation(() => {});
replacedImageDiff = new ReplacedImageDiff(element);
setupViewModesEls();
});
it('should call super.bindEvents', () => {
replacedImageDiff.bindEvents();
expect(ImageDiff.prototype.bindEvents).toHaveBeenCalled();
});
it('should register click eventlistener to 2-up view mode', done => {
jest.spyOn(ReplacedImageDiff.prototype, 'changeView').mockImplementation(viewMode => {
expect(viewMode).toEqual(viewTypes.TWO_UP);
done();
});
replacedImageDiff.bindEvents();
replacedImageDiff.viewModesEls[viewTypes.TWO_UP].click();
});
it('should register click eventlistener to swipe view mode', done => {
jest.spyOn(ReplacedImageDiff.prototype, 'changeView').mockImplementation(viewMode => {
expect(viewMode).toEqual(viewTypes.SWIPE);
done();
});
replacedImageDiff.bindEvents();
replacedImageDiff.viewModesEls[viewTypes.SWIPE].click();
});
it('should register click eventlistener to onion skin view mode', done => {
jest.spyOn(ReplacedImageDiff.prototype, 'changeView').mockImplementation(viewMode => {
expect(viewMode).toEqual(viewTypes.SWIPE);
done();
});
replacedImageDiff.bindEvents();
replacedImageDiff.viewModesEls[viewTypes.SWIPE].click();
});
});
describe('getters', () => {
describe('imageEl', () => {
beforeEach(() => {
replacedImageDiff = new ReplacedImageDiff(element);
replacedImageDiff.currentView = viewTypes.TWO_UP;
setupImageEls();
});
it('should return imageEl based on currentView', () => {
expect(replacedImageDiff.imageEl).toEqual(element.querySelector('.two-up img'));
replacedImageDiff.currentView = viewTypes.SWIPE;
expect(replacedImageDiff.imageEl).toEqual(element.querySelector('.swipe img'));
});
});
describe('imageFrameEl', () => {
beforeEach(() => {
replacedImageDiff = new ReplacedImageDiff(element);
replacedImageDiff.currentView = viewTypes.TWO_UP;
setupImageFrameEls();
});
it('should return imageFrameEl based on currentView', () => {
expect(replacedImageDiff.imageFrameEl).toEqual(
element.querySelector('.two-up .js-image-frame'),
);
replacedImageDiff.currentView = viewTypes.ONION_SKIN;
expect(replacedImageDiff.imageFrameEl).toEqual(
element.querySelector('.onion-skin .js-image-frame'),
);
});
});
});
describe('changeView', () => {
beforeEach(() => {
replacedImageDiff = new ReplacedImageDiff(element);
jest.spyOn(imageDiffHelper, 'removeCommentIndicator').mockReturnValue({
removed: false,
});
setupImageFrameEls();
});
describe('invalid viewType', () => {
beforeEach(() => {
replacedImageDiff.changeView('some-view-name');
});
it('should not call removeCommentIndicator', () => {
expect(imageDiffHelper.removeCommentIndicator).not.toHaveBeenCalled();
});
});
describe('valid viewType', () => {
beforeEach(() => {
jest.spyOn(ReplacedImageDiff.prototype, 'renderNewView').mockImplementation(() => {});
replacedImageDiff.changeView(viewTypes.ONION_SKIN);
});
afterEach(() => {
jest.clearAllTimers();
});
it('should call removeCommentIndicator', () => {
expect(imageDiffHelper.removeCommentIndicator).toHaveBeenCalled();
});
it('should update currentView to newView', () => {
expect(replacedImageDiff.currentView).toEqual(viewTypes.ONION_SKIN);
});
it('should clear imageBadges', () => {
expect(replacedImageDiff.imageBadges.length).toEqual(0);
});
it('should call renderNewView', () => {
jest.advanceTimersByTime(251);
expect(replacedImageDiff.renderNewView).toHaveBeenCalled();
});
});
});
describe('renderNewView', () => {
beforeEach(() => {
replacedImageDiff = new ReplacedImageDiff(element);
});
it('should call renderBadges', () => {
jest.spyOn(ReplacedImageDiff.prototype, 'renderBadges').mockImplementation(() => {});
replacedImageDiff.renderNewView({
removed: false,
});
expect(replacedImageDiff.renderBadges).toHaveBeenCalled();
});
describe('removeIndicator', () => {
const indicator = {
removed: true,
x: 0,
y: 1,
image: {
width: 50,
height: 100,
},
};
beforeEach(() => {
setupImageEls();
setupImageFrameEls();
});
it('should pass showCommentIndicator normalized indicator values', done => {
jest.spyOn(imageDiffHelper, 'showCommentIndicator').mockImplementation(() => {});
jest
.spyOn(imageDiffHelper, 'resizeCoordinatesToImageElement')
.mockImplementation((imageEl, meta) => {
expect(meta.x).toEqual(indicator.x);
expect(meta.y).toEqual(indicator.y);
expect(meta.width).toEqual(indicator.image.width);
expect(meta.height).toEqual(indicator.image.height);
done();
});
replacedImageDiff.renderNewView(indicator);
});
it('should call showCommentIndicator', done => {
const normalized = {
normalized: true,
};
jest.spyOn(imageDiffHelper, 'resizeCoordinatesToImageElement').mockReturnValue(normalized);
jest
.spyOn(imageDiffHelper, 'showCommentIndicator')
.mockImplementation((imageFrameEl, normalizedIndicator) => {
expect(normalizedIndicator).toEqual(normalized);
done();
});
replacedImageDiff.renderNewView(indicator);
});
});
});
});