import React from 'react'
import onePane from '../onePane.methods';
import * as keyActions from '../../../shared/screenStore/keyStore/key.actions';
import * as headerActions from '../../../shared/screenStore/headerStore/header.actions';
import * as paneElementActions from '../../../shared/screenStore/paneElementStore/paneElement.action';
import { Fragment } from 'react';
import { IKeyAction, IKeyState } from '../../../shared/screenStore/keyStore/key.interface';
import { paneType } from '../../../utilities/interfaces';
import { PUSH_KEY } from '../../../shared/screenStore/keyStore/key.types';
import { IHeaderAction } from '../../../shared/screenStore/headerStore/header.interface';
import { PUSH_HEADER } from '../../../shared/screenStore/headerStore/header.types';
import { IPaneElementAction, IPaneElementState } from '../../../shared/screenStore/paneElementStore/paneElement.interface';
import { PUSH_PANE_ELEMENT } from '../../../shared/screenStore/paneElementStore/paneElement.types';
import { paneElementActionBuilder } from '../../../shared/screenStore/paneElementStore/tests/paneElement.methods.helpers';
import { headerActionBuilder } from '../../../shared/screenStore/headerStore/tests/header.methods.helpers';
import { KeyActionBuilder, mockKeyState } from '../../../shared/screenStore/keyStore/tests/key.methods.helpers';
import { resetApp, store } from '../../../appStore';
describe('onePane methods', () => {
beforeEach(() => {
jest.clearAllMocks();
});
it('onePane Add with header with merge', () => {
// Arrange
const expectedKey: IKeyAction = KeyActionBuilder(PUSH_KEY, paneType.ONE, 'test1', true);
const expectedHeader: IHeaderAction = headerActionBuilder(PUSH_HEADER, `${paneType.ONE}_test1`, { title: 'test title' });
const expectedPaneElement: IPaneElementAction = paneElementActionBuilder(PUSH_PANE_ELEMENT, `${paneType.ONE}_test1`, );
const pushKeySpy = jest.spyOn(keyActions, 'pushKey');
const pushheaderSpy = jest.spyOn(headerActions, 'pushHeader');
const pushPaneElementsSpy = jest.spyOn(paneElementActions, 'pushElement');
// Act
const _onePaneAdd = onePane.Add('test1', , { title: 'test title' }, true);
// Assert
expect(pushKeySpy).toBeCalled();
expect(pushheaderSpy).toBeCalled();
expect(pushPaneElementsSpy).toBeCalled();
expect(pushKeySpy.mock.results.find(x => x.value)?.value).toStrictEqual(expectedKey)
expect(pushheaderSpy.mock.results.find(x => x.value)?.value).toStrictEqual(expectedHeader)
expect(pushPaneElementsSpy.mock.results.find(x => x.value)?.value).toStrictEqual(expectedPaneElement)
});
it('onePane Add with header with no merge', () => {
// Arrange
const expectedKey: IKeyAction = KeyActionBuilder(PUSH_KEY, paneType.ONE, 'test2', false);
const expectedHeader: IHeaderAction = headerActionBuilder(PUSH_HEADER, `${paneType.ONE}_test2`, { title: 'test title' });
const expectedPaneElement: IPaneElementAction = paneElementActionBuilder(PUSH_PANE_ELEMENT, `${paneType.ONE}_test2`, );
const pushKeySpy = jest.spyOn(keyActions, 'pushKey');
const pushheaderSpy = jest.spyOn(headerActions, 'pushHeader');
const pushPaneElementsSpy = jest.spyOn(paneElementActions, 'pushElement');
// Act
const _onePaneAdd = onePane.Add('test2', , { title: 'test title' });
// Assert
expect(pushKeySpy).toBeCalled();
expect(pushheaderSpy).toBeCalled();
expect(pushPaneElementsSpy).toBeCalled();
expect(pushKeySpy.mock.results.find(x => x.value)?.value).toStrictEqual(expectedKey)
expect(pushheaderSpy.mock.results.find(x => x.value)?.value).toStrictEqual(expectedHeader)
expect(pushPaneElementsSpy.mock.results.find(x => x.value)?.value).toStrictEqual(expectedPaneElement)
});
it('onePane Add no header with merge', () => {
// Arrange
const expectedKey: IKeyAction = KeyActionBuilder(PUSH_KEY, paneType.ONE, 'test3', true);
const expectedPaneElement: IPaneElementAction = paneElementActionBuilder(PUSH_PANE_ELEMENT, `${paneType.ONE}_test3`, );
const pushKeySpy = jest.spyOn(keyActions, 'pushKey');
const pushheaderSpy = jest.spyOn(headerActions, 'pushHeader');
const pushPaneElementsSpy = jest.spyOn(paneElementActions, 'pushElement');
// Act
const _onePaneAdd = onePane.Add('test3', , undefined, true);
// Assert
expect(pushKeySpy).toBeCalled();
expect(pushheaderSpy).not.toBeCalled();
expect(pushPaneElementsSpy).toBeCalled();
expect(pushKeySpy.mock.results.find(x => x.value)?.value).toStrictEqual(expectedKey)
expect(pushPaneElementsSpy.mock.results.find(x => x.value)?.value).toStrictEqual(expectedPaneElement)
});
it('onePane Add with no header with no merge', () => {
// Arrange
const expectedKey: IKeyAction = KeyActionBuilder(PUSH_KEY, paneType.ONE, 'test4', false);
const expectedPaneElement: IPaneElementAction = paneElementActionBuilder(PUSH_PANE_ELEMENT, `${paneType.ONE}_test4`, );
const pushKeySpy = jest.spyOn(keyActions, 'pushKey');
const pushheaderSpy = jest.spyOn(headerActions, 'pushHeader');
const pushPaneElementsSpy = jest.spyOn(paneElementActions, 'pushElement');
// Act
const _onePaneAdd = onePane.Add('test4', );
// Assert
expect(pushKeySpy).toBeCalled();
expect(pushPaneElementsSpy).toBeCalled();
expect(pushheaderSpy).not.toBeCalled();
expect(pushKeySpy.mock.results.find(x => x.value)?.value).toStrictEqual(expectedKey)
expect(pushPaneElementsSpy.mock.results.find(x => x.value)?.value).toStrictEqual(expectedPaneElement)
});
it('onePane AddOrMoveToFront add called', () => {
// Arrange
const pushKeySpy = jest.spyOn(keyActions, 'pushKey');
const pushheaderSpy = jest.spyOn(headerActions, 'pushHeader');
const pushPaneElementsSpy = jest.spyOn(paneElementActions, 'pushElement');
const moveToFrontSpy = jest.spyOn(keyActions, 'moveToFront');
// Act
const _onePaneAdd = onePane.AddOrMoveToFront('test5', , { title: 'test title' }, true);
// Assert
expect(pushKeySpy).toBeCalled();
expect(pushheaderSpy).toBeCalled();
expect(pushPaneElementsSpy).toBeCalled();
expect(moveToFrontSpy).not.toBeCalled();
});
it('onePane AddOrMoveToFront moveToFront called', () => {
// Arrange
const pushKeySpy = jest.spyOn(keyActions, 'pushKey');
const pushheaderSpy = jest.spyOn(headerActions, 'pushHeader');
const pushPaneElementsSpy = jest.spyOn(paneElementActions, 'pushElement');
const moveToFrontSpy = jest.spyOn(keyActions, 'moveToFront');
// Act
const _onePaneAdd = onePane.AddOrMoveToFront('test1', , { title: 'test title' }, true);
// Assert
expect(pushKeySpy).not.toBeCalled();
expect(pushheaderSpy).not.toBeCalled();
expect(pushPaneElementsSpy).not.toBeCalled();
expect(moveToFrontSpy).toBeCalled();
});
it('onePane mergeToOppositePane called', () => {
// Arrange
const moveToFrontSpy = jest.spyOn(keyActions, 'changeScreen');
// Act
const _onePaneAdd = onePane.mergeToOppositePane();
const keyStore = store.getState().KeyReducers;
// Assert
expect(moveToFrontSpy).toBeCalled();
expect(moveToFrontSpy).toBeCalledTimes(3);
expect(keyStore.keys.filter(val => val.screen === paneType.TWO).length).toEqual(3)
expect(keyStore.keys.filter(val => val.screen === paneType.ONE).length).toEqual(2)
});
it('onePaneBackToHome calls BackToHome', () => {
// Arrange
const keyState = mockKeyState(paneType.ONE, false);
keyState.keys.map(val => store.dispatch(keyActions.pushKey(val.screen, val.key, val.isMerge)))
const popToFrontSpy = jest.spyOn(keyActions, 'popToFront')
const removeHeaderKeyBySpy = jest.spyOn(headerActions, 'removeHeaderByKey');
const removePaneElementBySpy = jest.spyOn(paneElementActions, 'removePaneElementByKey');
// Act
const _onePaneBackToHome = onePane.BackToHome();
// Assert
expect(popToFrontSpy).toBeCalled();
expect(popToFrontSpy).toBeCalledTimes(1);
expect(removeHeaderKeyBySpy).toBeCalled();
expect(removeHeaderKeyBySpy).toBeCalledTimes(4);
expect(removePaneElementBySpy).toBeCalled();
expect(removePaneElementBySpy).toBeCalledTimes(4);
});
it('onePaneGoBack calls GoBack', () => {
// Arrange
const keyState = mockKeyState(paneType.ONE, false, `${paneType.ONE}_`);
keyState.keys.map(val => store.dispatch(keyActions.pushKey(val.screen, val.key, val.isMerge)))
const expectedState: IKeyState =
{
keys:
[{ key: 'ONE_test2', isMerge: false, screen: paneType.ONE },
{ key: 'ONE_ONE_first', isMerge: false, screen: paneType.ONE },
{ key: 'ONE_ONE_second', isMerge: false, screen: paneType.ONE },
{ key: 'ONE_test3', isMerge: true, screen: paneType.TWO },
{ key: 'ONE_test5', isMerge: true, screen: paneType.TWO },
{ key: 'ONE_test1', isMerge: true, screen: paneType.TWO }]
}
const popScreenSpy = jest.spyOn(keyActions, 'popScreen')
const removeHeaderKeyBySpy = jest.spyOn(headerActions, 'removeHeaderByKey');
const removePaneElementBySpy = jest.spyOn(paneElementActions, 'removePaneElementByKey');
// Act
const _onePaneBack = onePane.GoBack();
const finalState: IKeyState = store.getState().KeyReducers;
// Assert
expect(finalState).toStrictEqual(expectedState)
expect(popScreenSpy).toBeCalled();
expect(popScreenSpy).toBeCalledTimes(1);
expect(removeHeaderKeyBySpy).toBeCalled();
expect(removeHeaderKeyBySpy).toBeCalledTimes(1);
expect(removePaneElementBySpy).toBeCalled();
expect(removePaneElementBySpy).toBeCalledTimes(1);
});
it('replacePane calls', () => {
// Arrange
const replacePaneElementSpy = jest.spyOn(paneElementActions, 'replacePaneElement');
// Act
const _onePaneBack = onePane.ReplacePane('test', );
// Assert
expect(replacePaneElementSpy).toBeCalled();
expect(replacePaneElementSpy).toBeCalledTimes(1);
});
it('ReplaceHeader calls', () => {
// Arrange
const replaceHeaderSpy = jest.spyOn(headerActions, 'replaceHeader');
// Act
const _onePaneBack = onePane.ReplaceHeader('test', { title: 'test' });
// Assert
expect(replaceHeaderSpy).toBeCalled();
expect(replaceHeaderSpy).toBeCalledTimes(1);
});
});