Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(365)

Unified Diff: chrome/test/data/webui/media_router/media_router_container_tests.js

Issue 1204943002: Tests for Media Router media-router-container Polymer element. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changes per michaelpg@ and dbeam@'s comments. Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/test/data/webui/media_router/media_router_container_tests.js
diff --git a/chrome/test/data/webui/media_router/media_router_container_tests.js b/chrome/test/data/webui/media_router/media_router_container_tests.js
new file mode 100644
index 0000000000000000000000000000000000000000..b51c80e55715f9499cd92e0f280d0f5ce84d7e99
--- /dev/null
+++ b/chrome/test/data/webui/media_router/media_router_container_tests.js
@@ -0,0 +1,409 @@
+// Copyright 2015 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.
+
+/** @fileoverview Suite of tests for media-router-container. */
+cr.define('media_router_container', function() {
+ function registerTests() {
+ suite('MediaRouterContainer', function() {
+ /**
+ * Media Router Container created before each test.
+ * @type {media_router_container}
+ */
+ var container;
+
+ /**
+ * The blocking issue to show.
+ * @type {?media_router.Issue}
+ */
+ var fakeBlockingIssue;
+
+ /**
+ * The list of CastModes to show.
+ * @type {!Array<!media_router.CastMode>}
+ */
+ var fakeCastModeList = [];
+
+ /**
+ * The blocking issue to show.
+ * @type {?media_router.Issue}
+ */
+ var fakeNonBlockingIssue;
+
+ /**
+ * The list of current routes.
+ * @type {!Array<!media_router.Route>}
+ */
+ var fakeRouteList = [];
+
+ /**
+ * The list of available sinks.
+ * @type {!Array<!media_router.Sink>}
+ */
+ var fakeSinkList = [];
+
+ /**
+ * The list of elements to check for visibility.
+ * @type {!Array<string>}
+ * @const
+ */
+ var visibilityCheckElementIdList = [
+ 'cast-mode-header-text',
+ 'cast-mode-list',
+ 'container-header',
+ 'issue-banner',
+ 'route-details',
+ 'sink-list',
+ 'sink-list-header-text',
+ ];
+
+ // Checks whether the current icon matches the icon used for the view.
+ var checkArrowDropIcon = function(view) {
+ assertEquals(container.$['arrow-drop-icon'].icon,
Kevin M 2015/07/08 23:02:21 Expected values precede actual values (important t
apacible 2015/07/09 00:02:27 Done.
+ container.computeArrowDropIcon_(view));
+ }
+
+ // Checks whether |view| matches the current view of |container|.
+ var checkCurrentView = function(view) {
+ assertEquals(container.currentView_, view);
+ }
+
+ // Checks whether the elements specified in |elementIdList| are hidden.
+ // Checks whether all other elements are visible.
+ var checkElementsHiddenWithId = function(elementIdList) {
+ for (var i = 0; i < elementIdList.length; i++) {
+ checkElementHidden(true, container.$[elementIdList[i]]);
+ }
+
+ for (var j = 0; j < visibilityCheckElementIdList.length; j++) {
+ if (elementIdList.indexOf(visibilityCheckElementIdList[j]) == -1) {
+ checkElementHidden(false,
+ container.$[visibilityCheckElementIdList[j]]);
+ }
+ }
+ };
+
+ // Checks whether |element| is hidden.
+ var checkElementHidden = function(hidden, element) {
+ assertEquals(hidden, element.hidden);
+ };
+
+ // Checks whether |expected| and the text in the |elementId| element
+ // are equal.
+ var checkElementText = function(expected, element) {
+ assertEquals(expected.trim(), element.textContent.trim());
+ }
+
+ // Checks whether |expected| and the text in the |elementId| element
+ // are equal given an id.
+ var checkElementTextWithId = function(expected, elementId) {
+ checkElementText(expected, container.$[elementId]);
+ };
+
+ // Import media_router_container.html before running suite.
+ suiteSetup(function() {
+ return PolymerTest.importHtml(
+ 'chrome://media-router/elements/media_router_container/' +
+ 'media_router_container.html');
+ });
+
+ // Initialize an issue-banner before each test.
+ setup(function(done) {
+ PolymerTest.clearBody();
+ container = document.createElement('media-router-container');
+ document.body.appendChild(container);
+
+ // Initialize local variables.
+ fakeCastModeList = [
+ new media_router.CastMode(1, 'Cast Mode 1', 'Description 1'),
+ new media_router.CastMode(2, 'Cast Mode 2', 'Description 2'),
+ new media_router.CastMode(3, 'Cast Mode 3', 'Description 3'),
+ ];
+
+ fakeRouteList = [
+ new media_router.Route('id 1', 'sink id 1', 'Title 1', true),
+ new media_router.Route('id 2', 'sink id 2', 'Title 2', false),
+ ];
+
+ fakeSinkList = [
+ new media_router.Sink('sink id 1', 'Sink 1',
+ media_router.SinkStatus.ACTIVE, [1, 2, 3]),
+ new media_router.Sink('sink id 2', 'Sink 2',
+ media_router.SinkStatus.ACTIVE, [1, 2, 3]),
+ new media_router.Sink('sink id 3', 'Sink 3',
+ media_router.SinkStatus.PENDING, [1, 2, 3]),
+ ];
+
+ fakeBlockingIssue = new media_router.Issue(
+ 'issue id 1', 'Issue Title 1', 'Issue Message 1', 0, 1,
+ 'route id 1', true, 1234);
+
+ fakeNonBlockingIssue = new media_router.Issue(
+ 'issue id 2', 'Issue Title 2', 'Issue Message 2', 0, 1,
+ 'route id 2', false, 1234);
+
+ // Allow for the media router container to be created and attached.
+ setTimeout(done);
+ });
+
+ // Tests for 'close-button-click' event firing when the close button
+ // is clicked.
+ test('close button click', function(done) {
+ container.addEventListener('close-button-click', function() {
+ done();
+ });
+ MockInteractions.tap(container.$['close-button']);
+ });
+
+ // Tests for 'create-route' event firing when a sink with no associated
+ // route is clicked.
+ test('select sink without a route', function(done) {
+ container.sinkList = fakeSinkList;
+
+ setTimeout(function() {
+ var sinkList =
+ container.$['sink-list'].querySelectorAll('paper-item');
+
+ container.addEventListener('create-route', function(data) {
+ assertEquals(fakeSinkList[2].id, data.detail.sinkId);
+ assertEquals(container.selectedCastModeValue_,
+ data.detail.selectedCastModeValue);
+ done();
+ });
+
+ // Tap on a sink without a route, which should fire a 'create-route'
+ // event.
+ MockInteractions.tap(sinkList[2]);
+ });
+ });
+
+ // Tests that selecting a sink with an associated route will make the
+ // |container| switch to ROUTE_DETAILS view.
+ test('select sink with a route', function(done) {
+ container.sinkList = fakeSinkList;
+ container.routeList = fakeRouteList;
+
+ setTimeout(function() {
+ var sinkList =
+ container.$['sink-list'].querySelectorAll('paper-item');
+
+ checkCurrentView(container.containerView_.SINK_LIST);
+ MockInteractions.tap(sinkList[0]);
+ checkCurrentView(container.containerView_.ROUTE_DETAILS);
+ done();
+ });
+ });
+
+ // Tests that |container| returns to SINK_LIST view and arrow drop icon
+ // toggles after a cast mode is selected.
+ test('select cast mode', function(done) {
+ container.castModeList = fakeCastModeList;
+
+ MockInteractions.tap(container.$['arrow-drop-icon']);
+ checkArrowDropIcon(container.containerView_.CAST_MODE_LIST);
+ checkCurrentView(container.containerView_.CAST_MODE_LIST);
+
+ setTimeout(function() {
+ var castModeList =
+ container.$['cast-mode-list'].querySelectorAll('paper-item');
+
+ MockInteractions.tap(castModeList[2]);
+ checkArrowDropIcon(container.containerView_.SINK_LIST);
+ checkCurrentView(container.containerView_.SINK_LIST);
+ done();
+ });
+ });
+
+ // Tests that clicking on the drop down icon will toggle |container|
+ // between SINK_LIST and CAST_MODE_LIST views.
+ test('click drop down icon', function() {
+ checkCurrentView(container.containerView_.SINK_LIST);
+
+ MockInteractions.tap(container.$['arrow-drop-icon']);
+ checkArrowDropIcon(container.containerView_.CAST_MODE_LIST);
+ checkCurrentView(container.containerView_.CAST_MODE_LIST);
+
+ MockInteractions.tap(container.$['arrow-drop-icon']);
+ checkArrowDropIcon(container.containerView_.SINK_LIST);
+ checkCurrentView(container.containerView_.SINK_LIST);
+ });
+
+ // Tests the |computeArrowDropIcon_| function.
+ test('compute arrow drop icon', function() {
+ assertEquals('arrow-drop-up',
+ container.computeArrowDropIcon_(
+ container.containerView_.CAST_MODE_LIST));
+ assertEquals('arrow-drop-down',
+ container.computeArrowDropIcon_(
+ container.containerView_.ROUTE_DETAILS));
+ assertEquals('arrow-drop-down',
+ container.computeArrowDropIcon_(
+ container.containerView_.SINK_LIST));
+ });
+
+ // Tests the header text. Choosing a cast mode updates the header text.
+ test('header text', function() {
+ checkElementTextWithId(loadTimeData.getString('selectCastModeHeader'),
+ 'cast-mode-header-text');
+
+ var fakeHeaderText = 'fake header text';
+ container.headerText = fakeHeaderText;
+ checkElementTextWithId(fakeHeaderText, 'sink-list-header-text');
+
+ // Set the cast mode list to update the header text when one is
+ // selected.
+ container.castModeList = fakeCastModeList;
+
+ setTimeout(function() {
+ var castModeList =
+ container.$['cast-mode-list'].querySelectorAll('paper-item');
+
+ for (var i = 0; i < fakeCastModeList.length; i++) {
+ MockInteractions.tap(castModeArray[i]);
+ checkElementTextWithId(fakeCastModeList[i].title,
+ 'sink-list-header-text');
+ checkElementText(fakeCastModeList[i].description, castModeList[i]);
+ }
+ });
+ });
+
+ // Tests that text shown for each sink matches their names.
+ test('sink list text', function() {
+ container.sinkList = fakeSinkList;
+
+ setTimeout(function() {
+ var sinkList =
+ container.$['sink-list'].querySelectorAll('paper-item');
+
+ for (var i = 0; i < fakeSinkList.length; i++) {
+ checkElementText(fakeSinkList[i].name, sinkList[i]);
+ }
+ });
+ });
+
+ // Tests the text shown for the sink list.
+ test('sink list route text', function() {
+ container.sinkList = fakeSinkList;
+ container.routeList = fakeRouteList;
+
+ setTimeout(function() {
+ var routeList =
+ container.$['sink-list'].querySelectorAll('.route');
+
+ checkElementText(fakeRouteList[0].title, routeList[0]);
+ checkElementText(fakeRouteList[1].title, routeList[1]);
+ checkElementText('', routeList[2]);
+
+ container.addRoute(
+ new media_router.Route('id 3', 'sink id 3', 'Title 3', false));
+ checkElementText(container.routeList[2].title, routeList[3]);
+
+ container.addRoute(
+ new media_router.Route('id 4', 'sink id 1', 'Title 4', false));
+ checkElementText(container.routeList[0].title, routeList[0]);
+ });
+ });
+
+ // Tests the visibility of routes in the sink list.
+ test('route visibility', function() {
+ container.sinkList = fakeSinkList;
+ container.routeList = fakeRouteList;
+
+ setTimeout(function() {
+ var routeList =
+ container.$['sink-list'].querySelectorAll('.route');
+
+ checkElementHidden(false, routeList[0]);
+ checkElementHidden(false, routeList[1]);
+ checkElementHidden(true, routeList[2]);
+
+ container.addRoute(
+ new media_router.Route('id 3', 'sink id 3', 'Title 3', false));
+ checkElementHidden(false, routeList[2]);
+ });
+ });
+
+ // Tests for expected visible UI when the view is CAST_MODE_LIST.
+ test('cast mode list state visibility', function() {
+ container.showCastModeList_();
+ checkElementsHiddenWithId(['issue-banner',
Kevin M 2015/07/08 23:02:21 Might it be easier to express visibility checks in
apacible 2015/07/09 00:02:27 Makes sense, done.
+ 'route-details',
+ 'sink-list',
+ 'sink-list-header-text']);
+
+ // Set a non-blocking issue. The issue should stay hidden.
+ container.issue = fakeNonBlockingIssue;
+ checkElementsHiddenWithId(['issue-banner',
+ 'route-details',
+ 'sink-list',
+ 'sink-list-header-text']);
+
+ // Set a blocking issue. The issue should stay hidden.
+ container.issue = fakeBlockingIssue;
+ checkElementsHiddenWithId(['issue-banner',
+ 'route-details',
+ 'sink-list',
+ 'sink-list-header-text']);
+ });
+
+ // Tests for expected visible UI when the view is ROUTE_DETAILS.
+ test('route details state visibility', function() {
+ container.showRouteDetails_();
+ checkElementsHiddenWithId(['cast-mode-header-text',
+ 'cast-mode-list',
+ 'container-header',
+ 'issue-banner',
+ 'sink-list',
+ 'sink-list-header-text']);
+
+ // Set a non-blocking issue. The issue should be shown.
+ container.issue = fakeNonBlockingIssue;
+ checkElementsHiddenWithId(['cast-mode-header-text',
+ 'cast-mode-list',
+ 'container-header',
+ 'sink-list',
+ 'sink-list-header-text']);
+
+ // Set a blocking issue. The issue should be shown, and everything
+ // else, hidden.
+ container.issue = fakeBlockingIssue;
+ checkElementsHiddenWithId(['cast-mode-header-text',
+ 'cast-mode-list',
+ 'container-header',
+ 'route-details',
+ 'sink-list',
+ 'sink-list-header-text']);
+ });
+
+ // Tests for expected visible UI when the view is SINK_LIST.
+ test('sink list state visibility', function() {
+ container.showSinkList_();
+
+ checkElementsHiddenWithId(['cast-mode-header-text',
+ 'cast-mode-list',
+ 'issue-banner',
+ 'route-details']);
+
+ // Set a non-blocking issue. The issue should be shown.
+ container.issue = fakeNonBlockingIssue;
+ checkElementsHiddenWithId(['cast-mode-header-text',
+ 'cast-mode-list',
+ 'route-details']);
+
+ // Set a blocking issue. The issue should be shown, and everything
+ // else, hidden.
+ container.issue = fakeBlockingIssue;
+ checkElementsHiddenWithId(['cast-mode-header-text',
+ 'cast-mode-list',
+ 'container-header',
+ 'route-details',
+ 'sink-list',
+ 'sink-list-header-text']);
+ });
+ });
+ }
+
+ return {
+ registerTests: registerTests,
+ };
+});

Powered by Google App Engine
This is Rietveld 408576698