blob: 82997a5ec381c46ce612efd4b06a728bead84c68 [file] [log] [blame]
Wyatt Allen767b7602016-06-15 16:51:20 -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-account-info</title>
20
Viktar Donich29e1ce52017-03-28 17:02:44 -070021<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
Wyatt Allen767b7602016-06-15 16:51:20 -070022<script src="../../../bower_components/web-component-tester/browser.js"></script>
Mike Samuele07c4b22017-06-02 13:08:19 -040023<link rel="import" href="../../../test/common-test-setup.html"/>
Wyatt Allen767b7602016-06-15 16:51:20 -070024<link rel="import" href="gr-account-info.html">
25
Viktar Donich29e1ce52017-03-28 17:02:44 -070026<script>void(0);</script>
27
Wyatt Allen767b7602016-06-15 16:51:20 -070028<test-fixture id="basic">
29 <template>
30 <gr-account-info></gr-account-info>
31 </template>
32</test-fixture>
33
34<script>
Kasper Nilsson95131342017-05-15 17:13:16 -070035 suite('gr-account-info tests', () => {
36 let element;
37 let account;
38 let config;
39 let sandbox;
Wyatt Allen767b7602016-06-15 16:51:20 -070040
41 function valueOf(title) {
Kasper Nilsson95131342017-05-15 17:13:16 -070042 const sections = Polymer.dom(element.root).querySelectorAll('section');
43 let titleEl;
44 for (let i = 0; i < sections.length; i++) {
Wyatt Allen767b7602016-06-15 16:51:20 -070045 titleEl = sections[i].querySelector('.title');
46 if (titleEl.textContent === title) {
47 return sections[i].querySelector('.value');
48 }
49 }
50 }
51
Kasper Nilsson95131342017-05-15 17:13:16 -070052 setup(done => {
Kasper Nilsson85875742017-02-02 12:13:01 -080053 sandbox = sinon.sandbox.create();
Wyatt Allen767b7602016-06-15 16:51:20 -070054 account = {
55 _account_id: 123,
56 name: 'user name',
57 email: 'user@email',
58 username: 'user username',
59 registered: '2000-01-01 00:00:00.000000000',
60 };
Urs Wolfer33df0052016-07-13 21:06:03 +020061 config = {auth: {editable_account_fields: []}};
Wyatt Allen767b7602016-06-15 16:51:20 -070062
63 stub('gr-rest-api-interface', {
Kasper Nilsson95131342017-05-15 17:13:16 -070064 getAccount() { return Promise.resolve(account); },
65 getConfig() { return Promise.resolve(config); },
66 getPreferences() {
Wyatt Allen767b7602016-06-15 16:51:20 -070067 return Promise.resolve({time_format: 'HHMM_12'});
68 },
69 });
70 element = fixture('basic');
Wyatt Allen767b7602016-06-15 16:51:20 -070071 // Allow the element to render.
Kasper Nilsson95131342017-05-15 17:13:16 -070072 element.loadData().then(() => { flush(done); });
Wyatt Allen767b7602016-06-15 16:51:20 -070073 });
74
Kasper Nilsson95131342017-05-15 17:13:16 -070075 teardown(() => {
Kasper Nilsson85875742017-02-02 12:13:01 -080076 sandbox.restore();
77 });
78
Kasper Nilsson95131342017-05-15 17:13:16 -070079 test('basic account info render', () => {
Wyatt Allen767b7602016-06-15 16:51:20 -070080 assert.isFalse(element._loading);
81
82 assert.equal(valueOf('ID').textContent, account._account_id);
83 assert.equal(valueOf('Email').textContent, account.email);
84 assert.equal(valueOf('Username').textContent, account.username);
85 });
86
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -080087 test('full name render (immutable)', () => {
Kasper Nilsson95131342017-05-15 17:13:16 -070088 const section = element.$.nameSection;
89 const displaySpan = section.querySelectorAll('.value')[0];
90 const inputSpan = section.querySelectorAll('.value')[1];
Wyatt Allen767b7602016-06-15 16:51:20 -070091
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -080092 assert.isFalse(element.nameMutable);
Wyatt Allen767b7602016-06-15 16:51:20 -070093 assert.isFalse(displaySpan.hasAttribute('hidden'));
94 assert.equal(displaySpan.textContent, account.name);
95 assert.isTrue(inputSpan.hasAttribute('hidden'));
96 });
97
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -080098 test('full name render (mutable)', () => {
Wyatt Allen767b7602016-06-15 16:51:20 -070099 element.set('_serverConfig',
100 {auth: {editable_account_fields: ['FULL_NAME']}});
101
Kasper Nilsson95131342017-05-15 17:13:16 -0700102 const section = element.$.nameSection;
103 const displaySpan = section.querySelectorAll('.value')[0];
104 const inputSpan = section.querySelectorAll('.value')[1];
Wyatt Allen767b7602016-06-15 16:51:20 -0700105
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800106 assert.isTrue(element.nameMutable);
Wyatt Allen767b7602016-06-15 16:51:20 -0700107 assert.isTrue(displaySpan.hasAttribute('hidden'));
Kasper Nilsson85875742017-02-02 12:13:01 -0800108 assert.equal(element.$.nameInput.bindValue, account.name);
Wyatt Allen767b7602016-06-15 16:51:20 -0700109 assert.isFalse(inputSpan.hasAttribute('hidden'));
110 });
111
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800112 test('username render (immutable)', () => {
113 const section = element.$.usernameSection;
114 const displaySpan = section.querySelectorAll('.value')[0];
115 const inputSpan = section.querySelectorAll('.value')[1];
116
117 assert.isFalse(element.usernameMutable);
118 assert.isFalse(displaySpan.hasAttribute('hidden'));
119 assert.equal(displaySpan.textContent, account.username);
120 assert.isTrue(inputSpan.hasAttribute('hidden'));
121 });
122
123 test('username render (mutable)', () => {
124 element.set('_serverConfig',
125 {auth: {editable_account_fields: ['USER_NAME']}});
Kasper Nilssonf4d03fc2017-11-14 15:12:50 -0800126 element.set('_account.username', '');
127 element.set('_username', '');
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800128
129 const section = element.$.usernameSection;
130 const displaySpan = section.querySelectorAll('.value')[0];
131 const inputSpan = section.querySelectorAll('.value')[1];
132
133 assert.isTrue(element.usernameMutable);
134 assert.isTrue(displaySpan.hasAttribute('hidden'));
135 assert.equal(element.$.usernameInput.bindValue, account.username);
136 assert.isFalse(inputSpan.hasAttribute('hidden'));
137 });
138
Kasper Nilsson95131342017-05-15 17:13:16 -0700139 suite('account info edit', () => {
140 let nameChangedSpy;
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800141 let usernameChangedSpy;
Kasper Nilsson95131342017-05-15 17:13:16 -0700142 let statusChangedSpy;
143 let nameStub;
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800144 let usernameStub;
Kasper Nilsson95131342017-05-15 17:13:16 -0700145 let statusStub;
Kasper Nilsson85875742017-02-02 12:13:01 -0800146
Kasper Nilsson95131342017-05-15 17:13:16 -0700147 setup(() => {
Kasper Nilsson58273122017-03-09 10:55:10 -0800148 nameChangedSpy = sandbox.spy(element, '_nameChanged');
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800149 usernameChangedSpy = sandbox.spy(element, '_usernameChanged');
Kasper Nilsson58273122017-03-09 10:55:10 -0800150 statusChangedSpy = sandbox.spy(element, '_statusChanged');
Kasper Nilsson85875742017-02-02 12:13:01 -0800151 element.set('_serverConfig',
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800152 {auth: {editable_account_fields: ['FULL_NAME', 'USER_NAME']}});
Wyatt Allen767b7602016-06-15 16:51:20 -0700153
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800154 nameStub = sandbox.stub(element.$.restAPI, 'setAccountName',
155 name => Promise.resolve());
156 usernameStub = sandbox.stub(element.$.restAPI, 'setAccountUsername',
157 username => Promise.resolve());
Kasper Nilsson85875742017-02-02 12:13:01 -0800158 statusStub = sandbox.stub(element.$.restAPI, 'setAccountStatus',
Kasper Nilsson95131342017-05-15 17:13:16 -0700159 status => Promise.resolve());
Kasper Nilsson85875742017-02-02 12:13:01 -0800160 });
Wyatt Allen767b7602016-06-15 16:51:20 -0700161
Kasper Nilsson95131342017-05-15 17:13:16 -0700162 test('name', done => {
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800163 assert.isTrue(element.nameMutable);
Becky Siegel10de1032017-07-18 21:27:54 +0000164 assert.isFalse(element.hasUnsavedChanges);
Wyatt Allen767b7602016-06-15 16:51:20 -0700165
Becky Siegel10de1032017-07-18 21:27:54 +0000166 element.set('_account.name', 'new name');
Wyatt Allen767b7602016-06-15 16:51:20 -0700167
Becky Siegel10de1032017-07-18 21:27:54 +0000168 assert.isTrue(nameChangedSpy.called);
169 assert.isFalse(statusChangedSpy.called);
170 assert.isTrue(element.hasUnsavedChanges);
Wyatt Allen767b7602016-06-15 16:51:20 -0700171
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800172 element.save().then(() => {
173 assert.isFalse(usernameStub.called);
174 assert.isTrue(nameStub.called);
175 assert.isFalse(statusStub.called);
176 nameStub.lastCall.returnValue.then(() => {
177 assert.equal(nameStub.lastCall.args[0], 'new name');
178 done();
179 });
180 });
181 });
Wyatt Allen767b7602016-06-15 16:51:20 -0700182
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800183 test('username', done => {
Kasper Nilssonf4d03fc2017-11-14 15:12:50 -0800184 element.set('_account.username', '');
185 element._hasUsernameChange = false;
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800186 assert.isTrue(element.usernameMutable);
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800187
Kasper Nilssonf4d03fc2017-11-14 15:12:50 -0800188 element.set('_username', 'new username');
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800189
190 assert.isTrue(usernameChangedSpy.called);
191 assert.isFalse(statusChangedSpy.called);
192 assert.isTrue(element.hasUnsavedChanges);
193
194 element.save().then(() => {
195 assert.isTrue(usernameStub.called);
196 assert.isFalse(nameStub.called);
197 assert.isFalse(statusStub.called);
198 usernameStub.lastCall.returnValue.then(() => {
199 assert.equal(usernameStub.lastCall.args[0], 'new username');
200 done();
201 });
Becky Siegel10de1032017-07-18 21:27:54 +0000202 });
Kasper Nilsson85875742017-02-02 12:13:01 -0800203 });
Wyatt Allen767b7602016-06-15 16:51:20 -0700204
Kasper Nilsson95131342017-05-15 17:13:16 -0700205 test('status', done => {
Kasper Nilsson85875742017-02-02 12:13:01 -0800206 assert.isFalse(element.hasUnsavedChanges);
207
208 element.set('_account.status', 'new status');
209
Kasper Nilsson58273122017-03-09 10:55:10 -0800210 assert.isFalse(nameChangedSpy.called);
211 assert.isTrue(statusChangedSpy.called);
Kasper Nilsson85875742017-02-02 12:13:01 -0800212 assert.isTrue(element.hasUnsavedChanges);
213
Kasper Nilsson95131342017-05-15 17:13:16 -0700214 element.save().then(() => {
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800215 assert.isFalse(usernameStub.called);
Kasper Nilsson58273122017-03-09 10:55:10 -0800216 assert.isTrue(statusStub.called);
217 assert.isFalse(nameStub.called);
Kasper Nilsson95131342017-05-15 17:13:16 -0700218 statusStub.lastCall.returnValue.then(() => {
Kasper Nilsson58273122017-03-09 10:55:10 -0800219 assert.equal(statusStub.lastCall.args[0], 'new status');
220 done();
221 });
Kasper Nilsson85875742017-02-02 12:13:01 -0800222 });
Wyatt Allen767b7602016-06-15 16:51:20 -0700223 });
224 });
Paladox nonefbe932e2017-04-26 21:36:06 +0000225
Kasper Nilsson95131342017-05-15 17:13:16 -0700226 suite('edit name and status', () => {
227 let nameChangedSpy;
228 let statusChangedSpy;
229 let nameStub;
230 let statusStub;
Paladox nonefbe932e2017-04-26 21:36:06 +0000231
Kasper Nilsson95131342017-05-15 17:13:16 -0700232 setup(() => {
Paladox nonefbe932e2017-04-26 21:36:06 +0000233 nameChangedSpy = sandbox.spy(element, '_nameChanged');
234 statusChangedSpy = sandbox.spy(element, '_statusChanged');
235 element.set('_serverConfig',
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800236 {auth: {editable_account_fields: ['FULL_NAME']}});
Paladox nonefbe932e2017-04-26 21:36:06 +0000237
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800238 nameStub = sandbox.stub(element.$.restAPI, 'setAccountName',
239 name => Promise.resolve());
Paladox nonefbe932e2017-04-26 21:36:06 +0000240 statusStub = sandbox.stub(element.$.restAPI, 'setAccountStatus',
Kasper Nilsson95131342017-05-15 17:13:16 -0700241 status => Promise.resolve());
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800242 sandbox.stub(element.$.restAPI, 'setAccountUsername',
243 username => Promise.resolve());
Paladox nonefbe932e2017-04-26 21:36:06 +0000244 });
245
Kasper Nilsson95131342017-05-15 17:13:16 -0700246 test('set name and status', done => {
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800247 assert.isTrue(element.nameMutable);
Paladox nonefbe932e2017-04-26 21:36:06 +0000248 assert.isFalse(element.hasUnsavedChanges);
249
250 element.set('_account.name', 'new name');
251
252 assert.isTrue(nameChangedSpy.called);
253
254 element.set('_account.status', 'new status');
255
256 assert.isTrue(statusChangedSpy.called);
257
258 assert.isTrue(element.hasUnsavedChanges);
259
Kasper Nilsson95131342017-05-15 17:13:16 -0700260 element.save().then(() => {
Paladox nonefbe932e2017-04-26 21:36:06 +0000261 assert.isTrue(statusStub.called);
262 assert.isTrue(nameStub.called);
263
264 assert.equal(nameStub.lastCall.args[0], 'new name');
265
266 assert.equal(statusStub.lastCall.args[0], 'new status');
267
268 done();
269 });
270 });
271 });
272
Kasper Nilsson95131342017-05-15 17:13:16 -0700273 suite('set status but read name', () => {
274 let statusChangedSpy;
275 let statusStub;
Paladox nonefbe932e2017-04-26 21:36:06 +0000276
Kasper Nilsson95131342017-05-15 17:13:16 -0700277 setup(() => {
Paladox nonefbe932e2017-04-26 21:36:06 +0000278 statusChangedSpy = sandbox.spy(element, '_statusChanged');
279 element.set('_serverConfig',
280 {auth: {editable_account_fields: []}});
281
282 statusStub = sandbox.stub(element.$.restAPI, 'setAccountStatus',
Kasper Nilsson95131342017-05-15 17:13:16 -0700283 status => Promise.resolve());
Paladox nonefbe932e2017-04-26 21:36:06 +0000284 });
285
Kasper Nilsson95131342017-05-15 17:13:16 -0700286 test('read full name but set status', done => {
287 const section = element.$.nameSection;
288 const displaySpan = section.querySelectorAll('.value')[0];
289 const inputSpan = section.querySelectorAll('.value')[1];
Paladox nonefbe932e2017-04-26 21:36:06 +0000290
Kasper Nilsson8a4c47e2017-11-09 16:08:06 -0800291 assert.isFalse(element.nameMutable);
Paladox nonefbe932e2017-04-26 21:36:06 +0000292
293 assert.isFalse(element.hasUnsavedChanges);
294
295 assert.isFalse(displaySpan.hasAttribute('hidden'));
296 assert.equal(displaySpan.textContent, account.name);
297 assert.isTrue(inputSpan.hasAttribute('hidden'));
298
299 element.set('_account.status', 'new status');
300
301 assert.isTrue(statusChangedSpy.called);
302
303 assert.isTrue(element.hasUnsavedChanges);
304
Kasper Nilsson95131342017-05-15 17:13:16 -0700305 element.save().then(() => {
Paladox nonefbe932e2017-04-26 21:36:06 +0000306 assert.isTrue(statusStub.called);
Kasper Nilsson95131342017-05-15 17:13:16 -0700307 statusStub.lastCall.returnValue.then(() => {
Paladox nonefbe932e2017-04-26 21:36:06 +0000308 assert.equal(statusStub.lastCall.args[0], 'new status');
309 done();
310 });
311 });
312 });
313 });
Kasper Nilsson5cb34e72017-12-27 14:12:15 -0800314
315 test('_usernameChanged compares usernames with loose equality', () => {
316 element._account = {};
317 element._username = '';
318 element._hasUsernameChange = false;
319 element._loading = false;
320 // _usernameChanged is an observer, but call it here after setting
321 // _hasUsernameChange in the test to force recomputation.
322 element._usernameChanged();
323 flushAsynchronousOperations();
324
325 assert.isFalse(element._hasUsernameChange);
326
327 element.set('_username', 'test');
328 flushAsynchronousOperations();
329
330 assert.isTrue(element._hasUsernameChange);
331 });
Wyatt Allen767b7602016-06-15 16:51:20 -0700332 });
333</script>