import React from 'react';
import { shallow } from 'enzyme';
import { keyStore } from '../../../utils';
import tinyMCEKeys from '../../../data/constants/tinyMCE';
import * as module from './ImageUploadModal';
jest.mock('./ImageSettingsModal', () => 'ImageSettingsModal');
jest.mock('./SelectImageModal', () => 'SelectImageModal');
const { ImageUploadModal } = module;
const hookKeys = keyStore(module.hooks);
const settings = {
altText: 'aLt tExt',
isDecorative: false,
dimensions: {
width: 2022,
height: 1619,
},
};
describe('ImageUploadModal', () => {
describe('hooks', () => {
describe('imgTag', () => {
const selection = { externalUrl: 'sOmEuRl.cOm' };
const expected = {
src: selection.externalUrl,
alt: settings.altText,
width: settings.dimensions.width,
height: settings.dimensions.height,
};
const testImgTag = (args) => {
const output = module.hooks.imgTag({
settings: args.settings,
selection,
});
expect(output).toEqual(`
`);
};
test('It returns a html string which matches an image tag', () => {
testImgTag({ settings, expected });
});
test('If isDecorative is true, alt text is an empty string', () => {
testImgTag({
settings: { ...settings, isDecorative: true },
expected: { ...expected, alt: '' },
});
});
});
describe('createSaveCallback', () => {
const close = jest.fn();
const execCommandMock = jest.fn();
const editorRef = { current: { some: 'dATa', execCommand: execCommandMock } };
const setSelection = jest.fn();
const selection = jest.fn();
let output;
beforeEach(() => {
output = module.hooks.createSaveCallback({
close, editorRef, setSelection, selection,
});
});
afterEach(() => {
jest.clearAllMocks();
});
test('It creates a callback, that when called, inserts to the editor, sets the selection to be null, and calls close', () => {
jest.spyOn(module.hooks, hookKeys.imgTag)
.mockImplementationOnce((props) => ({ selection, settings: props.settings }));
expect(execCommandMock).not.toBeCalled();
expect(setSelection).not.toBeCalled();
expect(close).not.toBeCalled();
output(settings);
expect(execCommandMock).toBeCalledWith(
tinyMCEKeys.commands.insertContent,
false,
{ selection, settings },
);
expect(setSelection).toBeCalledWith(null);
expect(close).toBeCalled();
});
});
describe('onClose', () => {
it('takes and calls clearSelection and close callbacks', () => {
const clearSelection = jest.fn();
const close = jest.fn();
module.hooks.onClose({ clearSelection, close })();
expect(clearSelection).toHaveBeenCalled();
expect(close).toHaveBeenCalled();
});
});
});
describe('component', () => {
let props;
let hooks;
beforeAll(() => {
hooks = module.hooks;
props = {
editorRef: { current: null },
isOpen: false,
close: jest.fn().mockName('props.close'),
clearSelection: jest.fn().mockName('props.clearSelection'),
selection: { some: 'images' },
setSelection: jest.fn().mockName('props.setSelection'),
};
module.hooks = {
createSaveCallback: jest.fn().mockName('hooks.createSaveCallback'),
onClose: jest.fn().mockName('hooks.onClose'),
};
});
afterAll(() => {
module.hooks = hooks;
});
test('snapshot: with selection content (ImageSettingsUpload)', () => {
expect(shallow()).toMatchSnapshot();
});
test('snapshot: no selection (Select Image Modal)', () => {
expect(shallow()).toMatchSnapshot();
});
});
});