import { shallow } from 'enzyme';
import * as React from 'react';
import Welcome from '../src/renderer/components/welcome';
import { ipcRenderer } from './__mocks__/electron';

describe('welcome', () => {
    const welcomeLabel = 'welcome';
    const welcomeMock = {
        url: 'https://my.symphony.com',
        message: '',
        urlValid: true,
        sso: false,
    };
    const onLabelEvent = 'on';
    const removeListenerLabelEvent = 'removeListener';

    it('should render correctly', () => {
        const wrapper = shallow(React.createElement(Welcome));
        expect(wrapper).toMatchSnapshot();
    });

    it('should call `welcome` event when component is mounted', () => {
        const spy = jest.spyOn(ipcRenderer, onLabelEvent);
        shallow(React.createElement(Welcome));
        expect(spy).toBeCalledWith(welcomeLabel, expect.any(Function));
    });

    it('should remove listener `welcome` when component is unmounted', () => {
        const spyMount = jest.spyOn(ipcRenderer, onLabelEvent);
        const spyUnmount = jest.spyOn(ipcRenderer, removeListenerLabelEvent);

        const wrapper = shallow(React.createElement(Welcome));
        expect(spyMount).toBeCalledWith(welcomeLabel, expect.any(Function));

        wrapper.unmount();
        expect(spyUnmount).toBeCalledWith(welcomeLabel, expect.any(Function));
    });

    it('should call `updateState` when component is mounted', () => {
        const spy = jest.spyOn(Welcome.prototype, 'setState');
        shallow(React.createElement(Welcome));

        ipcRenderer.send('welcome', welcomeMock);

        expect(spy).toBeCalledWith(welcomeMock);
    });

    it('should change pod url in text box', () => {
        const podUrlMock = {
            url: 'https://corporate.symphony.com',
            message: '',
            urlValid: true,
            sso: false,
        };

        const spy = jest.spyOn(Welcome.prototype, 'setState');
        const updatePodUrlSpy = jest.spyOn(Welcome.prototype, 'updatePodUrl');

        const wrapper = shallow(React.createElement(Welcome));
        ipcRenderer.send('welcome', welcomeMock);

        const welcomePodUrlBox = `input.Welcome-main-container-podurl-box`;
        const input = wrapper.find(welcomePodUrlBox);

        input.simulate('focus');
        input.simulate('change', {target: {value: 'https://corporate.symphony.com'}});

        expect(updatePodUrlSpy).toBeCalled();
        expect(spy).toBeCalledWith(podUrlMock);
    });

    it('should show message for invalid pod url', () => {
        const podUrlMock = {
            url: 'abcdef',
            message: 'Please enter a valid url',
            urlValid: false,
            sso: false,
        };

        const spy = jest.spyOn(Welcome.prototype, 'setState');
        const updatePodUrlSpy = jest.spyOn(Welcome.prototype, 'updatePodUrl');

        const wrapper = shallow(React.createElement(Welcome));
        ipcRenderer.send('welcome', welcomeMock);

        const welcomePodUrlBox = `input.Welcome-main-container-podurl-box`;
        const input = wrapper.find(welcomePodUrlBox);

        input.simulate('focus');
        input.simulate('change', {target: {value: 'abcdef'}});

        expect(updatePodUrlSpy).toBeCalled();
        expect(spy).toBeCalledWith(podUrlMock);
    });

    it('should click sso checkbox', () => {
        const podUrlMock = {
            url: 'https://my.symphony.com',
            message: '',
            urlValid: true,
            sso: true,
        };

        const spy = jest.spyOn(Welcome.prototype, 'setState');
        const updatePodUrlSpy = jest.spyOn(Welcome.prototype, 'updateSsoCheckbox');

        const wrapper = shallow(React.createElement(Welcome));
        ipcRenderer.send('welcome', welcomeMock);

        const welcomePodUrlBox = `input[type="checkbox"]`;
        const input = wrapper.find(welcomePodUrlBox);

        input.simulate('focus');
        input.simulate('change', {target: {checked: true}});

        expect(updatePodUrlSpy).toBeCalled();
        expect(spy).toBeCalledWith(podUrlMock);
    });

    it('should set pod url', () => {
        const spy = jest.spyOn(Welcome.prototype, 'setState');
        const setPodUrlSpy = jest.spyOn(Welcome.prototype, 'setPodUrl');

        const wrapper = shallow(React.createElement(Welcome));
        ipcRenderer.send('welcome', welcomeMock);
        const welcomeContinueButton = `button.Welcome-continue-button`;
        wrapper.find(welcomeContinueButton).simulate('click');

        expect(setPodUrlSpy).toBeCalled();
        expect(spy).toBeCalledWith(welcomeMock);
    });
});
