Chromium Code Reviews| 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. | |
|
stevenjb
2016/08/24 15:45:18
I gues what is not obvious to me is where this tes
michaelpg
2016/08/24 20:46:41
in teardown: "After every test, check that the dia
| |
| 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'); |
|
michaelpg
2016/08/23 23:37:07
hmm oops, i'll revert this
| |
| 106 assertTrue(!!languageDetailPage); | 250 assertTrue(!!languageDetailPage); |
| 107 assertEquals('en-US', languageDetailPage.detail.language.code); | 251 assertEquals('en-US', languageDetailPage.detail.language.code); |
| 108 }); | 252 }); |
| 109 | 253 |
| 110 test('manage input methods', function() { | 254 test('manage input methods', function() { |
| 111 var inputMethodsCollapse = languagesPage.$.inputMethodsCollapse; | 255 var inputMethodsCollapse = languagesPage.$.inputMethodsCollapse; |
| 112 var inputMethodSettingsExist = !!inputMethodsCollapse; | 256 var inputMethodSettingsExist = !!inputMethodsCollapse; |
| 113 if (cr.isChromeOS) { | 257 if (cr.isChromeOS) { |
| 114 assertTrue(inputMethodSettingsExist); | 258 assertTrue(inputMethodSettingsExist); |
| 115 var manageInputMethodsButton = | 259 var manageInputMethodsButton = |
| 116 inputMethodsCollapse.querySelector('.list-button:last-of-type'); | 260 inputMethodsCollapse.querySelector('.list-button:last-of-type'); |
|
michaelpg
2016/08/23 23:37:07
and this
| |
| 117 MockInteractions.tap(manageInputMethodsButton); | 261 MockInteractions.tap(manageInputMethodsButton); |
| 118 assertTrue(!!languagesPage.$$('settings-manage-input-methods-page')); | 262 assertTrue(!!languagesPage.$$('settings-manage-input-methods-page')); |
| 119 } else { | 263 } else { |
| 120 assertFalse(inputMethodSettingsExist); | 264 assertFalse(inputMethodSettingsExist); |
| 121 } | 265 } |
| 122 }); | 266 }); |
| 123 | 267 |
| 124 test('spellcheck', function() { | 268 test('spellcheck', function() { |
| 125 var spellCheckCollapse = languagesPage.$.spellCheckCollapse; | 269 var spellCheckCollapse = languagesPage.$.spellCheckCollapse; |
| 126 var spellCheckSettingsExist = !!spellCheckCollapse; | 270 var spellCheckSettingsExist = !!spellCheckCollapse; |
| 127 if (cr.isMac) { | 271 if (cr.isMac) { |
| 128 assertFalse(spellCheckSettingsExist); | 272 assertFalse(spellCheckSettingsExist); |
| 129 } else { | 273 } else { |
| 130 assertTrue(spellCheckSettingsExist); | 274 assertTrue(spellCheckSettingsExist); |
| 131 MockInteractions.tap( | 275 MockInteractions.tap( |
| 132 spellCheckCollapse.querySelector('.list-button:last-of-type')); | 276 spellCheckCollapse.querySelector('.list-button:last-of-type')); |
| 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 |