blob: cb471d4393764f33c57279e023ee001353ea5604 [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
Viktar Donich29e1ce52017-03-28 17:02:44 -070021<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
Wyatt Allen60ea95f2016-06-03 09:35:07 -070022<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
Viktar Donich29e1ce52017-03-28 17:02:44 -070027<script>void(0);</script>
28
Wyatt Allen60ea95f2016-06-03 09:35:07 -070029<test-fixture id="basic">
30 <template>
31 <gr-settings-view></gr-settings-view>
32 </template>
33</test-fixture>
34
Wyatt Allen2dc5c362016-06-13 21:05:45 -070035<test-fixture id="blank">
36 <template>
37 <div></div>
38 </template>
39</test-fixture>
40
Wyatt Allen60ea95f2016-06-03 09:35:07 -070041<script>
42 suite('gr-settings-view tests', function() {
43 var element;
44 var account;
45 var preferences;
Wyatt Allen649fa8a2016-06-13 21:31:26 -070046 var diffPreferences;
Wyatt Allen767b7602016-06-15 16:51:20 -070047 var config;
Viktar Donich14ef76a2016-12-22 12:51:17 -080048 var sandbox;
Wyatt Allen60ea95f2016-06-03 09:35:07 -070049
Wyatt Allend14895b2016-06-06 12:37:24 -070050 function valueOf(title, fieldsetid) {
51 var sections = element.$[fieldsetid].querySelectorAll('section');
52 var titleEl;
53 for (var i = 0; i < sections.length; i++) {
54 titleEl = sections[i].querySelector('.title');
55 if (titleEl.textContent === title) {
56 return sections[i].querySelector('.value');
57 }
58 }
59 }
60
61 // Because deepEqual isn't behaving in Safari.
62 function assertMenusEqual(actual, expected) {
63 assert.equal(actual.length, expected.length);
64 for (var i = 0; i < actual.length; i++) {
65 assert.equal(actual[i].name, expected[i].name);
66 assert.equal(actual[i].url, expected[i].url);
67 }
68 }
69
Wyatt Allencf028422016-06-14 17:44:30 -070070 function stubAddAccountEmail(statusCode) {
Viktar Donich14ef76a2016-12-22 12:51:17 -080071 return sandbox.stub(element.$.restAPI, 'addAccountEmail',
Urs Wolfer33df0052016-07-13 21:06:03 +020072 function() { return Promise.resolve({status: statusCode}); });
Wyatt Allencf028422016-06-14 17:44:30 -070073 }
74
Wyatt Allen60ea95f2016-06-03 09:35:07 -070075 setup(function(done) {
Viktar Donich14ef76a2016-12-22 12:51:17 -080076 sandbox = sinon.sandbox.create();
Wyatt Allen60ea95f2016-06-03 09:35:07 -070077 account = {
78 _account_id: 123,
79 name: 'user name',
80 email: 'user@email',
81 username: 'user username',
82 registered: '2000-01-01 00:00:00.000000000',
83 };
Wyatt Allend14895b2016-06-06 12:37:24 -070084 preferences = {
85 changes_per_page: 25,
86 date_format: 'UK',
87 time_format: 'HHMM_12',
88 diff_view: 'UNIFIED_DIFF',
89 email_strategy: 'ENABLED',
Patrick Hiesel006578f2017-02-27 16:26:33 +010090 email_format: 'HTML_PLAINTEXT',
Wyatt Allend14895b2016-06-06 12:37:24 -070091
92 my: [
93 {url: '/first/url', name: 'first name', target: '_blank'},
94 {url: '/second/url', name: 'second name', target: '_blank'},
95 ],
Becky Siegel1a44b342016-11-14 08:37:06 -080096 change_table: [],
Wyatt Allend14895b2016-06-06 12:37:24 -070097 };
Wyatt Allen649fa8a2016-06-13 21:31:26 -070098 diffPreferences = {
99 context: 10,
100 tab_size: 8,
Becky Siegeld7dbed62016-10-12 10:55:26 -0700101 font_size: 12,
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700102 line_length: 100,
103 cursor_blink_rate: 0,
Becky Siegele7d19a92016-10-31 14:35:35 -0700104 line_wrapping: false,
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700105 intraline_difference: true,
106 show_line_endings: true,
107 show_tabs: true,
108 show_whitespace_errors: true,
109 syntax_highlighting: true,
110 auto_hide_diff_table_header: true,
111 theme: 'DEFAULT',
112 ignore_whitespace: 'IGNORE_NONE'
113 };
Urs Wolfer33df0052016-07-13 21:06:03 +0200114 config = {auth: {editable_account_fields: []}};
Wyatt Allen60ea95f2016-06-03 09:35:07 -0700115
116 stub('gr-rest-api-interface', {
117 getLoggedIn: function() { return Promise.resolve(true); },
118 getAccount: function() { return Promise.resolve(account); },
119 getPreferences: function() { return Promise.resolve(preferences); },
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700120 getDiffPreferences: function() {
121 return Promise.resolve(diffPreferences);
122 },
Wyatt Allenbd472172016-06-09 17:44:51 -0700123 getWatchedProjects: function() {
Urs Wolfer33df0052016-07-13 21:06:03 +0200124 return Promise.resolve([]);
Wyatt Allenbd472172016-06-09 17:44:51 -0700125 },
Wyatt Allen767b7602016-06-15 16:51:20 -0700126 getAccountEmails: function() { return Promise.resolve(); },
127 getConfig: function() { return Promise.resolve(config); },
Wyatt Allen64056502016-06-16 14:53:01 -0700128 getAccountGroups: function() { return Promise.resolve([]); },
Wyatt Allen60ea95f2016-06-03 09:35:07 -0700129 });
130 element = fixture('basic');
131
132 // Allow the element to render.
Wyatt Allenafdd9e52016-06-17 15:46:38 -0700133 element._loadingPromise.then(done);
Wyatt Allen60ea95f2016-06-03 09:35:07 -0700134 });
135
Viktar Donich14ef76a2016-12-22 12:51:17 -0800136 teardown(function() {
137 sandbox.restore();
138 });
139
Wyatt Allen2dc5c362016-06-13 21:05:45 -0700140 test('calls the title-change event', function() {
Viktar Donich14ef76a2016-12-22 12:51:17 -0800141 var titleChangedStub = sandbox.stub();
Wyatt Allen2dc5c362016-06-13 21:05:45 -0700142
143 // Create a new view.
144 var newElement = document.createElement('gr-settings-view');
145 newElement.addEventListener('title-change', titleChangedStub);
146
147 // Attach it to the fixture.
148 var blank = fixture('blank');
149 blank.appendChild(newElement);
150
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700151 Polymer.dom.flush();
152
Wyatt Allen2dc5c362016-06-13 21:05:45 -0700153 assert.isTrue(titleChangedStub.called);
154 assert.equal(titleChangedStub.getCall(0).args[0].detail.title,
155 'Settings');
156 });
157
Wyatt Allend14895b2016-06-06 12:37:24 -0700158 test('user preferences', function(done) {
159 // Rendered with the expected preferences selected.
Becky Siegel07c8a162017-03-13 14:23:48 -0700160 assert.equal(valueOf('Changes per page', 'preferences')
Wyatt Allenbd472172016-06-09 17:44:51 -0700161 .firstElementChild.bindValue, preferences.changes_per_page);
Becky Siegel07c8a162017-03-13 14:23:48 -0700162 assert.equal(valueOf('Date/time format', 'preferences')
Wyatt Allenbd472172016-06-09 17:44:51 -0700163 .firstElementChild.bindValue, preferences.date_format);
Becky Siegel07c8a162017-03-13 14:23:48 -0700164 assert.equal(valueOf('Date/time format', 'preferences')
Wyatt Allenbd472172016-06-09 17:44:51 -0700165 .lastElementChild.bindValue, preferences.time_format);
Becky Siegel07c8a162017-03-13 14:23:48 -0700166 assert.equal(valueOf('Email notifications', 'preferences')
Wyatt Allenbd472172016-06-09 17:44:51 -0700167 .firstElementChild.bindValue, preferences.email_strategy);
Becky Siegel07c8a162017-03-13 14:23:48 -0700168 assert.equal(valueOf('Email format', 'preferences')
Patrick Hiesel006578f2017-02-27 16:26:33 +0100169 .firstElementChild.bindValue, preferences.email_format);
Becky Siegel07c8a162017-03-13 14:23:48 -0700170 assert.equal(valueOf('Diff view', 'preferences')
Wyatt Allenbd472172016-06-09 17:44:51 -0700171 .firstElementChild.bindValue, preferences.diff_view);
Becky Siegel07c8a162017-03-13 14:23:48 -0700172 assert.equal(valueOf('Expand inline diffs', 'preferences')
Becky Siegel0c1cbbf2016-12-16 12:59:26 -0800173 .firstElementChild.checked, false);
Wyatt Allend14895b2016-06-06 12:37:24 -0700174
175 assert.isFalse(element._prefsChanged);
176 assert.isFalse(element._menuChanged);
177
178 // Change the diff view element.
Becky Siegel07c8a162017-03-13 14:23:48 -0700179 var diffSelect = valueOf('Diff view', 'preferences').firstElementChild;
Wyatt Allenbd472172016-06-09 17:44:51 -0700180 diffSelect.bindValue = 'SIDE_BY_SIDE';
Becky Siegel0c1cbbf2016-12-16 12:59:26 -0800181
182 var expandInlineDiffs =
Becky Siegel07c8a162017-03-13 14:23:48 -0700183 valueOf('Expand inline diffs', 'preferences').firstElementChild;
Wyatt Allend14895b2016-06-06 12:37:24 -0700184 diffSelect.fire('change');
185
Becky Siegel0c1cbbf2016-12-16 12:59:26 -0800186 MockInteractions.tap(expandInlineDiffs);
187
Wyatt Allend14895b2016-06-06 12:37:24 -0700188 assert.isTrue(element._prefsChanged);
189 assert.isFalse(element._menuChanged);
190
191 stub('gr-rest-api-interface', {
192 savePreferences: function(prefs) {
193 assert.equal(prefs.diff_view, 'SIDE_BY_SIDE');
194 assertMenusEqual(prefs.my, preferences.my);
Becky Siegel0c1cbbf2016-12-16 12:59:26 -0800195 assert.equal(prefs.expand_inline_diffs, true);
Wyatt Allend14895b2016-06-06 12:37:24 -0700196 return Promise.resolve();
197 }
198 });
199
200 // Save the change.
201 element._handleSavePreferences().then(function() {
202 assert.isFalse(element._prefsChanged);
203 assert.isFalse(element._menuChanged);
204 done();
205 });
206 });
207
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700208 test('diff preferences', function(done) {
209 // Rendered with the expected preferences selected.
210 assert.equal(valueOf('Context', 'diffPreferences')
211 .firstElementChild.bindValue, diffPreferences.context);
Becky Siegel07c8a162017-03-13 14:23:48 -0700212 assert.equal(valueOf('Diff width', 'diffPreferences')
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700213 .firstElementChild.bindValue, diffPreferences.line_length);
Becky Siegel07c8a162017-03-13 14:23:48 -0700214 assert.equal(valueOf('Tab width', 'diffPreferences')
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700215 .firstElementChild.bindValue, diffPreferences.tab_size);
Becky Siegel07c8a162017-03-13 14:23:48 -0700216 assert.equal(valueOf('Font size', 'diffPreferences')
Becky Siegeld7dbed62016-10-12 10:55:26 -0700217 .firstElementChild.bindValue, diffPreferences.font_size);
Becky Siegel07c8a162017-03-13 14:23:48 -0700218 assert.equal(valueOf('Show tabs', 'diffPreferences')
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700219 .firstElementChild.checked, diffPreferences.show_tabs);
Becky Siegel07c8a162017-03-13 14:23:48 -0700220 assert.equal(valueOf('Show trailing whitespace', 'diffPreferences')
Wyatt Allend9705002016-11-17 12:03:51 -0800221 .firstElementChild.checked, diffPreferences.show_whitespace_errors);
Becky Siegel07c8a162017-03-13 14:23:48 -0700222 assert.equal(valueOf('Fit to screen', 'diffPreferences')
Becky Siegele7d19a92016-10-31 14:35:35 -0700223 .firstElementChild.checked, diffPreferences.line_wrapping);
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700224
225 assert.isFalse(element._diffPrefsChanged);
226
Becky Siegel07c8a162017-03-13 14:23:48 -0700227 var showTabsCheckbox = valueOf('Show tabs', 'diffPreferences')
Wyatt Allen649fa8a2016-06-13 21:31:26 -0700228 .firstElementChild;
229 showTabsCheckbox.checked = false;
230 element._handleShowTabsChanged();
231
232 assert.isTrue(element._diffPrefsChanged);
233
234 stub('gr-rest-api-interface', {
235 saveDiffPreferences: function(prefs) {
236 assert.equal(prefs.show_tabs, false);
237 return Promise.resolve();
238 }
239 });
240
241 // Save the change.
242 element._handleSaveDiffPreferences().then(function() {
243 assert.isFalse(element._diffPrefsChanged);
244 done();
245 });
246 });
247
Becky Siegele7d19a92016-10-31 14:35:35 -0700248 test('columns input is hidden with fit to scsreen is selected', function() {
249 assert.isFalse(element.$.columnsPref.hidden);
250
251 MockInteractions.tap(element.$.lineWrapping);
252 assert.isTrue(element.$.columnsPref.hidden);
253
254 MockInteractions.tap(element.$.lineWrapping);
255 assert.isFalse(element.$.columnsPref.hidden);
256 });
257
Wyatt Allend14895b2016-06-06 12:37:24 -0700258 test('menu', function(done) {
259 assert.isFalse(element._menuChanged);
260 assert.isFalse(element._prefsChanged);
261
262 assertMenusEqual(element._localMenu, preferences.my);
263
264 var menu = element.$.menu.firstElementChild;
265 var tableRows = Polymer.dom(menu.root).querySelectorAll('tbody tr');
266 assert.equal(tableRows.length, preferences.my.length);
267
268 // Add a menu item:
269 element.splice('_localMenu', 1, 0, {name: 'foo', url: 'bar', target: ''});
270 Polymer.dom.flush();
271
272 tableRows = Polymer.dom(menu.root).querySelectorAll('tbody tr');
273 assert.equal(tableRows.length, preferences.my.length + 1);
274
275 assert.isTrue(element._menuChanged);
276 assert.isFalse(element._prefsChanged);
277
278 stub('gr-rest-api-interface', {
279 savePreferences: function(prefs) {
280 assertMenusEqual(prefs.my, element._localMenu);
281 return Promise.resolve();
282 }
283 });
284
285 element._handleSaveMenu().then(function() {
286 assert.isFalse(element._menuChanged);
287 assert.isFalse(element._prefsChanged);
288 assertMenusEqual(element.prefs.my, element._localMenu);
289 done();
290 });
291 });
Wyatt Allencf028422016-06-14 17:44:30 -0700292
293 test('add email validation', function() {
294 assert.isFalse(element._isNewEmailValid('invalid email'));
295 assert.isTrue(element._isNewEmailValid('vaguely@valid.email'));
296
297 assert.isFalse(
298 element._computeAddEmailButtonEnabled('invalid email'), true);
299 assert.isFalse(
300 element._computeAddEmailButtonEnabled('vaguely@valid.email', true));
301 assert.isTrue(
302 element._computeAddEmailButtonEnabled('vaguely@valid.email', false));
303 });
304
305 test('add email does not save invalid', function() {
306 var addEmailStub = stubAddAccountEmail(201);
307
308 assert.isFalse(element._addingEmail);
309 assert.isNotOk(element._lastSentVerificationEmail);
310 element._newEmail = 'invalid email';
311
312 element._handleAddEmailButton();
313
314 assert.isFalse(element._addingEmail);
315 assert.isFalse(addEmailStub.called);
316 assert.isNotOk(element._lastSentVerificationEmail);
317
318 assert.isFalse(addEmailStub.called);
319 });
320
321 test('add email does save valid', function(done) {
322 var addEmailStub = stubAddAccountEmail(201);
323
324 assert.isFalse(element._addingEmail);
325 assert.isNotOk(element._lastSentVerificationEmail);
326 element._newEmail = 'valid@email.com';
327
328 element._handleAddEmailButton();
329
330 assert.isTrue(element._addingEmail);
331 assert.isTrue(addEmailStub.called);
332
333 assert.isTrue(addEmailStub.called);
334 addEmailStub.lastCall.returnValue.then(function() {
335 assert.isOk(element._lastSentVerificationEmail);
336 done();
337 });
338 });
339
340 test('add email does not set last-email if error', function(done) {
341 var addEmailStub = stubAddAccountEmail(500);
342
343 assert.isNotOk(element._lastSentVerificationEmail);
344 element._newEmail = 'valid@email.com';
345
346 element._handleAddEmailButton();
347
348 assert.isTrue(addEmailStub.called);
349 addEmailStub.lastCall.returnValue.then(function() {
350 assert.isNotOk(element._lastSentVerificationEmail);
351 done();
352 });
353 });
Viktar Donich14ef76a2016-12-22 12:51:17 -0800354
355 test('emails are loaded without emailToken', function() {
356 sandbox.stub(element.$.emailEditor, 'loadData');
357 element.params = {};
358 element.attached();
359 assert.isTrue(element.$.emailEditor.loadData.calledOnce);
360 });
361
362 suite('when email verification token is provided', function() {
363 var resolveConfirm;
364
365 setup(function() {
366 sandbox.stub(element.$.emailEditor, 'loadData');
367 sandbox.stub(element.$.restAPI, 'confirmEmail', function() {
368 return new Promise(function(resolve) { resolveConfirm = resolve; });
369 });
370 element.params = {emailToken: 'foo'};
371 element.attached();
372 });
373
374 test('it is used to confirm email via rest API', function() {
375 assert.isTrue(element.$.restAPI.confirmEmail.calledOnce);
376 assert.isTrue(element.$.restAPI.confirmEmail.calledWith('foo'));
377 });
378
379 test('emails are not loaded initially', function() {
380 assert.isFalse(element.$.emailEditor.loadData.called);
381 });
382
383 test('user emails are loaded after email confirmed', function(done) {
384 element._loadingPromise.then(function() {
385 assert.isTrue(element.$.emailEditor.loadData.calledOnce);
386 done();
387 });
388 resolveConfirm();
389 });
390
391 test('show-alert is fired when email is confirmed', function(done) {
392 sandbox.spy(element, 'fire');
393 element._loadingPromise.then(function() {
Becky Siegele6bb34f2017-01-04 13:38:54 -0800394 assert.isTrue(
395 element.fire.calledWith('show-alert', {message: 'bar'}));
Viktar Donich14ef76a2016-12-22 12:51:17 -0800396 done();
397 });
398 resolveConfirm('bar');
399 });
400
401 });
Wyatt Allen60ea95f2016-06-03 09:35:07 -0700402 });
403</script>