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 |