216 lines
No EOL
6 KiB
TypeScript
216 lines
No EOL
6 KiB
TypeScript
// License: LGPL-3.0-or-later
|
|
import * as React from 'react';
|
|
import 'jest';
|
|
import {Wizard} from './Wizard'
|
|
import {WizardState, WizardTabPanelState} from "./wizard_state";
|
|
import {Form} from "mobx-react-form";
|
|
import {action, computed, observable} from 'mobx';
|
|
import {ReactWrapper} from 'enzyme';
|
|
import {WizardPanel} from "./WizardPanel";
|
|
|
|
import {mountForMobxWithIntl, runTestsOnConditions, TriggerAndAction} from "../test/react_test_helpers";
|
|
import {UniqueIdMock} from "../test/unique_id_mock";
|
|
|
|
let uniqueIdMock = new UniqueIdMock();
|
|
class MockableTabPanelState extends WizardTabPanelState
|
|
{
|
|
@observable
|
|
customIsValid: boolean
|
|
|
|
@action.bound
|
|
setValid(validity:boolean){
|
|
this.customIsValid = validity;
|
|
}
|
|
|
|
@computed
|
|
get isValid():boolean {
|
|
return this.customIsValid
|
|
}
|
|
|
|
}
|
|
|
|
class EasyWizardState extends WizardState{
|
|
constructor(){
|
|
super(MockableTabPanelState)
|
|
}
|
|
createForm(i: any): Form {
|
|
return new Form(i)
|
|
}
|
|
|
|
uniqueIdFunction(prefix?:string) {
|
|
return uniqueIdMock.uniqueId.bind(uniqueIdMock)(prefix);
|
|
}
|
|
|
|
focusFunction(panel:MockableTabPanelState){
|
|
this.wrapperForFocus.find(`#${panel.id}`).hostNodes().prop('onFocus')(null)
|
|
}
|
|
|
|
wrapperForFocus: ReactWrapper;
|
|
|
|
}
|
|
|
|
describe('Wizard', () => {
|
|
let data =
|
|
{
|
|
tab1: {
|
|
tabName: "Tab1",
|
|
label: "Label1",
|
|
subFormDef: {extra: "nothing" }
|
|
},
|
|
tab2: {
|
|
tabName: "Tab2",
|
|
label: "Label2",
|
|
subFormDef: {extra: "not" }
|
|
},
|
|
tab3: {
|
|
tabName: "Tab3",
|
|
label: "Label3",
|
|
subFormDef: {extra: "no3t" }
|
|
},
|
|
|
|
|
|
}
|
|
|
|
beforeEach(() => {
|
|
uniqueIdMock.reset()
|
|
});
|
|
|
|
|
|
|
|
let state:EasyWizardState = null
|
|
let tab1: MockableTabPanelState, tab2: MockableTabPanelState, tab3 : MockableTabPanelState = null
|
|
let wrapper: ReactWrapper;
|
|
let disabledTabs: boolean = false
|
|
|
|
beforeEach(() => {
|
|
state = new EasyWizardState()
|
|
state.addTab({tabName: data.tab1.tabName, label: data.tab1.label, tabFieldDefinition: data.tab1.subFormDef});
|
|
state.addTab({tabName: data.tab2.tabName, label: data.tab2.label, tabFieldDefinition: data.tab2.subFormDef});
|
|
state.addTab({tabName: data.tab3.tabName, label: data.tab3.label, tabFieldDefinition: data.tab3.subFormDef});
|
|
state.initialize()
|
|
tab1 = (state.tabsByName[data.tab1.tabName] as MockableTabPanelState)
|
|
tab1.setValid(true)
|
|
tab2 = (state.tabsByName[data.tab2.tabName] as MockableTabPanelState)
|
|
tab2.setValid(true)
|
|
tab3 = (state.tabsByName[data.tab3.tabName] as MockableTabPanelState)
|
|
wrapper = mountForMobxWithIntl({state:state, disabledTabs: disabledTabs}, (props) => {
|
|
return <Wizard wizardState={props.state} disableTabs={props.disabledTabs}>
|
|
{
|
|
props.state.panels.map((tab) => {
|
|
return <WizardPanel tab={tab}>
|
|
<button onClick={tab.parent.moveToNextTab}/>
|
|
</WizardPanel>
|
|
})
|
|
}
|
|
</Wizard>
|
|
|
|
})
|
|
state.wrapperForFocus = wrapper
|
|
|
|
})
|
|
|
|
it('first tab is active', (done) => {
|
|
//if disabledTabs changed, we change
|
|
runTestsOnConditions(new TriggerAndAction(
|
|
() => disabledTabs || !disabledTabs,
|
|
() => {
|
|
wrapper.instance().forceUpdate();
|
|
wrapper.update();
|
|
expect(wrapper.debug()).toMatchSnapshot();
|
|
done();
|
|
}))
|
|
disabledTabs = false
|
|
|
|
})
|
|
|
|
describe('go to the second tab', () => {
|
|
let commonCondition:any
|
|
beforeEach(() => {
|
|
commonCondition = (done: Function) => {
|
|
runTestsOnConditions(new TriggerAndAction(
|
|
() => state.activeTab.tabName == data.tab2.tabName,
|
|
() => {
|
|
wrapper.instance().forceUpdate();
|
|
wrapper.update();
|
|
expect(wrapper.debug()).toMatchSnapshot();
|
|
done();
|
|
}))
|
|
}
|
|
})
|
|
|
|
it('set via tab click', (done) => {
|
|
commonCondition(done);
|
|
let secondTab = wrapper.find('#tab2');
|
|
|
|
secondTab.hostNodes().simulate('focus');
|
|
})
|
|
|
|
it('set via next click', (done) => {
|
|
commonCondition(done);
|
|
let button = wrapper.find('button').at(0);
|
|
button.hostNodes().simulate('click');
|
|
})
|
|
|
|
it('go to next via backend', (done) => {
|
|
commonCondition(done);
|
|
state.moveToTab(state.tabsByName[data.tab2.tabName].id);
|
|
|
|
})
|
|
})
|
|
|
|
describe('Move back on disabled', () => {
|
|
|
|
function waitingOnWhatTabName(tabName:string, done:any){
|
|
runTestsOnConditions({
|
|
finishCondition: () => state.activeTab.tabName == data.tab3.tabName,
|
|
action: () => {
|
|
wrapper.instance().forceUpdate();
|
|
wrapper.update();
|
|
}
|
|
},
|
|
{
|
|
finishCondition: () => state.activeTab.tabName == tabName,
|
|
action: () => {
|
|
wrapper.instance().forceUpdate();
|
|
wrapper.update();
|
|
expect(wrapper.debug()).toMatchSnapshot();
|
|
done();
|
|
}
|
|
})
|
|
}
|
|
|
|
|
|
it('make second invalid so move back there', (done) => {
|
|
waitingOnWhatTabName(data.tab2.tabName, done)
|
|
tab1 = (state.tabsByName[data.tab1.tabName] as MockableTabPanelState)
|
|
tab1.setValid(true)
|
|
tab2 = (state.tabsByName[data.tab2.tabName] as MockableTabPanelState)
|
|
tab2.setValid(true)
|
|
tab3 = (state.tabsByName[data.tab3.tabName] as MockableTabPanelState)
|
|
|
|
state.focusTab(state.tabsByName[data.tab3.tabName].id)
|
|
|
|
tab2.setValid(false)
|
|
})
|
|
|
|
it('make first invalid so move back there', (done) => {
|
|
waitingOnWhatTabName(data.tab1.tabName, done)
|
|
tab1 = (state.tabsByName[data.tab1.tabName] as MockableTabPanelState)
|
|
tab1.setValid(true)
|
|
tab2 = (state.tabsByName[data.tab2.tabName] as MockableTabPanelState)
|
|
tab2.setValid(true)
|
|
tab3 = (state.tabsByName[data.tab3.tabName] as MockableTabPanelState)
|
|
|
|
state.focusTab(state.tabsByName[data.tab3.tabName].id)
|
|
wrapper.instance().forceUpdate();
|
|
wrapper.update();
|
|
expect(state.activeTab.tabName).toEqual(data.tab3.tabName)
|
|
tab1.setValid(false)
|
|
wrapper.instance().forceUpdate();
|
|
wrapper.update();
|
|
expect(wrapper.debug()).toMatchSnapshot();
|
|
|
|
})
|
|
})
|
|
|
|
}) |