Skip to content
This repository was archived by the owner on Apr 9, 2019. It is now read-only.

Commit 216902b

Browse files
committed
Tests for popToRootView()
1 parent dce96b4 commit 216902b

File tree

1 file changed

+140
-0
lines changed

1 file changed

+140
-0
lines changed

spec/navigation-controller.spec.jsx

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const transformPrefix = getVendorPrefix('transform');
2020
const View = require('../examples/src/view');
2121
class ViewA extends View { }
2222
class ViewB extends View { }
23+
class ViewC extends View { }
2324

2425
describe('NavigationController', () => {
2526
const views = [
@@ -597,6 +598,145 @@ describe('NavigationController', () => {
597598
});
598599
});
599600
});
601+
describe('#__popToRootView', () => {
602+
beforeEach(done => {
603+
controller = renderIntoDocument(
604+
<NavigationController views={[<ViewA />,<ViewB />,<ViewC />]} />
605+
);
606+
requestAnimationFrame(() => {
607+
done();
608+
});
609+
});
610+
it('throws an error if an only one view is in the stack', () => {
611+
controller.state.views = [<ViewA />];
612+
expect(() => {
613+
controller.__popToRootView()
614+
}).to.throw(/stack/);
615+
});
616+
it('returns early if the controller is already transitioning', () => {
617+
const spy = sinon.spy(controller, 'setState');
618+
controller.__isTransitioning = true;
619+
controller.__popToRootView();
620+
expect(spy.called).not.to.be.true;
621+
});
622+
it('shows the view wrappers', () => {
623+
const spy = sinon.spy(controller, '__displayViews');
624+
controller.__popToRootView();
625+
expect(spy.calledWith('block')).to.be.true;
626+
});
627+
it('removes all but the root view from state.views', (done) => {
628+
controller.__popToRootView({
629+
onComplete() {
630+
expect(controller.state.views).to.have.length(1);
631+
expect(controller.state.views[0].type).to.equal(ViewA);
632+
done();
633+
},
634+
transition: Transition.type.NONE
635+
});
636+
});
637+
it('sets state.transition', (done) => {
638+
controller.__popToRootView({
639+
transition: Transition.type.NONE,
640+
onComplete() {
641+
done();
642+
}
643+
});
644+
requestAnimationFrame(() => {
645+
expect(controller.state.transition).to.equal(Transition.type.NONE);
646+
});
647+
});
648+
it('sets state.mountedViews', (done) => {
649+
const [prev,next] = controller.__viewIndexes;
650+
controller.__popToRootView({
651+
transition: Transition.type.PUSH_RIGHT,
652+
onComplete() {
653+
done();
654+
}
655+
});
656+
requestAnimationFrame(() => {
657+
expect(controller.state.mountedViews[prev].type).to.equal(ViewC);
658+
expect(controller.state.mountedViews[next].type).to.equal(ViewA);
659+
});
660+
});
661+
it('transitions the views', (done) => {
662+
const spy = sinon.spy(controller, '__transitionViews');
663+
controller.__popToRootView({ transition: Transition.type.NONE });
664+
requestAnimationFrame(() => {
665+
expect(spy.calledOnce).to.be.true;
666+
done();
667+
});
668+
});
669+
it('sets __isTransitioning=true', () => {
670+
controller.__popToRootView({ transition: Transition.type.NONE });
671+
expect(controller.__isTransitioning).to.be.true;
672+
});
673+
it('calls the onComplete callback', (done) => {
674+
controller.__popToRootView({
675+
onComplete() {
676+
expect(true).to.be.true;
677+
done();
678+
}
679+
});
680+
});
681+
it('does not rehydrate the state', (done) => {
682+
controller = renderIntoDocument(
683+
<NavigationController views={[<ViewA />]} preserveState={false} />
684+
);
685+
requestAnimationFrame(() => {
686+
var rootView = controller.refs[`view-${controller.__viewIndexes[0]}`];
687+
rootView.setState({
688+
foo: 'bar'
689+
});
690+
controller.pushView(<ViewB />, {
691+
transition: Transition.type.NONE,
692+
onComplete() {
693+
controller.pushView(<ViewC />, {
694+
transition: Transition.type.NONE,
695+
onComplete() {
696+
controller.popToRootView({
697+
transition: Transition.type.NONE,
698+
onComplete() {
699+
rootView = controller.refs[`view-${controller.__viewIndexes[1]}`];
700+
expect(rootView.state)
701+
.not.to.have.property('foo');
702+
done();
703+
}
704+
});
705+
}
706+
})
707+
}
708+
});
709+
});
710+
});
711+
it('rehydrates the state', (done) => {
712+
controller = renderIntoDocument(
713+
<NavigationController views={[<ViewA />]} preserveState={true} />
714+
);
715+
requestAnimationFrame(() => {
716+
controller.refs[`view-${controller.__viewIndexes[0]}`].setState({
717+
foo: 'bar'
718+
});
719+
controller.pushView(<ViewB />, {
720+
transition: Transition.type.NONE,
721+
onComplete() {
722+
controller.pushView(<ViewC />, {
723+
transition: Transition.type.NONE,
724+
onComplete() {
725+
controller.popToRootView({
726+
transition: Transition.type.NONE,
727+
onComplete() {
728+
expect(controller.refs[`view-${controller.__viewIndexes[1]}`].state)
729+
.to.have.property('foo');
730+
done();
731+
}
732+
});
733+
}
734+
})
735+
}
736+
});
737+
});
738+
});
739+
});
600740
describe('#__setViews', () => {
601741
beforeEach(done => {
602742
requestAnimationFrame(() => {

0 commit comments

Comments
 (0)