OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** @fileoverview Suite of tests for settings-languages-page. */ | 5 /** @fileoverview Suite of tests for settings-languages-page. */ |
6 | 6 |
7 /** @const {string} Path to root from chrome/test/data/webui/settings/. */ | 7 /** @const {string} Path to root from chrome/test/data/webui/settings/. */ |
8 var ROOT_PATH = '../../../../../'; | 8 var ROOT_PATH = '../../../../../'; |
9 | 9 |
10 // Polymer BrowserTest fixture. | 10 // Polymer BrowserTest fixture. |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { | 44 TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
45 suite('languages page', function() { | 45 suite('languages page', function() { |
46 testing.Test.disableAnimationsAndTransitions(); | 46 testing.Test.disableAnimationsAndTransitions(); |
47 | 47 |
48 this.toggleAdvanced(); | 48 this.toggleAdvanced(); |
49 var advanced = this.getPage('advanced'); | 49 var advanced = this.getPage('advanced'); |
50 | 50 |
51 var languagesSection; | 51 var languagesSection; |
52 var languagesPage; | 52 var languagesPage; |
53 var languageHelper; | 53 var languageHelper; |
| 54 |
| 55 /** |
| 56 * @param {numExpected} Expected number of languages to eventually be |
| 57 * enabled. |
| 58 * @return {!Promise} Resolved when the number of enabled languages changes |
| 59 * to match expectations. |
| 60 */ |
| 61 function whenNumEnabledLanguagesBecomes(numExpected) { |
| 62 assert(!!languagesPage); |
| 63 return new Promise(function(resolve, reject) { |
| 64 languagesPage.addEventListener('languages-changed', function changed() { |
| 65 if (languagesPage.languages.enabled.length != numExpected) |
| 66 return; |
| 67 resolve(); |
| 68 languagesPage.removeEventListener('languages-changed', changed); |
| 69 }); |
| 70 }); |
| 71 } |
| 72 |
| 73 // Returns a supported language that is not enabled, for testing. |
| 74 function getAvailableLanguage() { |
| 75 return languagesPage.languages.supported.find(function(language) { |
| 76 return !languageHelper.isLanguageEnabled(language.code); |
| 77 }); |
| 78 } |
| 79 |
54 suiteSetup(function() { | 80 suiteSetup(function() { |
55 advanced.set('pageVisibility.languages', true); | 81 advanced.set('pageVisibility.languages', true); |
56 Polymer.dom.flush(); | 82 Polymer.dom.flush(); |
57 | 83 |
58 languagesSection = this.getSection(advanced, 'languages'); | 84 languagesSection = this.getSection(advanced, 'languages'); |
59 assertTrue(!!languagesSection); | 85 assertTrue(!!languagesSection); |
60 languagesPage = languagesSection.querySelector('settings-languages-page'); | 86 languagesPage = languagesSection.querySelector('settings-languages-page'); |
61 assertTrue(!!languagesPage); | 87 assertTrue(!!languagesPage); |
62 | 88 |
63 languageHelper = languagesPage.languageHelper; | 89 languageHelper = languagesPage.languageHelper; |
64 return languageHelper.whenReady(); | 90 return languageHelper.whenReady(); |
65 }.bind(this)); | 91 }.bind(this)); |
66 | 92 |
67 teardown(function(done) { | 93 teardown(function(done) { |
68 // Close the section if we're in a sub-page. | 94 // Close the section if we're in a sub-page. |
69 if (settings.getCurrentRoute().isSubpage()) { | 95 if (settings.getCurrentRoute().isSubpage()) { |
70 settings.navigateTo(settings.Route.ADVANCED); | 96 settings.navigateTo(settings.Route.BASIC); |
71 setTimeout(done); | 97 setTimeout(done); |
72 } else { | 98 } else { |
73 done(); | 99 done(); |
74 } | 100 } |
75 }); | 101 }); |
76 | 102 |
77 test('manage languages', function() { | 103 suite('add languages dialog', function() { |
78 var manageLanguagesButton = | 104 var dialog; |
79 languagesPage.$.languagesCollapse.querySelector( | 105 var dialogItems; |
80 '.list-button:last-of-type'); | 106 var cancelButton; |
81 MockInteractions.tap(manageLanguagesButton); | 107 var actionButton; |
82 assertTrue(!!languagesPage.$$('settings-manage-languages-page')); | 108 |
| 109 setup(function(done) { |
| 110 var addLanguagesButton = languagesPage.$.languagesCollapse |
| 111 .querySelector('.list-button:last-of-type'); |
| 112 MockInteractions.tap(addLanguagesButton); |
| 113 |
| 114 // The page stamps the dialog and registers listeners asynchronously. |
| 115 Polymer.Base.async(function() { |
| 116 dialog = languagesPage.$$('settings-add-languages-dialog'); |
| 117 assertTrue(!!dialog); |
| 118 |
| 119 actionButton = assert(dialog.$$('.action-button')); |
| 120 cancelButton = assert(dialog.$$('.cancel-button')); |
| 121 |
| 122 // The fixed-height dialog's iron-list should stamp far fewer than |
| 123 // 50 items. |
| 124 dialogItems = |
| 125 dialog.$.dialog.querySelectorAll('.list-item:not([hidden])'); |
| 126 assertGT(dialogItems.length, 1); |
| 127 assertLT(dialogItems.length, 50); |
| 128 |
| 129 // No languages have been checked, so the action button is disabled. |
| 130 assertTrue(actionButton.disabled); |
| 131 assertFalse(cancelButton.disabled); |
| 132 |
| 133 done(); |
| 134 }); |
| 135 }); |
| 136 |
| 137 // After every test, check that the dialog is removed from the DOM. |
| 138 teardown(function() { |
| 139 Polymer.dom.flush(); |
| 140 assertEquals(null, languagesPage.$$('settings-add-languages-dialog')); |
| 141 }); |
| 142 |
| 143 test('cancel', function() { |
| 144 // Canceling the dialog should close and remove it. |
| 145 MockInteractions.tap(cancelButton); |
| 146 }); |
| 147 |
| 148 test('add languages and cancel', function(done) { |
| 149 var numEnabled = languagesPage.languages.enabled.length; |
| 150 |
| 151 // Check some languages. |
| 152 MockInteractions.tap(dialogItems[0]); |
| 153 MockInteractions.tap(dialogItems[1]); |
| 154 |
| 155 // Canceling the dialog should close and remove it without enabling |
| 156 // the checked languages. A small timeout lets us check this. |
| 157 MockInteractions.tap(cancelButton); |
| 158 setTimeout(function() { |
| 159 // Number of enabled languages should be the same. |
| 160 assertEquals(numEnabled, languagesPage.languages.enabled.length); |
| 161 done(); |
| 162 }, 100); |
| 163 }); |
| 164 |
| 165 test('add languages and confirm', function() { |
| 166 var numEnabled = languagesPage.languages.enabled.length; |
| 167 |
| 168 // No languages have been checked, so the action button is inert. |
| 169 MockInteractions.tap(actionButton); |
| 170 Polymer.dom.flush(); |
| 171 assertEquals(dialog, languagesPage.$$('settings-add-languages-dialog')); |
| 172 |
| 173 // Check and uncheck one language. |
| 174 MockInteractions.tap(dialogItems[0]); |
| 175 assertFalse(actionButton.disabled); |
| 176 MockInteractions.tap(dialogItems[0]); |
| 177 assertTrue(actionButton.disabled); |
| 178 |
| 179 // Check multiple languages. |
| 180 MockInteractions.tap(dialogItems[0]); |
| 181 MockInteractions.tap(dialogItems[1]); |
| 182 assertFalse(actionButton.disabled); |
| 183 |
| 184 // The action button should close and remove the dialog, enabling the |
| 185 // checked languages. |
| 186 MockInteractions.tap(actionButton); |
| 187 |
| 188 // Wait for the languages to be enabled by the browser. |
| 189 return whenNumEnabledLanguagesBecomes(numEnabled + 2); |
| 190 }); |
83 }); | 191 }); |
84 | 192 |
85 test('Should not set UI language', function() { | 193 test('Should not set UI language', function() { |
86 var languagesCollapse = languagesPage.$.languagesCollapse; | 194 var languagesCollapse = languagesPage.$.languagesCollapse; |
87 var languageOptionsDropdownTrigger = languagesCollapse.querySelector( | 195 var languageOptionsDropdownTrigger = languagesCollapse.querySelector( |
88 'paper-icon-button'); | 196 'paper-icon-button'); |
89 assertTrue(!!languageOptionsDropdownTrigger); | 197 assertTrue(!!languageOptionsDropdownTrigger); |
90 | 198 |
91 // This shouldn't get called. | 199 // This shouldn't get called. |
92 languageHelper.setUILanguage = assertNotReached; | 200 languageHelper.setUILanguage = assertNotReached; |
93 | 201 |
94 MockInteractions.tap(languageOptionsDropdownTrigger); | 202 MockInteractions.tap(languageOptionsDropdownTrigger); |
95 }); | 203 }); |
96 | 204 |
| 205 test('remove language', function() { |
| 206 var numEnabled = languagesPage.languages.enabled.length; |
| 207 |
| 208 // Enabled a language which we can then disable. |
| 209 var newLanguage = getAvailableLanguage(); |
| 210 languageHelper.enableLanguage(newLanguage.code); |
| 211 |
| 212 // Wait for the language to be enabled. |
| 213 return whenNumEnabledLanguagesBecomes(numEnabled + 1).then(function() { |
| 214 // Populate the dom-repeat. |
| 215 Polymer.dom.flush(); |
| 216 |
| 217 // Find the new language item. |
| 218 var languagesCollapse = languagesPage.$.languagesCollapse; |
| 219 var items = languagesCollapse.querySelectorAll('.list-item'); |
| 220 var domRepeat = assert( |
| 221 languagesCollapse.querySelector('template[is="dom-repeat"]')); |
| 222 var item = Array.from(items).find(function(el) { |
| 223 return domRepeat.itemForElement(el) && |
| 224 domRepeat.itemForElement(el).language == newLanguage; |
| 225 }); |
| 226 |
| 227 // Open the menu and select Remove. |
| 228 MockInteractions.tap(item.querySelector('paper-icon-button')); |
| 229 var removeMenuItem = assert(item.querySelector( |
| 230 '.dropdown-content .dropdown-item:last-of-type')); |
| 231 assertFalse(removeMenuItem.disabled); |
| 232 MockInteractions.tap(removeMenuItem); |
| 233 |
| 234 // We should go back down to the original number of enabled languages. |
| 235 return whenNumEnabledLanguagesBecomes(numEnabled).then(function() { |
| 236 assertFalse(languageHelper.isLanguageEnabled(newLanguage.code)); |
| 237 }); |
| 238 }); |
| 239 }); |
| 240 |
97 test('language detail', function() { | 241 test('language detail', function() { |
98 var languagesCollapse = languagesPage.$.languagesCollapse; | 242 var languagesCollapse = languagesPage.$.languagesCollapse; |
99 var languageDetailMenuItem = languagesCollapse.querySelectorAll( | 243 var languageDetailMenuItem = languagesCollapse.querySelectorAll( |
100 '.dropdown-content .dropdown-item')[2]; | 244 '.dropdown-content .dropdown-item')[2]; |
101 assertTrue(!!languageDetailMenuItem); | 245 assertTrue(!!languageDetailMenuItem); |
102 MockInteractions.tap(languageDetailMenuItem); | 246 MockInteractions.tap(languageDetailMenuItem); |
103 | 247 |
104 var languageDetailPage = | 248 var languageDetailPage = |
105 languagesPage.$$('settings-language-detail-page'); | 249 languagesPage.$$('settings-language-detail-page'); |
106 assertTrue(!!languageDetailPage); | 250 assertTrue(!!languageDetailPage); |
(...skipping 26 matching lines...) Expand all Loading... |
133 assertTrue(!!languagesPage.$$('settings-edit-dictionary-page')); | 277 assertTrue(!!languagesPage.$$('settings-edit-dictionary-page')); |
134 } | 278 } |
135 }); | 279 }); |
136 }.bind(this)); | 280 }.bind(this)); |
137 | 281 |
138 // TODO(michaelpg): Test more aspects of the languages UI. | 282 // TODO(michaelpg): Test more aspects of the languages UI. |
139 | 283 |
140 // Run all registered tests. | 284 // Run all registered tests. |
141 mocha.run(); | 285 mocha.run(); |
142 }); | 286 }); |
OLD | NEW |