blob: 2542bf5c4f2f328cb435d9bf9d2c247c1c17f044 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
cr.define('onboarding_welcome_navigation_behavior_test', function() {
suite('NavigationBehaviorTest', function() {
let elements = [];
let callOrders = [];
suiteSetup(function() {
Polymer({
is: 'test-element',
behaviors: [welcome.NavigationBehavior],
ready: function() {
this.reset();
},
onRouteEnter: function() {
this.enterCalled = true;
callOrders.push('enter');
},
onRouteChange: function() {
this.changeCalled = true;
callOrders.push('change');
},
onRouteExit: function() {
this.exitCalled = true;
callOrders.push('exit');
},
reset: function() {
this.enterCalled = false;
this.changeCalled = false;
this.exitCalled = false;
}
});
});
setup(function() {
PolymerTest.clearBody();
// Creates 3 elements with IDs step-(0~2).
for (let i = 0; i < 3; i++) {
elements.push(document.createElement('test-element'));
elements[i].id = `step-${i}`;
}
});
teardown(function() {
callOrders = [];
elements = [];
});
function appendAll() {
elements.forEach(elem => document.body.appendChild(elem));
}
function resetAll() {
elements.forEach(elem => elem.reset());
callOrders = [];
}
// exit should be called first, enter last, and all change calls in between.
function assertCallOrders() {
assertEquals(callOrders[0], 'exit');
assertEquals(callOrders[callOrders.length - 1], 'enter');
callOrders.slice(1, callOrders.length - 1).forEach(called => {
assertEquals(called, 'change');
});
}
test('correct hooks fire when elements are attached', function() {
// Setup the "current route" state before things are appended.
welcome.navigateTo(
/* doesn't matter which route */ welcome.Routes.NEW_USER, 1);
appendAll();
assertFalse(elements[0].enterCalled);
assertTrue(elements[0].changeCalled);
assertFalse(elements[0].exitCalled);
assertTrue(elements[1].enterCalled);
assertTrue(elements[1].changeCalled);
assertFalse(elements[1].exitCalled);
assertFalse(elements[2].enterCalled);
assertTrue(elements[2].changeCalled);
assertFalse(elements[2].exitCalled);
});
test('hooks fire in expected order when elements are attached', function() {
// Pretend we're on step-1
welcome.navigateTo(
/* doesn't matter which route */ welcome.Routes.NEW_USER, 1);
appendAll();
resetAll();
// move on from step-1 to step 2.
welcome.navigateToNextStep();
assertFalse(elements[0].enterCalled);
assertTrue(elements[0].changeCalled);
assertFalse(elements[0].exitCalled);
assertFalse(elements[1].enterCalled);
assertTrue(elements[1].changeCalled);
assertTrue(elements[1].exitCalled);
assertTrue(elements[2].enterCalled);
assertTrue(elements[2].changeCalled);
assertFalse(elements[2].exitCalled);
assertCallOrders();
});
test('popstate works as expected', async function() {
// Pretend we're on step-1
welcome.navigateTo(
/* doesn't matter which route */ welcome.Routes.NEW_USER, 1);
appendAll();
// move on from step-1 to step 2.
welcome.navigateToNextStep();
resetAll();
// back from step-2 to step 1.
window.history.back();
await test_util.eventToPromise('popstate', window);
assertFalse(elements[0].enterCalled);
assertTrue(elements[0].changeCalled);
assertFalse(elements[0].exitCalled);
assertTrue(elements[1].enterCalled);
assertTrue(elements[1].changeCalled);
assertFalse(elements[1].exitCalled);
assertFalse(elements[2].enterCalled);
assertTrue(elements[2].changeCalled);
assertTrue(elements[2].exitCalled);
assertCallOrders();
resetAll();
// move on from step-1 to step 2 again.
window.history.forward();
await test_util.eventToPromise('popstate', window);
assertFalse(elements[0].enterCalled);
assertTrue(elements[0].changeCalled);
assertFalse(elements[0].exitCalled);
assertFalse(elements[1].enterCalled);
assertTrue(elements[1].changeCalled);
assertTrue(elements[1].exitCalled);
assertTrue(elements[2].enterCalled);
assertTrue(elements[2].changeCalled);
assertFalse(elements[2].exitCalled);
assertCallOrders();
});
});
});