blob: b3ce3b4ccf4459dd75475e62971e7d446a7b6072 [file] [log] [blame]
Wyatt Allen60ea95f2016-06-03 09:35:07 -07001<!DOCTYPE html>
2<!--
3Copyright (C) 2016 The Android Open Source Project
4
5Licensed under the Apache License, Version 2.0 (the "License");
6you may not use this file except in compliance with the License.
7You may obtain a copy of the License at
8
9http://www.apache.org/licenses/LICENSE-2.0
10
11Unless required by applicable law or agreed to in writing, software
12distributed under the License is distributed on an "AS IS" BASIS,
13WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14See the License for the specific language governing permissions and
15limitations under the License.
16-->
17
18<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
19<title>gr-settings-view</title>
20
21<script src="../../../bower_components/webcomponentsjs/webcomponents.min.js"></script>
22<script src="../../../bower_components/web-component-tester/browser.js"></script>
23
24<link rel="import" href="../../../bower_components/iron-test-helpers/iron-test-helpers.html">
25<link rel="import" href="gr-settings-view.html">
26
27<test-fixture id="basic">
28 <template>
29 <gr-settings-view></gr-settings-view>
30 </template>
31</test-fixture>
32
Wyatt Allen2dc5c362016-06-13 21:05:45 -070033<test-fixture id="blank">
34 <template>
35 <div></div>
36 </template>
37</test-fixture>
38
Wyatt Allen60ea95f2016-06-03 09:35:07 -070039<script>
40 suite('gr-settings-view tests', function() {
41 var element;
42 var account;
43 var preferences;
Wyatt Allen649fa8a2016-06-13 21:31:26 -070044 var diffPreferences;
Wyatt Allen767b7602016-06-15 16:51:20 -070045 var config;
Viktar Donich14ef76a2016-12-22 12:51:17 -080046 var sandbox;
Wyatt Allen60ea95f2016-06-03 09:35:07 -070047
Wyatt Allend14895b2016-06-06 12:37:24 -070048 function valueOf(title, fieldsetid) {
49 var sections = element.$[fieldsetid].querySelectorAll('section');
50 var titleEl;
51 for (var i = 0; i < sections.length; i++) {
52 titleEl = sections[i].querySelector('.title');
53 if (titleEl.textContent === title) {
54 return sections[i].querySelector('.value');
55 }
56 }
57 }
58
59 // Because deepEqual isn't behaving in Safari.
60 function assertMenusEqual(actual, expected) {
61 assert.equal(actual.length, expected.length);
62 for (var i = 0; i < actual.length; i++) {
63 assert.equal(actual[i].name, expected[i].name);
64 assert.equal(actual[i].url, expected[i].url);
65 }
66 }
67
Wyatt Allencf028422016-06-14 17:44:30 -070068 function stubAddAccountEmail(statusCode) {
Viktar Donich14ef76a2016-12-22 12:51:17 -080069 return sandbox.stub(element.$.restAPI, 'addAccountEmail',
Urs Wolfer33df0052016-07-13 21:06:03 +020070 function() { return Promise.resolve({status: statusCode}); });
Wyatt Allencf028422016-06-14 17:44:30 -070071 }
72
Wyatt Allen60ea95f2016-06-03 09:35:07 -070073 setup(function(done) {
Viktar Donich14ef76a2016-12-22 12:51:17 -080074 sandbox = sinon.sandbox.create();
Wyatt Allen60ea95f2016-06-03 09:35:07 -070075 account = {
76 _account_id: 123,
77 name: 'user name',
78 email: 'user@email',
79 username: 'user username',
80 registered: '2000-01-01 00:00:00.000000000',
81 };
Wyatt Allend14895b2016-06-06 12:37:24 -070082 preferences = {
83 changes_per_page: 25,
84 date_format: 'UK',
85 time_format: 'HHMM_12',
86 diff_view: 'UNIFIED_DIFF',
87 email_strategy: 'ENABLED',
Patrick Hiesel006578f2017-02-27 16:26:33 +010088 email_format: 'HTML_PLAINTEXT',
Wyatt Allend14895b2016-06-06 12:37:24 -070089
90 my: [
91 {url: '/first/url', name: 'first name', target: '_blank'},
92 {url: '/second/url', name: 'second name', target: '_blank'},
93 ],
Becky Siegel1a44b342016-11-14 08:37:06 -080094 change_table: [],
Wyatt Allend14895b2016-06-06 12:37:24 -070095 };
Wyatt Allen649fa8a2016-06-13 21:31:26 -070096 diffPreferences = {
97 context: 10,
98 tab_size: 8,
Becky Siegeld7dbed62016-10-12 10:55:26 -070099 font_size: 12,
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700100 line_length: 100,
101 cursor_blink_rate: 0,
Becky Siegele7d19a92016-10-31 14:35:35 -0700102 line_wrapping: false,
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700103 intraline_difference: true,
104 show_line_endings: true,
105 show_tabs: true,
106 show_whitespace_errors: true,
107 syntax_highlighting: true,
108 auto_hide_diff_table_header: true,
109 theme: 'DEFAULT',
110 ignore_whitespace: 'IGNORE_NONE'
111 };
Urs Wolfer33df0052016-07-13 21:06:03 +0200112 config = {auth: {editable_account_fields: []}};
Wyatt Allen60ea95f2016-06-03 09:35:07 -0700113
114 stub('gr-rest-api-interface', {
115 getLoggedIn: function() { return Promise.resolve(true); },
116 getAccount: function() { return Promise.resolve(account); },
117 getPreferences: function() { return Promise.resolve(preferences); },
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700118 getDiffPreferences: function() {
119 return Promise.resolve(diffPreferences);
120 },
Wyatt Allenbd472172016-06-09 17:44:51 -0700121 getWatchedProjects: function() {
Urs Wolfer33df0052016-07-13 21:06:03 +0200122 return Promise.resolve([]);
Wyatt Allenbd472172016-06-09 17:44:51 -0700123 },
Wyatt Allen767b7602016-06-15 16:51:20 -0700124 getAccountEmails: function() { return Promise.resolve(); },
125 getConfig: function() { return Promise.resolve(config); },
Wyatt Allen64056502016-06-16 14:53:01 -0700126 getAccountGroups: function() { return Promise.resolve([]); },
Wyatt Allen60ea95f2016-06-03 09:35:07 -0700127 });
128 element = fixture('basic');
129
130 // Allow the element to render.
Wyatt Allenafdd9e52016-06-17 15:46:38 -0700131 element._loadingPromise.then(done);
Wyatt Allen60ea95f2016-06-03 09:35:07 -0700132 });
133
Viktar Donich14ef76a2016-12-22 12:51:17 -0800134 teardown(function() {
135 sandbox.restore();
136 });
137
Wyatt Allen2dc5c362016-06-13 21:05:45 -0700138 test('calls the title-change event', function() {
Viktar Donich14ef76a2016-12-22 12:51:17 -0800139 var titleChangedStub = sandbox.stub();
Wyatt Allen2dc5c362016-06-13 21:05:45 -0700140
141 // Create a new view.
142 var newElement = document.createElement('gr-settings-view');
143 newElement.addEventListener('title-change', titleChangedStub);
144
145 // Attach it to the fixture.
146 var blank = fixture('blank');
147 blank.appendChild(newElement);
148
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700149 Polymer.dom.flush();
150
Wyatt Allen2dc5c362016-06-13 21:05:45 -0700151 assert.isTrue(titleChangedStub.called);
152 assert.equal(titleChangedStub.getCall(0).args[0].detail.title,
153 'Settings');
154 });
155
Wyatt Allend14895b2016-06-06 12:37:24 -0700156 test('user preferences', function(done) {
157 // Rendered with the expected preferences selected.
Becky Siegel07c8a162017-03-13 14:23:48 -0700158 assert.equal(valueOf('Changes per page', 'preferences')
Wyatt Allenbd472172016-06-09 17:44:51 -0700159 .firstElementChild.bindValue, preferences.changes_per_page);
Becky Siegel07c8a162017-03-13 14:23:48 -0700160 assert.equal(valueOf('Date/time format', 'preferences')
Wyatt Allenbd472172016-06-09 17:44:51 -0700161 .firstElementChild.bindValue, preferences.date_format);
Becky Siegel07c8a162017-03-13 14:23:48 -0700162 assert.equal(valueOf('Date/time format', 'preferences')
Wyatt Allenbd472172016-06-09 17:44:51 -0700163 .lastElementChild.bindValue, preferences.time_format);
Becky Siegel07c8a162017-03-13 14:23:48 -0700164 assert.equal(valueOf('Email notifications', 'preferences')
Wyatt Allenbd472172016-06-09 17:44:51 -0700165 .firstElementChild.bindValue, preferences.email_strategy);
Becky Siegel07c8a162017-03-13 14:23:48 -0700166 assert.equal(valueOf('Email format', 'preferences')
Patrick Hiesel006578f2017-02-27 16:26:33 +0100167 .firstElementChild.bindValue, preferences.email_format);
Becky Siegel07c8a162017-03-13 14:23:48 -0700168 assert.equal(valueOf('Diff view', 'preferences')
Wyatt Allenbd472172016-06-09 17:44:51 -0700169 .firstElementChild.bindValue, preferences.diff_view);
Becky Siegel07c8a162017-03-13 14:23:48 -0700170 assert.equal(valueOf('Expand inline diffs', 'preferences')
Becky Siegel0c1cbbf2016-12-16 12:59:26 -0800171 .firstElementChild.checked, false);
Wyatt Allend14895b2016-06-06 12:37:24 -0700172
173 assert.isFalse(element._prefsChanged);
174 assert.isFalse(element._menuChanged);
175
176 // Change the diff view element.
Becky Siegel07c8a162017-03-13 14:23:48 -0700177 var diffSelect = valueOf('Diff view', 'preferences').firstElementChild;
Wyatt Allenbd472172016-06-09 17:44:51 -0700178 diffSelect.bindValue = 'SIDE_BY_SIDE';
Becky Siegel0c1cbbf2016-12-16 12:59:26 -0800179
180 var expandInlineDiffs =
Becky Siegel07c8a162017-03-13 14:23:48 -0700181 valueOf('Expand inline diffs', 'preferences').firstElementChild;
Wyatt Allend14895b2016-06-06 12:37:24 -0700182 diffSelect.fire('change');
183
Becky Siegel0c1cbbf2016-12-16 12:59:26 -0800184 MockInteractions.tap(expandInlineDiffs);
185
Wyatt Allend14895b2016-06-06 12:37:24 -0700186 assert.isTrue(element._prefsChanged);
187 assert.isFalse(element._menuChanged);
188
189 stub('gr-rest-api-interface', {
190 savePreferences: function(prefs) {
191 assert.equal(prefs.diff_view, 'SIDE_BY_SIDE');
192 assertMenusEqual(prefs.my, preferences.my);
Becky Siegel0c1cbbf2016-12-16 12:59:26 -0800193 assert.equal(prefs.expand_inline_diffs, true);
Wyatt Allend14895b2016-06-06 12:37:24 -0700194 return Promise.resolve();
195 }
196 });
197
198 // Save the change.
199 element._handleSavePreferences().then(function() {
200 assert.isFalse(element._prefsChanged);
201 assert.isFalse(element._menuChanged);
202 done();
203 });
204 });
205
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700206 test('diff preferences', function(done) {
207 // Rendered with the expected preferences selected.
208 assert.equal(valueOf('Context', 'diffPreferences')
209 .firstElementChild.bindValue, diffPreferences.context);
Becky Siegel07c8a162017-03-13 14:23:48 -0700210 assert.equal(valueOf('Diff width', 'diffPreferences')
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700211 .firstElementChild.bindValue, diffPreferences.line_length);
Becky Siegel07c8a162017-03-13 14:23:48 -0700212 assert.equal(valueOf('Tab width', 'diffPreferences')
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700213 .firstElementChild.bindValue, diffPreferences.tab_size);
Becky Siegel07c8a162017-03-13 14:23:48 -0700214 assert.equal(valueOf('Font size', 'diffPreferences')
Becky Siegeld7dbed62016-10-12 10:55:26 -0700215 .firstElementChild.bindValue, diffPreferences.font_size);
Becky Siegel07c8a162017-03-13 14:23:48 -0700216 assert.equal(valueOf('Show tabs', 'diffPreferences')
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700217 .firstElementChild.checked, diffPreferences.show_tabs);
Becky Siegel07c8a162017-03-13 14:23:48 -0700218 assert.equal(valueOf('Show trailing whitespace', 'diffPreferences')
Wyatt Allend9705002016-11-17 12:03:51 -0800219 .firstElementChild.checked, diffPreferences.show_whitespace_errors);
Becky Siegel07c8a162017-03-13 14:23:48 -0700220 assert.equal(valueOf('Fit to screen', 'diffPreferences')
Becky Siegele7d19a92016-10-31 14:35:35 -0700221 .firstElementChild.checked, diffPreferences.line_wrapping);
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700222
223 assert.isFalse(element._diffPrefsChanged);
224
Becky Siegel07c8a162017-03-13 14:23:48 -0700225 var showTabsCheckbox = valueOf('Show tabs', 'diffPreferences')
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700226 .firstElementChild;
227 showTabsCheckbox.checked = false;
228 element._handleShowTabsChanged();
229
230 assert.isTrue(element._diffPrefsChanged);
231
232 stub('gr-rest-api-interface', {
233 saveDiffPreferences: function(prefs) {
234 assert.equal(prefs.show_tabs, false);
235 return Promise.resolve();
236 }
237 });
238
239 // Save the change.
240 element._handleSaveDiffPreferences().then(function() {
241 assert.isFalse(element._diffPrefsChanged);
242 done();
243 });
244 });
245
Becky Siegele7d19a92016-10-31 14:35:35 -0700246 test('columns input is hidden with fit to scsreen is selected', function() {
247 assert.isFalse(element.$.columnsPref.hidden);
248
249 MockInteractions.tap(element.$.lineWrapping);
250 assert.isTrue(element.$.columnsPref.hidden);
251
252 MockInteractions.tap(element.$.lineWrapping);
253 assert.isFalse(element.$.columnsPref.hidden);
254 });
255
Wyatt Allend14895b2016-06-06 12:37:24 -0700256 test('menu', function(done) {
257 assert.isFalse(element._menuChanged);
258 assert.isFalse(element._prefsChanged);
259
260 assertMenusEqual(element._localMenu, preferences.my);
261
262 var menu = element.$.menu.firstElementChild;
263 var tableRows = Polymer.dom(menu.root).querySelectorAll('tbody tr');
264 assert.equal(tableRows.length, preferences.my.length);
265
266 // Add a menu item:
267 element.splice('_localMenu', 1, 0, {name: 'foo', url: 'bar', target: ''});
268 Polymer.dom.flush();
269
270 tableRows = Polymer.dom(menu.root).querySelectorAll('tbody tr');
271 assert.equal(tableRows.length, preferences.my.length + 1);
272
273 assert.isTrue(element._menuChanged);
274 assert.isFalse(element._prefsChanged);
275
276 stub('gr-rest-api-interface', {
277 savePreferences: function(prefs) {
278 assertMenusEqual(prefs.my, element._localMenu);
279 return Promise.resolve();
280 }
281 });
282
283 element._handleSaveMenu().then(function() {
284 assert.isFalse(element._menuChanged);
285 assert.isFalse(element._prefsChanged);
286 assertMenusEqual(element.prefs.my, element._localMenu);
287 done();
288 });
289 });
Wyatt Allencf028422016-06-14 17:44:30 -0700290
291 test('add email validation', function() {
292 assert.isFalse(element._isNewEmailValid('invalid email'));
293 assert.isTrue(element._isNewEmailValid('vaguely@valid.email'));
294
295 assert.isFalse(
296 element._computeAddEmailButtonEnabled('invalid email'), true);
297 assert.isFalse(
298 element._computeAddEmailButtonEnabled('vaguely@valid.email', true));
299 assert.isTrue(
300 element._computeAddEmailButtonEnabled('vaguely@valid.email', false));
301 });
302
303 test('add email does not save invalid', function() {
304 var addEmailStub = stubAddAccountEmail(201);
305
306 assert.isFalse(element._addingEmail);
307 assert.isNotOk(element._lastSentVerificationEmail);
308 element._newEmail = 'invalid email';
309
310 element._handleAddEmailButton();
311
312 assert.isFalse(element._addingEmail);
313 assert.isFalse(addEmailStub.called);
314 assert.isNotOk(element._lastSentVerificationEmail);
315
316 assert.isFalse(addEmailStub.called);
317 });
318
319 test('add email does save valid', function(done) {
320 var addEmailStub = stubAddAccountEmail(201);
321
322 assert.isFalse(element._addingEmail);
323 assert.isNotOk(element._lastSentVerificationEmail);
324 element._newEmail = 'valid@email.com';
325
326 element._handleAddEmailButton();
327
328 assert.isTrue(element._addingEmail);
329 assert.isTrue(addEmailStub.called);
330
331 assert.isTrue(addEmailStub.called);
332 addEmailStub.lastCall.returnValue.then(function() {
333 assert.isOk(element._lastSentVerificationEmail);
334 done();
335 });
336 });
337
338 test('add email does not set last-email if error', function(done) {
339 var addEmailStub = stubAddAccountEmail(500);
340
341 assert.isNotOk(element._lastSentVerificationEmail);
342 element._newEmail = 'valid@email.com';
343
344 element._handleAddEmailButton();
345
346 assert.isTrue(addEmailStub.called);
347 addEmailStub.lastCall.returnValue.then(function() {
348 assert.isNotOk(element._lastSentVerificationEmail);
349 done();
350 });
351 });
Viktar Donich14ef76a2016-12-22 12:51:17 -0800352
353 test('emails are loaded without emailToken', function() {
354 sandbox.stub(element.$.emailEditor, 'loadData');
355 element.params = {};
356 element.attached();
357 assert.isTrue(element.$.emailEditor.loadData.calledOnce);
358 });
359
360 suite('when email verification token is provided', function() {
361 var resolveConfirm;
362
363 setup(function() {
364 sandbox.stub(element.$.emailEditor, 'loadData');
365 sandbox.stub(element.$.restAPI, 'confirmEmail', function() {
366 return new Promise(function(resolve) { resolveConfirm = resolve; });
367 });
368 element.params = {emailToken: 'foo'};
369 element.attached();
370 });
371
372 test('it is used to confirm email via rest API', function() {
373 assert.isTrue(element.$.restAPI.confirmEmail.calledOnce);
374 assert.isTrue(element.$.restAPI.confirmEmail.calledWith('foo'));
375 });
376
377 test('emails are not loaded initially', function() {
378 assert.isFalse(element.$.emailEditor.loadData.called);
379 });
380
381 test('user emails are loaded after email confirmed', function(done) {
382 element._loadingPromise.then(function() {
383 assert.isTrue(element.$.emailEditor.loadData.calledOnce);
384 done();
385 });
386 resolveConfirm();
387 });
388
389 test('show-alert is fired when email is confirmed', function(done) {
390 sandbox.spy(element, 'fire');
391 element._loadingPromise.then(function() {
Becky Siegele6bb34f2017-01-04 13:38:54 -0800392 assert.isTrue(
393 element.fire.calledWith('show-alert', {message: 'bar'}));
Viktar Donich14ef76a2016-12-22 12:51:17 -0800394 done();
395 });
396 resolveConfirm('bar');
397 });
398
399 });
Wyatt Allen60ea95f2016-06-03 09:35:07 -0700400 });
401</script>