import React from 'react';
import {Store} from 'redux';
import {Provider} from 'react-redux';
import {shallow, mount} from 'enzyme';
import {Editor3Component, getValidMediaType} from '../Editor3Component';
import {EditorState, ContentBlock} from 'draft-js';
import mockStore from './utils';
import {blockRenderer} from '../blockRenderer';
const editorState = EditorState.createEmpty();
const editor3mandatoryProps = {
spellchecking: {
language: 'en',
enabled: false,
inProgress: false,
warningsByBlock: {},
},
};
const stubForHighlights = {
highlightsManager: {
styleMap: {},
},
};
describe('editor3.component', () => {
it('should hide toolbar when disabled', () => {
const wrapper = shallow(
,
);
expect(wrapper.find('DraftEditor').length).toBe(1);
expect(wrapper.find('.Editor3-controls').length).toBe(0);
});
it('should not accept dragging over invalid items', () => {
const wrapper = shallow(
,
);
const {onDragOver} = wrapper.instance() as any;
const makeEvent = (t) => ({originalEvent: {dataTransfer: {types: ['foo', t]}}});
[
'application/superdesk.item.picture',
'application/superdesk.item.graphic',
'application/superdesk.item.video',
'application/superdesk.item.audio',
'text/html',
].forEach((validType) => {
expect(onDragOver(makeEvent(validType))).toBe(false);
});
[
'text/md',
'application/javascript',
'invalid',
].forEach((invalidType) => {
expect(onDragOver(makeEvent(invalidType))).toBeTruthy();
});
});
it('should not accept dragging when editor is readOnly', () => {
const wrapper = shallow(
,
);
const {onDragOver} = wrapper.instance() as any;
const makeEvent = (t) => ({originalEvent: {dataTransfer: {types: [t]}}});
[
'application/superdesk.item.picture',
'application/superdesk.item.graphic',
'application/superdesk.item.video',
'application/superdesk.item.audio',
'text/html',
].forEach((validType) => {
expect(onDragOver(makeEvent(validType))).toBeTruthy();
});
});
it('should not accept dragging when editor does not support images', () => {
const wrapper = shallow(
,
);
const {onDragOver} = wrapper.instance() as any;
const makeEvent = (t) => ({originalEvent: {dataTransfer: {types: [t]}}});
[
'application/superdesk.item.picture',
'application/superdesk.item.graphic',
'application/superdesk.item.video',
'application/superdesk.item.audio',
'text/html',
].forEach((validType) => {
expect(onDragOver(makeEvent(validType))).toBeTruthy();
});
});
it('should not accept dragging when editor is single line', () => {
const wrapper = shallow(
,
);
const {onDragOver} = wrapper.instance() as any;
const makeEvent = (t) => ({originalEvent: {dataTransfer: {types: [t]}}});
[
'application/superdesk.item.picture',
'application/superdesk.item.graphic',
'application/superdesk.item.video',
'application/superdesk.item.audio',
'text/html',
].forEach((validType) => {
expect(onDragOver(makeEvent(validType))).toBeTruthy();
});
});
it('should prefer superdesk media when dropping', () => {
const event = {dataTransfer: {types: ['text/html', 'application/superdesk.item.picture']}};
expect(getValidMediaType(event)).toBe('application/superdesk.item.picture');
event.dataTransfer.types.reverse();
expect(getValidMediaType(event)).toBe('application/superdesk.item.picture');
});
});
describe('editor3.blockRenderer', () => {
it('should return null for non-atomic blocks', () => {
const block = {getType: () => 'non-atomic'} as unknown as ContentBlock;
expect(blockRenderer(block)).toBe(null);
});
it('should return null as component for unrecognised blocks', () => {
const block = {getType: () => 'atomic', getEntityAt: () => 'entity_key'} as unknown as ContentBlock;
const contentState = {getEntity: () => ({getType: () => 'not an image'})};
const {component, editable} = blockRenderer(block);
expect(component({block, contentState})).toBe(null);
expect(editable).toEqual(false);
});
it('should return non-null as component for recognised blocks', () => {
const block = {getType: () => 'atomic', getEntityAt: () => 'entity_key'} as unknown as ContentBlock;
const contentState = {getEntity: () => ({getType: () => 'EMBED', getData: () => ({data: {html: 'abc'}})})};
const component = blockRenderer(block)
.component({block, contentState});
const store = mockStore().store as unknown as Store;
expect(component).not.toBe(null);
expect(
mount({component})
.childAt(0)
.name(),
).toBe('Connect(DragableEditor3BlockComponent)');
});
});