import * as React from 'react'
import Enzyme, {mount} from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
import {ToastContainer} from '../container';
import {toast} from 'react-toastify';
import {Toast} from "../definitions";
import * as types from "../types";
import * as actions from "../actions";
import ConnectedToastContainer from "../container";
import configureStore from 'redux-mock-store';
import {Provider} from 'react-redux';
jest.useFakeTimers();
Enzyme.configure({adapter: new Adapter()});
describe('container', () => {
const toastList = [{
id: 'toast1',
message: 'Foo bar',
type: toast.TYPE.DEFAULT
}] as Toast[];
const CustomComponent = ({message}) => (
{message}
);
describe('unconnected component', () => {
const dismiss = jest.fn();
let wrapper;
beforeEach(() => {
dismiss.mockClear();
wrapper = mount();
});
afterEach(() => {
wrapper.unmount();
});
describe('without custom component', () => {
it('should render self and one toast', () => {
expect(wrapper.find('div.Toastify__toast--default').length).toBe(0);
jest.runAllTimers();
wrapper.update();
expect(wrapper.find('div.Toastify__toast--default').length).toBe(1);
});
it('should update toasts', () => {
jest.runAllTimers();
wrapper.setProps({
toastList: [{
id: 'toast1',
message: 'Foo bar',
type: toast.TYPE.WARNING,
}, {
id: 'toast2',
message: 'Hello World',
type: toast.TYPE.INFO
}]
});
jest.runAllTimers();
wrapper.update();
expect(wrapper.find('div.Toastify__toast').length).toBe(2);
expect(wrapper.find('div.Toastify__toast').at(0).find('div.Toastify__toast-body').text()).toBe('Foo bar');
expect(wrapper.find('div.Toastify__toast').at(1).find('div.Toastify__toast-body').text()).toBe('Hello World');
});
it('should dismiss toast', () => {
jest.runAllTimers();
wrapper.update();
expect(wrapper.find('div.Toastify__toast').length).toBe(1);
wrapper.find('div.Toastify__toast').at(0).find('button.Toastify__close-button').simulate('click');
jest.runAllTimers();
wrapper.update();
expect(wrapper.find('div.Toastify__toast').length).toBe(0);
expect(dismiss.mock.calls.length).toBe(1);
});
it('should dismiss toast without click', () => {
jest.runAllTimers();
wrapper.setProps({toastList: []});
jest.runAllTimers();
wrapper.update();
expect(wrapper.find('div.Toastify__toast').length).toBe(0);
expect(dismiss.mock.calls.length).toBe(1);
});
});
describe('with custom component', () => {
it('should render custom toast', () => {
jest.runAllTimers();
wrapper.setProps({
toastComponent: CustomComponent,
toastList: [{...toastList[0], type: toast.TYPE.WARNING}]
});
jest.runAllTimers();
wrapper.update();
const toasts = wrapper.find('div.Toastify__toast');
expect(toasts.length).toBe(1);
expect(toasts.find('div.foo-bar').text()).toBe('Foo bar');
wrapper.setProps({
toastComponent: undefined,
toastList: [{...toastList[0], type: toast.TYPE.WARNING}]
});
jest.runAllTimers();
wrapper.update();
expect(wrapper.find('div.Toastify__toast').at(0).find('div.Toastify__toast-body').text()).toBe('Foo bar');
});
it('should update toasts', () => {
jest.runAllTimers();
wrapper.update();
expect(wrapper.find('div.Toastify__toast').length).toBe(1);
wrapper.setProps({
toastList: [{
...toastList[0],
renderDefaultComponent: true,
message: 'Bar foo'
}]
});
jest.runAllTimers();
wrapper.update();
expect(wrapper.find('div.Toastify__toast').length).toBe(1);
expect(wrapper.find('div.Toastify__toast').at(0).find('div.Toastify__toast-body').text()).toBe('Bar foo');
wrapper.setProps({
toastComponent: CustomComponent,
renderDefaultComponent: true,
toastList
});
jest.runAllTimers();
wrapper.update();
expect(wrapper.find('div.Toastify__toast').length).toBe(1);
expect(wrapper.find('div.Toastify__toast').at(0).find('div.Toastify__toast-body').text()).toBe('Foo bar');
});
});
});
describe('unconnect component with init toast component', () => {
const dismiss = jest.fn();
let wrapper;
beforeEach(() => {
dismiss.mockClear();
wrapper = mount(
);
});
afterEach(() => {
wrapper.unmount();
});
it('should render custom toast', () => {
jest.runAllTimers();
wrapper.update();
const toasts = wrapper.find('div.Toastify__toast');
expect(toasts.length).toBe(1);
expect(toasts.find('div.foo-bar').text()).toBe('Foo bar');
});
});
describe('connected component', () => {
const initialState = {
toasts: toastList
};
const mockStore = configureStore();
let store;
let providerWrapper;
beforeEach(() => {
store = mockStore(initialState);
providerWrapper = mount(
);
});
afterEach(() => {
providerWrapper.unmount();
});
it('should render the connected component', () => {
expect(providerWrapper.find(ConnectedToastContainer).length).toEqual(1);
});
it('should check prop matches with initialState', () => {
expect(providerWrapper.find(ToastContainer).prop('toastList')).toEqual(initialState.toasts);
});
it('should call dismiss action', () => {
providerWrapper.find(ToastContainer).prop('dismiss')();
expect(store.getActions()[0].type).toBe(types.TOAST_DISMISS);
});
it('should call actions ', () => {
store.dispatch(actions.message('Foo bar'));
store.dispatch(actions.dismiss('toast1'));
const calledActions = store.getActions();
expect(calledActions[0].type).toBe(types.TOAST_MESSAGE);
expect(calledActions[1].type).toBe(types.TOAST_DISMISS);
});
});
});