blob: b33c54cf22fdd07bc637817153ce7ed5517e23b3 [file] [log] [blame]
Andrew Bonventreab0f6a82015-11-14 15:40:47 -05001<!DOCTYPE html>
2<!--
Dave Borowitz8cdc76b2018-03-26 10:04:27 -04003@license
Andrew Bonventreab0f6a82015-11-14 15:40:47 -05004Copyright (C) 2015 The Android Open Source Project
5
6Licensed under the Apache License, Version 2.0 (the "License");
7you may not use this file except in compliance with the License.
8You may obtain a copy of the License at
9
10http://www.apache.org/licenses/LICENSE-2.0
11
12Unless required by applicable law or agreed to in writing, software
13distributed under the License is distributed on an "AS IS" BASIS,
14WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15See the License for the specific language governing permissions and
16limitations under the License.
17-->
18
19<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
Andrew Bonventre4c944782015-11-18 16:31:18 -050020<title>gr-diff-view</title>
Andrew Bonventreab0f6a82015-11-14 15:40:47 -050021
Viktar Donich29e1ce52017-03-28 17:02:44 -070022<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
Andrew Bonventre78792e82016-03-04 17:48:22 -050023<script src="../../../bower_components/web-component-tester/browser.js"></script>
Mike Samuele07c4b22017-06-02 13:08:19 -040024<link rel="import" href="../../../test/common-test-setup.html"/>
Andrew Bonventre78792e82016-03-04 17:48:22 -050025<script src="../../../bower_components/page/page.js"></script>
Andrew Bonventre78792e82016-03-04 17:48:22 -050026<script src="../../../scripts/util.js"></script>
Andrew Bonventre18f76a62015-11-25 19:08:45 -050027
Andrew Bonventre78792e82016-03-04 17:48:22 -050028<link rel="import" href="gr-diff-view.html">
Andrew Bonventreab0f6a82015-11-14 15:40:47 -050029
Viktar Donich29e1ce52017-03-28 17:02:44 -070030<script>void(0);</script>
31
Andrew Bonventreab0f6a82015-11-14 15:40:47 -050032<test-fixture id="basic">
33 <template>
Andrew Bonventre0601fc72015-12-02 13:17:35 -050034 <gr-diff-view></gr-diff-view>
35 </template>
36</test-fixture>
37
Logan Hanks78ad03c2016-08-25 12:35:50 -070038<test-fixture id="blank">
39 <template>
40 <div></div>
41 </template>
beckysiegelc47410c2016-09-16 10:44:37 -070042</test-fixture>
Logan Hanks78ad03c2016-08-25 12:35:50 -070043
Andrew Bonventreab0f6a82015-11-14 15:40:47 -050044<script>
Kasper Nilssonef511942017-05-16 14:38:48 -070045 suite('gr-diff-view tests', () => {
Logan Hanks5cde0842018-10-05 15:56:10 -070046 const kb = window.Gerrit.KeyboardShortcutBinder;
47 kb.bindShortcut(kb.Shortcut.LEFT_PANE, 'shift+left');
48 kb.bindShortcut(kb.Shortcut.RIGHT_PANE, 'shift+right');
49 kb.bindShortcut(kb.Shortcut.NEXT_LINE, 'j', 'down');
50 kb.bindShortcut(kb.Shortcut.PREV_LINE, 'k', 'up');
51 kb.bindShortcut(kb.Shortcut.NEXT_FILE_WITH_COMMENTS, 'shift+j');
52 kb.bindShortcut(kb.Shortcut.PREV_FILE_WITH_COMMENTS, 'shift+k');
53 kb.bindShortcut(kb.Shortcut.NEW_COMMENT, 'c');
54 kb.bindShortcut(kb.Shortcut.SAVE_COMMENT, 'ctrl+s');
55 kb.bindShortcut(kb.Shortcut.NEXT_FILE, ']');
56 kb.bindShortcut(kb.Shortcut.PREV_FILE, '[');
57 kb.bindShortcut(kb.Shortcut.NEXT_CHUNK, 'n');
58 kb.bindShortcut(kb.Shortcut.NEXT_COMMENT_THREAD, 'shift+n');
59 kb.bindShortcut(kb.Shortcut.PREV_CHUNK, 'p');
60 kb.bindShortcut(kb.Shortcut.PREV_COMMENT_THREAD, 'shift+p');
61 kb.bindShortcut(kb.Shortcut.OPEN_REPLY_DIALOG, 'a');
62 kb.bindShortcut(kb.Shortcut.TOGGLE_LEFT_PANE, 'shift+a');
63 kb.bindShortcut(kb.Shortcut.UP_TO_CHANGE, 'u');
64 kb.bindShortcut(kb.Shortcut.OPEN_DIFF_PREFS, ',');
65 kb.bindShortcut(kb.Shortcut.TOGGLE_DIFF_MODE, 'm');
66 kb.bindShortcut(kb.Shortcut.TOGGLE_FILE_REVIEWED, 'r');
67 kb.bindShortcut(kb.Shortcut.EXPAND_ALL_DIFF_CONTEXT, 'shift+x');
68 kb.bindShortcut(kb.Shortcut.EXPAND_ALL_COMMENT_THREADS, 'e');
69 kb.bindShortcut(kb.Shortcut.COLLAPSE_ALL_COMMENT_THREADS, 'shift+e');
Kasper Nilsson30d54102018-11-12 10:55:29 -080070 kb.bindShortcut(kb.Shortcut.NEXT_UNREVIEWED_FILE, 'shift+m');
Logan Hanks5cde0842018-10-05 15:56:10 -070071
Kasper Nilssonef511942017-05-16 14:38:48 -070072 let element;
73 let sandbox;
Andrew Bonventre0601fc72015-12-02 13:17:35 -050074
Wyatt Allenc310f4f2017-07-05 21:26:33 -070075 const PARENT = 'PARENT';
76
Kasper Nilssonb1e23072018-01-23 10:33:44 -080077 setup(() => {
Wyatt Allen43ddaf62016-10-26 17:11:50 -070078 sandbox = sinon.sandbox.create();
79
Andrew Bonventrecfacb802016-03-29 14:06:39 -040080 stub('gr-rest-api-interface', {
Dmitrii Filippov3d73c6a2020-05-06 14:06:27 +020081 getConfig() {
82 return Promise.resolve({change: {}});
83 },
84 getLoggedIn() {
85 return Promise.resolve(false);
86 },
87 getProjectConfig() {
88 return Promise.resolve({});
89 },
90 getDiffChangeDetail() {
91 return Promise.resolve({});
92 },
93 getChangeFiles() {
94 return Promise.resolve({});
95 },
96 saveFileReviewed() {
97 return Promise.resolve();
98 },
99 getDiffComments() {
100 return Promise.resolve({});
101 },
102 getDiffRobotComments() {
103 return Promise.resolve({});
104 },
105 getDiffDrafts() {
106 return Promise.resolve({});
107 },
108 getReviewedFiles() {
109 return Promise.resolve([]);
110 },
Andrew Bonventrecfacb802016-03-29 14:06:39 -0400111 });
Andrew Bonventreab0f6a82015-11-14 15:40:47 -0500112 element = fixture('basic');
Kasper Nilssonb1e23072018-01-23 10:33:44 -0800113 return element._loadComments();
Andrew Bonventre0601fc72015-12-02 13:17:35 -0500114 });
Andrew Bonventreab0f6a82015-11-14 15:40:47 -0500115
Kasper Nilssonef511942017-05-16 14:38:48 -0700116 teardown(() => {
Wyatt Allen43ddaf62016-10-26 17:11:50 -0700117 sandbox.restore();
118 });
119
Viktar Donich36e8ba42018-04-20 13:03:19 -0700120 test('params change triggers diffViewDisplayed()', () => {
121 sandbox.stub(element.$.reporting, 'diffViewDisplayed');
Ole Rehmsene5de55e2018-08-23 16:52:57 +0200122 sandbox.stub(element.$.diffHost, 'reload').returns(Promise.resolve());
Viktar Donich36e8ba42018-04-20 13:03:19 -0700123 sandbox.spy(element, '_paramsChanged');
124 element.params = {
125 view: Gerrit.Nav.View.DIFF,
126 changeNum: '42',
127 patchNum: '2',
128 basePatchNum: '1',
129 path: '/COMMIT_MSG',
130 };
131
132 return element._paramsChanged.returnValues[0].then(() => {
133 assert.isTrue(element.$.reporting.diffViewDisplayed.calledOnce);
134 });
135 });
136
Kasper Nilssonef511942017-05-16 14:38:48 -0700137 test('toggle left diff with a hotkey', () => {
Ole Rehmsene5de55e2018-08-23 16:52:57 +0200138 const toggleLeftDiffStub = sandbox.stub(
139 element.$.diffHost, 'toggleLeftDiff');
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800140 MockInteractions.pressAndReleaseKeyOn(element, 65, 'shift', 'a');
Viktar Donichc282d7b2016-08-10 11:53:12 -0700141 assert.isTrue(toggleLeftDiffStub.calledOnce);
Viktar Donichc282d7b2016-08-10 11:53:12 -0700142 });
143
Kasper Nilssonef511942017-05-16 14:38:48 -0700144 test('keyboard shortcuts', () => {
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500145 element._changeNum = '42';
Andrew Bonventre1aa7b902015-12-11 12:02:57 -0500146 element._patchRange = {
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700147 basePatchNum: PARENT,
Andrew Bonventre1aa7b902015-12-11 12:02:57 -0500148 patchNum: '10',
149 };
Andrew Bonventre8e375992016-02-25 11:51:15 -0500150 element._change = {
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700151 _number: 42,
Andrew Bonventre8e375992016-02-25 11:51:15 -0500152 revisions: {
Wyatt Allena744e232017-11-08 15:33:48 -0800153 a: {_number: 10, commit: {parents: []}},
Andrew Bonventre8e375992016-02-25 11:51:15 -0500154 },
155 };
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500156 element._fileList = ['chell.go', 'glados.txt', 'wheatley.md'];
157 element._path = 'glados.txt';
Andrew Bonventre4a8fff22016-02-03 20:40:36 -0800158 element.changeViewState.selectedFileIndex = 1;
Kasper Nilsson52053a42018-11-08 09:28:01 -0800159 element._loggedIn = true;
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500160
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700161 const diffNavStub = sandbox.stub(Gerrit.Nav, 'navigateToDiff');
162 const changeNavStub = sandbox.stub(Gerrit.Nav, 'navigateToChange');
163
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800164 MockInteractions.pressAndReleaseKeyOn(element, 85, null, 'u');
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700165 assert(changeNavStub.lastCall.calledWith(element._change),
Andrew Bonventre8e375992016-02-25 11:51:15 -0500166 'Should navigate to /c/42/');
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500167
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800168 MockInteractions.pressAndReleaseKeyOn(element, 221, null, ']');
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700169 assert(diffNavStub.lastCall.calledWith(element._change, 'wheatley.md',
170 '10', PARENT), 'Should navigate to /c/42/10/wheatley.md');
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500171 element._path = 'wheatley.md';
Andrew Bonventre4a8fff22016-02-03 20:40:36 -0800172 assert.equal(element.changeViewState.selectedFileIndex, 2);
Kasper Nilsson29b2ab42017-10-09 11:36:19 -0700173 assert.isTrue(element._loading);
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500174
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800175 MockInteractions.pressAndReleaseKeyOn(element, 219, null, '[');
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700176 assert(diffNavStub.lastCall.calledWith(element._change, 'glados.txt',
177 '10', PARENT), 'Should navigate to /c/42/10/glados.txt');
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500178 element._path = 'glados.txt';
Andrew Bonventre4a8fff22016-02-03 20:40:36 -0800179 assert.equal(element.changeViewState.selectedFileIndex, 1);
Kasper Nilsson29b2ab42017-10-09 11:36:19 -0700180 assert.isTrue(element._loading);
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500181
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800182 MockInteractions.pressAndReleaseKeyOn(element, 219, null, '[');
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700183 assert(diffNavStub.lastCall.calledWith(element._change, 'chell.go', '10',
184 PARENT), 'Should navigate to /c/42/10/chell.go');
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500185 element._path = 'chell.go';
Andrew Bonventre4a8fff22016-02-03 20:40:36 -0800186 assert.equal(element.changeViewState.selectedFileIndex, 0);
Kasper Nilsson29b2ab42017-10-09 11:36:19 -0700187 assert.isTrue(element._loading);
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500188
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800189 MockInteractions.pressAndReleaseKeyOn(element, 219, null, '[');
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700190 assert(changeNavStub.lastCall.calledWith(element._change),
Andrew Bonventre8e375992016-02-25 11:51:15 -0500191 'Should navigate to /c/42/');
Andrew Bonventre4a8fff22016-02-03 20:40:36 -0800192 assert.equal(element.changeViewState.selectedFileIndex, 0);
Kasper Nilsson29b2ab42017-10-09 11:36:19 -0700193 assert.isTrue(element._loading);
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500194
Kasper Nilssonef511942017-05-16 14:38:48 -0700195 const showPrefsStub =
Paladox none7a2280c2019-02-19 22:07:54 +0000196 sandbox.stub(element.$.diffPreferencesDialog, 'open',
Kasper Nilssonef511942017-05-16 14:38:48 -0700197 () => Promise.resolve());
beckysiegelc47410c2016-09-16 10:44:37 -0700198
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800199 MockInteractions.pressAndReleaseKeyOn(element, 188, null, ',');
Andrew Bonventre33543b72016-01-26 16:30:02 -0500200 assert(showPrefsStub.calledOnce);
201
Kasper Nilsson52053a42018-11-08 09:28:01 -0800202 element.disableDiffPrefs = true;
203 MockInteractions.pressAndReleaseKeyOn(element, 188, null, ',');
204 assert(showPrefsStub.calledOnce);
205
Kasper Nilssonef511942017-05-16 14:38:48 -0700206 let scrollStub = sandbox.stub(element.$.cursor, 'moveToNextChunk');
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800207 MockInteractions.pressAndReleaseKeyOn(element, 78, null, 'n');
Andrew Bonventre15f796c2016-02-25 18:19:51 -0500208 assert(scrollStub.calledOnce);
Andrew Bonventre15f796c2016-02-25 18:19:51 -0500209
Wyatt Allen43ddaf62016-10-26 17:11:50 -0700210 scrollStub = sandbox.stub(element.$.cursor, 'moveToPreviousChunk');
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800211 MockInteractions.pressAndReleaseKeyOn(element, 80, null, 'p');
Andrew Bonventre15f796c2016-02-25 18:19:51 -0500212 assert(scrollStub.calledOnce);
Andrew Bonventre15f796c2016-02-25 18:19:51 -0500213
Wyatt Allen43ddaf62016-10-26 17:11:50 -0700214 scrollStub = sandbox.stub(element.$.cursor, 'moveToNextCommentThread');
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800215 MockInteractions.pressAndReleaseKeyOn(element, 78, 'shift', 'n');
Andrew Bonventre15f796c2016-02-25 18:19:51 -0500216 assert(scrollStub.calledOnce);
Andrew Bonventre15f796c2016-02-25 18:19:51 -0500217
Wyatt Allen43ddaf62016-10-26 17:11:50 -0700218 scrollStub = sandbox.stub(element.$.cursor,
219 'moveToPreviousCommentThread');
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800220 MockInteractions.pressAndReleaseKeyOn(element, 80, 'shift', 'p');
Andrew Bonventre15f796c2016-02-25 18:19:51 -0500221 assert(scrollStub.calledOnce);
Becky Siegel6a7085e2016-11-02 16:25:53 -0700222
Ole Rehmsene5de55e2018-08-23 16:52:57 +0200223 const computeContainerClassStub = sandbox.stub(element.$.diffHost.$.diff,
Becky Siegel6a7085e2016-11-02 16:25:53 -0700224 '_computeContainerClass');
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800225 MockInteractions.pressAndReleaseKeyOn(element, 74, null, 'j');
Becky Siegel6a7085e2016-11-02 16:25:53 -0700226 assert(computeContainerClassStub.lastCall.calledWithExactly(
227 false, 'SIDE_BY_SIDE', true));
228
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800229 MockInteractions.pressAndReleaseKeyOn(element, 27, null, 'esc');
Becky Siegel6a7085e2016-11-02 16:25:53 -0700230 assert(computeContainerClassStub.lastCall.calledWithExactly(
231 false, 'SIDE_BY_SIDE', false));
Kasper Nilsson5b7e0af2018-02-20 13:13:27 -0800232
233 sandbox.stub(element, '_setReviewed');
234 element.$.reviewed.checked = false;
235 MockInteractions.pressAndReleaseKeyOn(element, 82, 'shift', 'r');
236 assert.isFalse(element._setReviewed.called);
237
238 MockInteractions.pressAndReleaseKeyOn(element, 82, null, 'r');
239 assert.isTrue(element._setReviewed.called);
240 assert.equal(element._setReviewed.lastCall.args[0], true);
Andrew Bonventre0a250522016-01-08 10:13:54 -0500241 });
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500242
Kasper Nilsson5ed90422018-06-15 10:05:21 -0700243 test('shift+x shortcut expands all diff context', () => {
Ole Rehmsene5de55e2018-08-23 16:52:57 +0200244 const expandStub = sandbox.stub(element.$.diffHost, 'expandAllContext');
Kasper Nilsson5ed90422018-06-15 10:05:21 -0700245 MockInteractions.pressAndReleaseKeyOn(element, 88, 'shift', 'x');
246 flushAsynchronousOperations();
247 assert.isTrue(expandStub.called);
248 });
249
Kasper Nilssonef511942017-05-16 14:38:48 -0700250 test('keyboard shortcuts with patch range', () => {
Andrew Bonventre0a250522016-01-08 10:13:54 -0500251 element._changeNum = '42';
252 element._patchRange = {
253 basePatchNum: '5',
254 patchNum: '10',
255 };
Andrew Bonventre8e375992016-02-25 11:51:15 -0500256 element._change = {
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700257 _number: 42,
Andrew Bonventre8e375992016-02-25 11:51:15 -0500258 revisions: {
Wyatt Allena744e232017-11-08 15:33:48 -0800259 a: {_number: 10, commit: {parents: []}},
260 b: {_number: 5, commit: {parents: []}},
Andrew Bonventre8e375992016-02-25 11:51:15 -0500261 },
262 };
Andrew Bonventre0a250522016-01-08 10:13:54 -0500263 element._fileList = ['chell.go', 'glados.txt', 'wheatley.md'];
264 element._path = 'glados.txt';
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500265
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700266 const diffNavStub = sandbox.stub(Gerrit.Nav, 'navigateToDiff');
267 const changeNavStub = sandbox.stub(Gerrit.Nav, 'navigateToChange');
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500268
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800269 MockInteractions.pressAndReleaseKeyOn(element, 65, null, 'a');
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700270 assert.isTrue(changeNavStub.notCalled, 'The `a` keyboard shortcut ' +
271 'should only work when the user is logged in.');
Andrew Bonventre349380e2016-01-28 14:58:04 -0500272 assert.isNull(window.sessionStorage.getItem(
Andrew Bonventre882043f2016-02-22 18:12:27 -0500273 'changeView.showReplyDialog'));
Andrew Bonventre349380e2016-01-28 14:58:04 -0500274
275 element._loggedIn = true;
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800276 MockInteractions.pressAndReleaseKeyOn(element, 65, null, 'a');
Andrew Bonventre882043f2016-02-22 18:12:27 -0500277 assert.isTrue(element.changeViewState.showReplyDialog);
Andrew Bonventre4a8fff22016-02-03 20:40:36 -0800278
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700279 assert(changeNavStub.lastCall.calledWithExactly(element._change, '10',
280 '5'), 'Should navigate to /c/42/5..10');
Andrew Bonventre349380e2016-01-28 14:58:04 -0500281
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800282 MockInteractions.pressAndReleaseKeyOn(element, 85, null, 'u');
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700283 assert(changeNavStub.lastCall.calledWithExactly(element._change, '10',
284 '5'), 'Should navigate to /c/42/5..10');
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500285
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800286 MockInteractions.pressAndReleaseKeyOn(element, 221, null, ']');
Kasper Nilsson29b2ab42017-10-09 11:36:19 -0700287 assert.isTrue(element._loading);
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700288 assert(diffNavStub.lastCall.calledWithExactly(element._change,
289 'wheatley.md', '10', '5'),
Thomas Draebing6ff72df2019-12-27 10:58:03 +0100290 'Should navigate to /c/42/5..10/wheatley.md');
Andrew Bonventre0a250522016-01-08 10:13:54 -0500291 element._path = 'wheatley.md';
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500292
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800293 MockInteractions.pressAndReleaseKeyOn(element, 219, null, '[');
Kasper Nilsson29b2ab42017-10-09 11:36:19 -0700294 assert.isTrue(element._loading);
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700295 assert(diffNavStub.lastCall.calledWithExactly(element._change,
296 'glados.txt', '10', '5'),
Thomas Draebing6ff72df2019-12-27 10:58:03 +0100297 'Should navigate to /c/42/5..10/glados.txt');
Andrew Bonventre0a250522016-01-08 10:13:54 -0500298 element._path = 'glados.txt';
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500299
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800300 MockInteractions.pressAndReleaseKeyOn(element, 219, null, '[');
Kasper Nilsson29b2ab42017-10-09 11:36:19 -0700301 assert.isTrue(element._loading);
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700302 assert(diffNavStub.lastCall.calledWithExactly(element._change, 'chell.go',
303 '10', '5'),
Thomas Draebing6ff72df2019-12-27 10:58:03 +0100304 'Should navigate to /c/42/5..10/chell.go');
Andrew Bonventre0a250522016-01-08 10:13:54 -0500305 element._path = 'chell.go';
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500306
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800307 MockInteractions.pressAndReleaseKeyOn(element, 219, null, '[');
Kasper Nilsson29b2ab42017-10-09 11:36:19 -0700308 assert.isTrue(element._loading);
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700309 assert(changeNavStub.lastCall.calledWithExactly(element._change, '10',
310 '5'),
Thomas Draebing6ff72df2019-12-27 10:58:03 +0100311 'Should navigate to /c/42/5..10');
Andrew Bonventre8e375992016-02-25 11:51:15 -0500312 });
313
Kasper Nilssonef511942017-05-16 14:38:48 -0700314 test('keyboard shortcuts with old patch number', () => {
Andrew Bonventre8e375992016-02-25 11:51:15 -0500315 element._changeNum = '42';
316 element._patchRange = {
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700317 basePatchNum: PARENT,
Andrew Bonventre8e375992016-02-25 11:51:15 -0500318 patchNum: '1',
319 };
320 element._change = {
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700321 _number: 42,
Andrew Bonventre8e375992016-02-25 11:51:15 -0500322 revisions: {
Wyatt Allena744e232017-11-08 15:33:48 -0800323 a: {_number: 1, commit: {parents: []}},
324 b: {_number: 2, commit: {parents: []}},
Andrew Bonventre8e375992016-02-25 11:51:15 -0500325 },
326 };
327 element._fileList = ['chell.go', 'glados.txt', 'wheatley.md'];
328 element._path = 'glados.txt';
329
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700330 const diffNavStub = sandbox.stub(Gerrit.Nav, 'navigateToDiff');
331 const changeNavStub = sandbox.stub(Gerrit.Nav, 'navigateToChange');
Andrew Bonventre8e375992016-02-25 11:51:15 -0500332
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800333 MockInteractions.pressAndReleaseKeyOn(element, 65, null, 'a');
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700334 assert.isTrue(changeNavStub.notCalled, 'The `a` keyboard shortcut ' +
335 'should only work when the user is logged in.');
Andrew Bonventre8e375992016-02-25 11:51:15 -0500336 assert.isNull(window.sessionStorage.getItem(
337 'changeView.showReplyDialog'));
338
339 element._loggedIn = true;
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800340 MockInteractions.pressAndReleaseKeyOn(element, 65, null, 'a');
Andrew Bonventre8e375992016-02-25 11:51:15 -0500341 assert.isTrue(element.changeViewState.showReplyDialog);
342
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700343 assert(changeNavStub.lastCall.calledWithExactly(element._change, '1',
344 PARENT), 'Should navigate to /c/42/1');
Andrew Bonventre8e375992016-02-25 11:51:15 -0500345
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800346 MockInteractions.pressAndReleaseKeyOn(element, 85, null, 'u');
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700347 assert(changeNavStub.lastCall.calledWithExactly(element._change, '1',
348 PARENT), 'Should navigate to /c/42/1');
Andrew Bonventre8e375992016-02-25 11:51:15 -0500349
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800350 MockInteractions.pressAndReleaseKeyOn(element, 221, null, ']');
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700351 assert(diffNavStub.lastCall.calledWithExactly(element._change,
352 'wheatley.md', '1', PARENT),
Thomas Draebing6ff72df2019-12-27 10:58:03 +0100353 'Should navigate to /c/42/1/wheatley.md');
Andrew Bonventre8e375992016-02-25 11:51:15 -0500354 element._path = 'wheatley.md';
355
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800356 MockInteractions.pressAndReleaseKeyOn(element, 219, null, '[');
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700357 assert(diffNavStub.lastCall.calledWithExactly(element._change,
358 'glados.txt', '1', PARENT),
Thomas Draebing6ff72df2019-12-27 10:58:03 +0100359 'Should navigate to /c/42/1/glados.txt');
Andrew Bonventre8e375992016-02-25 11:51:15 -0500360 element._path = 'glados.txt';
361
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800362 MockInteractions.pressAndReleaseKeyOn(element, 219, null, '[');
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700363 assert(diffNavStub.lastCall.calledWithExactly(element._change, 'chell.go',
364 '1', PARENT), 'Should navigate to /c/42/1/chell.go');
Andrew Bonventre8e375992016-02-25 11:51:15 -0500365 element._path = 'chell.go';
366
Andrew Bonventre4d22c7e2016-11-15 17:01:15 -0800367 MockInteractions.pressAndReleaseKeyOn(element, 219, null, '[');
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700368 assert(changeNavStub.lastCall.calledWithExactly(element._change, '1',
369 PARENT), 'Should navigate to /c/42/1');
Andrew Bonventre8e375992016-02-25 11:51:15 -0500370 });
371
Tao Zhou24c6b9a2020-02-27 15:59:39 +0100372 test('edit should redirect to edit page', done => {
373 element._loggedIn = true;
374 element._path = 't.txt';
375 element._patchRange = {
376 basePatchNum: PARENT,
377 patchNum: '1',
378 };
379 element._change = {
380 _number: 42,
Dmitrii Filippov3d73c6a2020-05-06 14:06:27 +0200381 status: 'NEW',
Tao Zhou24c6b9a2020-02-27 15:59:39 +0100382 revisions: {
383 a: {_number: 1, commit: {parents: []}},
384 b: {_number: 2, commit: {parents: []}},
385 },
386 };
387 const redirectStub = sandbox.stub(Gerrit.Nav, 'navigateToRelativeUrl');
388 flush(() => {
389 const editBtn = Polymer.dom(element.root)
390 .querySelector('.editButton gr-button');
391 assert.isTrue(!!editBtn);
392 MockInteractions.tap(editBtn);
393 assert.isTrue(redirectStub.called);
Tao Zhou24c6b9a2020-02-27 15:59:39 +0100394 done();
395 });
396 });
397
Dmitrii Filippov3d73c6a2020-05-06 14:06:27 +0200398 function isEditVisibile({loggedIn, changeStatus}) {
399 return new Promise(resolve => {
400 element._loggedIn = loggedIn;
401 element._path = 't.txt';
402 element._patchRange = {
403 basePatchNum: PARENT,
404 patchNum: '1',
405 };
406 element._change = {
407 _number: 42,
408 status: changeStatus,
409 revisions: {
410 a: {_number: 1, commit: {parents: []}},
411 b: {_number: 2, commit: {parents: []}},
412 },
413 };
414 flush(() => {
415 const editBtn = Polymer.dom(element.root)
416 .querySelector('.editButton gr-button');
417 resolve(!!editBtn);
418 });
Tao Zhou24c6b9a2020-02-27 15:59:39 +0100419 });
Dmitrii Filippov3d73c6a2020-05-06 14:06:27 +0200420 }
421
422 test('edit visible only when logged and status NEW', async () => {
423 for (const changeStatus in element.ChangeStatus) {
424 if (!element.ChangeStatus.hasOwnProperty(changeStatus)) {
425 continue;
426 }
427 assert.isFalse(await isEditVisibile({loggedIn: false, changeStatus}),
428 `loggedIn: false, changeStatus: ${changeStatus}`);
429
430 if (changeStatus !== element.ChangeStatus.NEW) {
431 assert.isFalse(await isEditVisibile({loggedIn: true, changeStatus}),
432 `loggedIn: true, changeStatus: ${changeStatus}`);
433 } else {
434 assert.isTrue(await isEditVisibile({loggedIn: true, changeStatus}),
435 `loggedIn: true, changeStatus: ${changeStatus}`);
436 }
437 }
438 });
439
440 test('edit visible when logged and status NEW', async () => {
441 assert.isTrue(await isEditVisibile(
442 {loggedIn: true, changeStatus: element.ChangeStatus.NEW}));
443 });
444
445 test('edit hidden when logged and status ABANDONED', async () => {
446 assert.isFalse(await isEditVisibile(
447 {loggedIn: true, changeStatus: element.ChangeStatus.ABANDONED}));
448 });
449
450 test('edit hidden when logged and status MERGED', async () => {
451 assert.isFalse(await isEditVisibile(
452 {loggedIn: true, changeStatus: element.ChangeStatus.MERGED}));
Paladox nonece1be9f2020-02-05 14:52:03 +0000453 });
454
Kasper Nilsson52053a42018-11-08 09:28:01 -0800455 suite('diff prefs hidden', () => {
456 test('when no prefs or logged out', () => {
457 element.disableDiffPrefs = false;
458 element._loggedIn = false;
459 flushAsynchronousOperations();
460 assert.isTrue(element.$.diffPrefsContainer.hidden);
Becky Siegel70a82692017-05-08 14:41:57 -0700461
Kasper Nilsson52053a42018-11-08 09:28:01 -0800462 element._loggedIn = true;
463 flushAsynchronousOperations();
464 assert.isTrue(element.$.diffPrefsContainer.hidden);
Becky Siegel70a82692017-05-08 14:41:57 -0700465
Kasper Nilsson52053a42018-11-08 09:28:01 -0800466 element._loggedIn = false;
467 element._prefs = {font_size: '12'};
468 flushAsynchronousOperations();
469 assert.isTrue(element.$.diffPrefsContainer.hidden);
Becky Siegel70a82692017-05-08 14:41:57 -0700470
Kasper Nilsson52053a42018-11-08 09:28:01 -0800471 element._loggedIn = true;
472 flushAsynchronousOperations();
473 assert.isFalse(element.$.diffPrefsContainer.hidden);
474 });
475
476 test('when disableDiffPrefs is set', () => {
477 element._loggedIn = true;
478 element._prefs = {font_size: '12'};
479 element.disableDiffPrefs = false;
480 flushAsynchronousOperations();
481
482 assert.isFalse(element.$.diffPrefsContainer.hidden);
483 element.disableDiffPrefs = true;
484 flushAsynchronousOperations();
485
486 assert.isTrue(element.$.diffPrefsContainer.hidden);
487 });
Becky Siegel70a82692017-05-08 14:41:57 -0700488 });
489
Kasper Nilssonef511942017-05-16 14:38:48 -0700490 test('prefsButton opens gr-diff-preferences', () => {
491 const handlePrefsTapSpy = sandbox.spy(element, '_handlePrefsTap');
Paladox none7a2280c2019-02-19 22:07:54 +0000492 const overlayOpenStub = sandbox.stub(element.$.diffPreferencesDialog,
Becky Siegel70a82692017-05-08 14:41:57 -0700493 'open');
Kasper Nilssonef511942017-05-16 14:38:48 -0700494 const prefsButton =
495 Polymer.dom(element.root).querySelector('.prefsButton');
Becky Siegel70a82692017-05-08 14:41:57 -0700496
497 MockInteractions.tap(prefsButton);
498
499 assert.isTrue(handlePrefsTapSpy.called);
500 assert.isTrue(overlayOpenStub.called);
501 });
502
Becky Siegel5946f952017-11-09 11:53:33 -0800503 test('_computeCommentString', done => {
504 loadCommentSpy = sandbox.spy(element.$.commentAPI, 'loadAll');
505 const path = '/test';
506 element.$.commentAPI.loadAll().then(comments => {
507 const commentCountStub =
508 sandbox.stub(comments, 'computeCommentCount');
509 const unresolvedCountStub =
510 sandbox.stub(comments, 'computeUnresolvedNum');
511 commentCountStub.withArgs(1, path).returns(0);
512 commentCountStub.withArgs(2, path).returns(1);
513 commentCountStub.withArgs(3, path).returns(2);
514 commentCountStub.withArgs(4, path).returns(0);
515 unresolvedCountStub.withArgs(1, path).returns(1);
516 unresolvedCountStub.withArgs(2, path).returns(0);
517 unresolvedCountStub.withArgs(3, path).returns(2);
518 unresolvedCountStub.withArgs(4, path).returns(0);
519
520 assert.equal(element._computeCommentString(comments, 1, path),
521 '1 unresolved');
522 assert.equal(element._computeCommentString(comments, 2, path),
523 '1 comment');
524 assert.equal(element._computeCommentString(comments, 3, path),
525 '2 comments, 2 unresolved');
526 assert.equal(element._computeCommentString(comments, 4, path), '');
527 done();
528 });
529 });
530
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700531 suite('url params', () => {
532 setup(() => {
533 sandbox.stub(Gerrit.Nav, 'getUrlForDiff', (c, p, pn, bpn) => {
534 return `${c._number}-${p}-${pn}-${bpn}`;
535 });
536 sandbox.stub(Gerrit.Nav, 'getUrlForChange', (c, pn, bpn) => {
537 return `${c._number}-${pn}-${bpn}`;
538 });
539 });
Andrew Bonventre8e375992016-02-25 11:51:15 -0500540
Becky Siegelfde2da62017-11-07 15:49:55 -0800541 test('_formattedFiles', () => {
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700542 element._changeNum = '42';
543 element._patchRange = {
544 basePatchNum: PARENT,
545 patchNum: '10',
546 };
547 element._change = {_number: 42};
Becky Siegele53ca1c2017-11-13 16:23:08 -0800548 element._fileList = ['chell.go', 'glados.txt', 'wheatley.md',
549 '/COMMIT_MSG', '/MERGE_LIST'];
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700550 element._path = 'glados.txt';
Becky Siegelfde2da62017-11-07 15:49:55 -0800551 const expectedFormattedFiles = [
552 {
553 text: 'chell.go',
554 mobileText: 'chell.go',
555 value: 'chell.go',
Becky Siegel5946f952017-11-09 11:53:33 -0800556 bottomText: '',
Becky Siegelfde2da62017-11-07 15:49:55 -0800557 }, {
558 text: 'glados.txt',
559 mobileText: 'glados.txt',
560 value: 'glados.txt',
Becky Siegel5946f952017-11-09 11:53:33 -0800561 bottomText: '',
Becky Siegelfde2da62017-11-07 15:49:55 -0800562 }, {
563 text: 'wheatley.md',
564 mobileText: 'wheatley.md',
565 value: 'wheatley.md',
Becky Siegel5946f952017-11-09 11:53:33 -0800566 bottomText: '',
Becky Siegelfde2da62017-11-07 15:49:55 -0800567 },
Becky Siegele53ca1c2017-11-13 16:23:08 -0800568 {
569 text: 'Commit message',
570 mobileText: 'Commit message',
571 value: '/COMMIT_MSG',
Becky Siegel5946f952017-11-09 11:53:33 -0800572 bottomText: '',
Becky Siegele53ca1c2017-11-13 16:23:08 -0800573 },
574 {
575 text: 'Merge list',
576 mobileText: 'Merge list',
577 value: '/MERGE_LIST',
Becky Siegel5946f952017-11-09 11:53:33 -0800578 bottomText: '',
Becky Siegele53ca1c2017-11-13 16:23:08 -0800579 },
Becky Siegelfde2da62017-11-07 15:49:55 -0800580 ];
Andrew Bonventre8e375992016-02-25 11:51:15 -0500581
Becky Siegelfde2da62017-11-07 15:49:55 -0800582 assert.deepEqual(element._formattedFiles, expectedFormattedFiles);
583 assert.equal(element._formattedFiles[1].value, element._path);
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700584 });
Andrew Bonventre8e375992016-02-25 11:51:15 -0500585
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700586 test('prev/up/next links', () => {
587 element._changeNum = '42';
588 element._patchRange = {
589 basePatchNum: PARENT,
590 patchNum: '10',
591 };
592 element._change = {
593 _number: 42,
594 revisions: {
Wyatt Allena744e232017-11-08 15:33:48 -0800595 a: {_number: 10, commit: {parents: []}},
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700596 },
597 };
598 element._fileList = ['chell.go', 'glados.txt', 'wheatley.md'];
599 element._path = 'glados.txt';
600 flushAsynchronousOperations();
601 const linkEls = Polymer.dom(element.root).querySelectorAll('.navLink');
602 assert.equal(linkEls.length, 3);
603 assert.equal(linkEls[0].getAttribute('href'), '42-chell.go-10-PARENT');
604 assert.equal(linkEls[1].getAttribute('href'), '42-undefined-undefined');
605 assert.equal(linkEls[2].getAttribute('href'),
606 '42-wheatley.md-10-PARENT');
607 element._path = 'wheatley.md';
608 flushAsynchronousOperations();
609 assert.equal(linkEls[0].getAttribute('href'),
610 '42-glados.txt-10-PARENT');
611 assert.equal(linkEls[1].getAttribute('href'), '42-undefined-undefined');
612 assert.isFalse(linkEls[2].hasAttribute('href'));
613 element._path = 'chell.go';
614 flushAsynchronousOperations();
615 assert.isFalse(linkEls[0].hasAttribute('href'));
616 assert.equal(linkEls[1].getAttribute('href'), '42-undefined-undefined');
617 assert.equal(linkEls[2].getAttribute('href'),
618 '42-glados.txt-10-PARENT');
619 element._path = 'not_a_real_file';
620 flushAsynchronousOperations();
621 assert.equal(linkEls[0].getAttribute('href'),
622 '42-wheatley.md-10-PARENT');
623 assert.equal(linkEls[1].getAttribute('href'), '42-undefined-undefined');
624 assert.equal(linkEls[2].getAttribute('href'), '42-chell.go-10-PARENT');
625 });
Andrew Bonventre8e375992016-02-25 11:51:15 -0500626
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700627 test('prev/up/next links with patch range', () => {
628 element._changeNum = '42';
629 element._patchRange = {
630 basePatchNum: '5',
631 patchNum: '10',
632 };
633 element._change = {
634 _number: 42,
635 revisions: {
Wyatt Allena744e232017-11-08 15:33:48 -0800636 a: {_number: 5, commit: {parents: []}},
637 b: {_number: 10, commit: {parents: []}},
Wyatt Allenc310f4f2017-07-05 21:26:33 -0700638 },
639 };
640 element._fileList = ['chell.go', 'glados.txt', 'wheatley.md'];
641 element._path = 'glados.txt';
642 flushAsynchronousOperations();
643 const linkEls = Polymer.dom(element.root).querySelectorAll('.navLink');
644 assert.equal(linkEls.length, 3);
645 assert.equal(linkEls[0].getAttribute('href'), '42-chell.go-10-5');
646 assert.equal(linkEls[1].getAttribute('href'), '42-10-5');
647 assert.equal(linkEls[2].getAttribute('href'), '42-wheatley.md-10-5');
648 element._path = 'wheatley.md';
649 flushAsynchronousOperations();
650 assert.equal(linkEls[0].getAttribute('href'), '42-glados.txt-10-5');
651 assert.equal(linkEls[1].getAttribute('href'), '42-10-5');
652 assert.isFalse(linkEls[2].hasAttribute('href'));
653 element._path = 'chell.go';
654 flushAsynchronousOperations();
655 assert.isFalse(linkEls[0].hasAttribute('href'));
656 assert.equal(linkEls[1].getAttribute('href'), '42-10-5');
657 assert.equal(linkEls[2].getAttribute('href'), '42-glados.txt-10-5');
658 });
Andrew Bonventre04e57d62016-09-07 17:34:41 -0400659 });
660
Becky Siegel89fe0502017-09-12 16:54:19 -0700661 test('_handlePatchChange calls navigateToDiff correctly', () => {
Becky Siegel89fe0502017-09-12 16:54:19 -0700662 const navigateStub = sandbox.stub(Gerrit.Nav, 'navigateToDiff');
663 element._change = {_number: 321, project: 'foo/bar'};
664 element._path = 'path/to/file.txt';
Becky Siegelfd7c71f2017-09-26 09:59:33 -0700665
666 element._patchRange = {
667 basePatchNum: 'PARENT',
668 patchNum: '3',
669 };
670
Becky Siegelaf950fd2017-10-12 11:35:18 -0700671 const detail = {
672 basePatchNum: 'PARENT',
673 patchNum: '1',
674 };
Becky Siegelfd7c71f2017-09-26 09:59:33 -0700675
Becky Siegelaf950fd2017-10-12 11:35:18 -0700676 element.$.rangeSelect.dispatchEvent(
677 new CustomEvent('patch-range-change', {detail, bubbles: false}));
Becky Siegel89fe0502017-09-12 16:54:19 -0700678
679 assert(navigateStub.lastCall.calledWithExactly(element._change,
Becky Siegelfd7c71f2017-09-26 09:59:33 -0700680 element._path, '1', 'PARENT'));
Becky Siegel89fe0502017-09-12 16:54:19 -0700681 });
682
Kasper Nilssonf428a232018-02-07 11:37:22 -0800683 test('_prefs.manual_review is respected', () => {
684 const saveReviewedStub = sandbox.stub(element, '_saveReviewedState',
685 () => Promise.resolve());
Kasper Nilsson03809372018-03-12 14:13:24 -0700686 const getReviewedStub = sandbox.stub(element, '_getReviewedStatus',
687 () => Promise.resolve());
Kasper Nilssonf428a232018-02-07 11:37:22 -0800688
Ole Rehmsene5de55e2018-08-23 16:52:57 +0200689 sandbox.stub(element.$.diffHost, 'reload');
Kasper Nilssonf428a232018-02-07 11:37:22 -0800690 element._loggedIn = true;
691 element.params = {
692 view: Gerrit.Nav.View.DIFF,
693 changeNum: '42',
694 patchNum: '2',
695 basePatchNum: '1',
696 path: '/COMMIT_MSG',
697 };
698 element._prefs = {manual_review: true};
699 flushAsynchronousOperations();
700
701 assert.isFalse(saveReviewedStub.called);
Kasper Nilsson03809372018-03-12 14:13:24 -0700702 assert.isTrue(getReviewedStub.called);
703
Kasper Nilssonf428a232018-02-07 11:37:22 -0800704 element._prefs = {};
705 flushAsynchronousOperations();
706
707 assert.isTrue(saveReviewedStub.called);
Kasper Nilsson03809372018-03-12 14:13:24 -0700708 assert.isTrue(getReviewedStub.calledOnce);
Kasper Nilssonf428a232018-02-07 11:37:22 -0800709 });
710
Kasper Nilssonb1e23072018-01-23 10:33:44 -0800711 test('file review status', () => {
Kasper Nilssonef511942017-05-16 14:38:48 -0700712 const saveReviewedStub = sandbox.stub(element, '_saveReviewedState',
713 () => Promise.resolve());
Ole Rehmsene5de55e2018-08-23 16:52:57 +0200714 sandbox.stub(element.$.diffHost, 'reload');
Thomas Shafer88c17972017-06-26 15:13:03 -0700715
716 element._loggedIn = true;
717 element.params = {
Kasper Nilsson3c2e1212017-07-17 14:12:16 -0700718 view: Gerrit.Nav.View.DIFF,
Thomas Shafer88c17972017-06-26 15:13:03 -0700719 changeNum: '42',
720 patchNum: '2',
721 basePatchNum: '1',
722 path: '/COMMIT_MSG',
723 };
Kasper Nilssonf428a232018-02-07 11:37:22 -0800724 element._prefs = {};
Kasper Nilssonb1e23072018-01-23 10:33:44 -0800725 flushAsynchronousOperations();
Urs Wolfer51a70702016-02-10 21:59:20 +0100726
Kasper Nilssonb1e23072018-01-23 10:33:44 -0800727 const commitMsg = Polymer.dom(element.root).querySelector(
728 'input[type="checkbox"]');
Urs Wolfer51a70702016-02-10 21:59:20 +0100729
Kasper Nilssonb1e23072018-01-23 10:33:44 -0800730 assert.isTrue(commitMsg.checked);
731 MockInteractions.tap(commitMsg);
732 assert.isFalse(commitMsg.checked);
733 assert.isTrue(saveReviewedStub.lastCall.calledWithExactly(false));
Urs Wolfer51a70702016-02-10 21:59:20 +0100734
Kasper Nilssonb1e23072018-01-23 10:33:44 -0800735 MockInteractions.tap(commitMsg);
736 assert.isTrue(commitMsg.checked);
737 assert.isTrue(saveReviewedStub.lastCall.calledWithExactly(true));
738 const callCount = saveReviewedStub.callCount;
Urs Wolfer51a70702016-02-10 21:59:20 +0100739
Kasper Nilssonb1e23072018-01-23 10:33:44 -0800740 element.set('params.view', Gerrit.Nav.View.CHANGE);
741 flushAsynchronousOperations();
742
743 // saveReviewedState observer observes params, but should not fire when
744 // view !== Gerrit.Nav.View.DIFF.
745 assert.equal(saveReviewedStub.callCount, callCount);
Urs Wolfer51a70702016-02-10 21:59:20 +0100746 });
Wyatt Allenf93f1c242016-05-05 16:53:38 -0700747
Kasper Nilsson5f1f0c62017-08-08 14:04:54 -0700748 test('file review status with edit loaded', () => {
749 const saveReviewedStub = sandbox.stub(element, '_saveReviewedState');
750
751 element._patchRange = {patchNum: element.EDIT_NAME};
752 flushAsynchronousOperations();
753
Kasper Nilsson808838e2018-01-23 17:15:38 -0800754 assert.isTrue(element._editMode);
Kasper Nilsson5f1f0c62017-08-08 14:04:54 -0700755 element._setReviewed();
756 assert.isFalse(saveReviewedStub.called);
757 });
758
Kasper Nilsson3c2e1212017-07-17 14:12:16 -0700759 test('hash is determined from params', done => {
Ole Rehmsene5de55e2018-08-23 16:52:57 +0200760 sandbox.stub(element.$.diffHost, 'reload');
Wyatt Allenfd6a9472017-08-28 16:42:40 -0700761 sandbox.stub(element, '_initCursor');
Becky Siegel05d12532017-07-18 16:59:04 -0700762
763 element._loggedIn = true;
764 element.params = {
Kasper Nilsson3c2e1212017-07-17 14:12:16 -0700765 view: Gerrit.Nav.View.DIFF,
Becky Siegel05d12532017-07-18 16:59:04 -0700766 changeNum: '42',
767 patchNum: '2',
768 basePatchNum: '1',
769 path: '/COMMIT_MSG',
770 hash: 10,
771 };
772
773 flush(() => {
Wyatt Allenfd6a9472017-08-28 16:42:40 -0700774 assert.isTrue(element._initCursor.calledOnce);
Becky Siegel05d12532017-07-18 16:59:04 -0700775 done();
776 });
777 });
778
Kasper Nilssonef511942017-05-16 14:38:48 -0700779 test('diff mode selector correctly toggles the diff', () => {
780 const select = element.$.modeSelect;
Ole Rehmsene5de55e2018-08-23 16:52:57 +0200781 const diffDisplay = element.$.diffHost;
Becky Siegel76ec5962016-12-09 16:58:31 -0800782 element._userPrefs = {default_diff_view: 'SIDE_BY_SIDE'};
Wyatt Allenf93f1c242016-05-05 16:53:38 -0700783
784 // The mode selected in the view state reflects the selected option.
Wyatt Allenffae7242018-02-14 15:58:17 -0800785 assert.equal(element._getDiffViewMode(), select.mode);
Wyatt Allenf93f1c242016-05-05 16:53:38 -0700786
787 // The mode selected in the view state reflects the view rednered in the
788 // diff.
Wyatt Allenffae7242018-02-14 15:58:17 -0800789 assert.equal(select.mode, diffDisplay.viewMode);
Wyatt Allenf93f1c242016-05-05 16:53:38 -0700790
791 // We will simulate a user change of the selected mode.
Kasper Nilssonef511942017-05-16 14:38:48 -0700792 const newMode = 'UNIFIED_DIFF';
Wyatt Allenffae7242018-02-14 15:58:17 -0800793
794 // Set the mode, and simulate the change event.
795 element.set('changeViewState.diffMode', newMode);
Wyatt Allenf93f1c242016-05-05 16:53:38 -0700796
797 // Make sure the handler was called and the state is still coherent.
Wyatt Allenf93f1c242016-05-05 16:53:38 -0700798 assert.equal(element._getDiffViewMode(), newMode);
Wyatt Allenffae7242018-02-14 15:58:17 -0800799 assert.equal(element._getDiffViewMode(), select.mode);
Wyatt Allenf93f1c242016-05-05 16:53:38 -0700800 assert.equal(element._getDiffViewMode(), diffDisplay.viewMode);
Wyatt Allenf93f1c242016-05-05 16:53:38 -0700801 });
Wyatt Allenbdd4e342016-06-20 14:38:33 -0700802
Kasper Nilssonef511942017-05-16 14:38:48 -0700803 test('diff mode selector initializes from preferences', () => {
804 let resolvePrefs;
805 const prefsPromise = new Promise(resolve => {
Logan Hanks78ad03c2016-08-25 12:35:50 -0700806 resolvePrefs = resolve;
807 });
Kasper Nilssonef511942017-05-16 14:38:48 -0700808 sandbox.stub(element.$.restAPI, 'getPreferences', () => prefsPromise);
Logan Hanks78ad03c2016-08-25 12:35:50 -0700809
810 // Attach a new gr-diff-view so we can intercept the preferences fetch.
Kasper Nilssonef511942017-05-16 14:38:48 -0700811 const view = document.createElement('gr-diff-view');
Logan Hanks78ad03c2016-08-25 12:35:50 -0700812 fixture('blank').appendChild(view);
813 flushAsynchronousOperations();
814
815 // At this point the diff mode doesn't yet have the user's preference.
Wyatt Allenffae7242018-02-14 15:58:17 -0800816 assert.equal(view._getDiffViewMode(), 'SIDE_BY_SIDE');
Logan Hanks78ad03c2016-08-25 12:35:50 -0700817
818 // Receive the overriding preference.
Becky Siegel76ec5962016-12-09 16:58:31 -0800819 resolvePrefs({default_diff_view: 'UNIFIED'});
Logan Hanks78ad03c2016-08-25 12:35:50 -0700820 flushAsynchronousOperations();
Wyatt Allenffae7242018-02-14 15:58:17 -0800821 assert.equal(element._getDiffViewMode(), 'SIDE_BY_SIDE');
Logan Hanks78ad03c2016-08-25 12:35:50 -0700822 });
823
Thomas Shafer849c4462018-02-05 12:05:38 -0800824 suite('_commitRange', () => {
825 setup(() => {
Ole Rehmsene5de55e2018-08-23 16:52:57 +0200826 sandbox.stub(element.$.diffHost, 'reload');
Thomas Shafer849c4462018-02-05 12:05:38 -0800827 sandbox.stub(element, '_initCursor');
828 sandbox.stub(element, '_getChangeDetail').returns(Promise.resolve({
829 _number: 42,
830 revisions: {
831 'commit-sha-1': {
832 _number: 1,
833 commit: {
834 parents: [{commit: 'sha-1-parent'}],
835 },
836 },
837 'commit-sha-2': {_number: 2},
838 'commit-sha-3': {_number: 3},
839 'commit-sha-4': {_number: 4},
840 'commit-sha-5': {
841 _number: 5,
842 commit: {
843 parents: [{commit: 'sha-5-parent'}],
844 },
845 },
846 },
847 }));
848 });
849
850 test('uses the patchNum and basePatchNum ', done => {
851 element.params = {
852 view: Gerrit.Nav.View.DIFF,
853 changeNum: '42',
854 patchNum: '4',
855 basePatchNum: '2',
856 path: '/COMMIT_MSG',
857 };
858 flush(() => {
859 assert.deepEqual(element._commitRange, {
860 baseCommit: 'commit-sha-2',
861 commit: 'commit-sha-4',
862 });
863 done();
864 });
865 });
866
867 test('uses the parent when there is no base patch num ', done => {
868 element.params = {
869 view: Gerrit.Nav.View.DIFF,
870 changeNum: '42',
871 patchNum: '5',
872 path: '/COMMIT_MSG',
873 };
874 flush(() => {
875 assert.deepEqual(element._commitRange, {
876 commit: 'commit-sha-5',
877 baseCommit: 'sha-5-parent',
878 });
879 done();
880 });
881 });
882 });
883
Wyatt Allenfd6a9472017-08-28 16:42:40 -0700884 test('_initCursor', () => {
Wyatt Allenbdd4e342016-06-20 14:38:33 -0700885 assert.isNotOk(element.$.cursor.initialLineNumber);
886
Wyatt Allenfd6a9472017-08-28 16:42:40 -0700887 // Does nothing when params specify no cursor address:
888 element._initCursor({});
Wyatt Allenbdd4e342016-06-20 14:38:33 -0700889 assert.isNotOk(element.$.cursor.initialLineNumber);
890
Wyatt Allenfd6a9472017-08-28 16:42:40 -0700891 // Does nothing when params specify side but no number:
892 element._initCursor({leftSide: true});
Becky Siegel05d12532017-07-18 16:59:04 -0700893 assert.isNotOk(element.$.cursor.initialLineNumber);
894
Wyatt Allenfd6a9472017-08-28 16:42:40 -0700895 // Revision hash: specifies lineNum but not side.
896 element._initCursor({lineNum: 234});
Wyatt Allenbdd4e342016-06-20 14:38:33 -0700897 assert.equal(element.$.cursor.initialLineNumber, 234);
898 assert.equal(element.$.cursor.side, 'right');
899
Wyatt Allenfd6a9472017-08-28 16:42:40 -0700900 // Base hash: specifies lineNum and side.
901 element._initCursor({leftSide: true, lineNum: 345});
Wyatt Allenbdd4e342016-06-20 14:38:33 -0700902 assert.equal(element.$.cursor.initialLineNumber, 345);
903 assert.equal(element.$.cursor.side, 'left');
Wyatt Allen4e1d1b82016-10-19 15:03:18 -0700904
Wyatt Allenfd6a9472017-08-28 16:42:40 -0700905 // Specifies right side:
906 element._initCursor({leftSide: false, lineNum: 123});
Wyatt Allen4e1d1b82016-10-19 15:03:18 -0700907 assert.equal(element.$.cursor.initialLineNumber, 123);
Wyatt Allenfd6a9472017-08-28 16:42:40 -0700908 assert.equal(element.$.cursor.side, 'right');
Wyatt Allenbdd4e342016-06-20 14:38:33 -0700909 });
Kasper Nilsson76aaa8c2016-09-27 15:57:56 -0700910
Wyatt Allene515ff62018-01-19 17:54:50 -0800911 test('_getLineOfInterest', () => {
912 assert.isNull(element._getLineOfInterest({}));
913
914 let result = element._getLineOfInterest({lineNum: 12});
915 assert.equal(result.number, 12);
916 assert.isNotOk(result.leftSide);
917
918 result = element._getLineOfInterest({lineNum: 12, leftSide: true});
919 assert.equal(result.number, 12);
920 assert.isOk(result.leftSide);
921 });
922
Kasper Nilssonef511942017-05-16 14:38:48 -0700923 test('_onLineSelected', () => {
Wyatt Allenaea99742017-08-22 13:37:13 -0700924 const getUrlStub = sandbox.stub(Gerrit.Nav, 'getUrlForDiffById');
Kasper Nilssonef511942017-05-16 14:38:48 -0700925 const replaceStateStub = sandbox.stub(history, 'replaceState');
926 const moveStub = sandbox.stub(element.$.cursor, 'moveToLineNumber');
Wyatt Allenaea99742017-08-22 13:37:13 -0700927 sandbox.stub(element.$.cursor, 'getAddress')
928 .returns({number: 123, isLeftSide: false});
Wyatt Allen43ddaf62016-10-26 17:11:50 -0700929
Wyatt Allenaea99742017-08-22 13:37:13 -0700930 element._changeNum = 321;
931 element._change = {_number: 321, project: 'foo/bar'};
932 element._patchRange = {
933 basePatchNum: '3',
934 patchNum: '5',
935 };
Kasper Nilssonef511942017-05-16 14:38:48 -0700936 const e = {};
937 const detail = {number: 123, side: 'right'};
Wyatt Allen43ddaf62016-10-26 17:11:50 -0700938
939 element._onLineSelected(e, detail);
940
941 assert.isTrue(moveStub.called);
942 assert.equal(moveStub.lastCall.args[0], detail.number);
943 assert.equal(moveStub.lastCall.args[1], detail.side);
944
945 assert.isTrue(replaceStateStub.called);
Wyatt Allenaea99742017-08-22 13:37:13 -0700946 assert.isTrue(getUrlStub.called);
Wyatt Allen43ddaf62016-10-26 17:11:50 -0700947 });
Wyatt Allen20693de2016-11-01 16:11:07 -0700948
Wyatt Allen1bd466a2017-09-15 11:55:35 -0700949 test('_onLineSelected w/o line address', () => {
950 const getUrlStub = sandbox.stub(Gerrit.Nav, 'getUrlForDiffById');
951 sandbox.stub(history, 'replaceState');
952 sandbox.stub(element.$.cursor, 'moveToLineNumber');
953 sandbox.stub(element.$.cursor, 'getAddress').returns(null);
954 element._changeNum = 321;
955 element._change = {_number: 321, project: 'foo/bar'};
956 element._patchRange = {basePatchNum: '3', patchNum: '5'};
957 element._onLineSelected({}, {number: 123, side: 'right'});
958 assert.isTrue(getUrlStub.calledOnce);
959 assert.isUndefined(getUrlStub.lastCall.args[5]);
960 assert.isUndefined(getUrlStub.lastCall.args[6]);
961 });
962
Kasper Nilssonef511942017-05-16 14:38:48 -0700963 test('_getDiffViewMode', () => {
Becky Siegel76ec5962016-12-09 16:58:31 -0800964 // No user prefs or change view state set.
965 assert.equal(element._getDiffViewMode(), 'SIDE_BY_SIDE');
966
967 // User prefs but no change view state set.
968 element._userPrefs = {default_diff_view: 'UNIFIED_DIFF'};
969 assert.equal(element._getDiffViewMode(), 'UNIFIED_DIFF');
970
971 // User prefs and change view state set.
972 element.changeViewState = {diffMode: 'SIDE_BY_SIDE'};
973 assert.equal(element._getDiffViewMode(), 'SIDE_BY_SIDE');
974 });
Wyatt Allen1bc4f2f2017-01-18 17:10:51 -0800975
Logan Hanks5cde0842018-10-05 15:56:10 -0700976 test('_handleToggleDiffMode', () => {
Wyatt Allen61e414c2018-02-06 17:02:17 -0800977 sandbox.stub(element, 'shouldSuppressKeyboardShortcut').returns(false);
978 const e = {preventDefault: () => {}};
979 // Initial state.
980 assert.equal(element._getDiffViewMode(), 'SIDE_BY_SIDE');
981
Logan Hanks5cde0842018-10-05 15:56:10 -0700982 element._handleToggleDiffMode(e);
Wyatt Allen61e414c2018-02-06 17:02:17 -0800983 assert.equal(element._getDiffViewMode(), 'UNIFIED_DIFF');
984
Logan Hanks5cde0842018-10-05 15:56:10 -0700985 element._handleToggleDiffMode(e);
Wyatt Allen61e414c2018-02-06 17:02:17 -0800986 assert.equal(element._getDiffViewMode(), 'SIDE_BY_SIDE');
987 });
988
Wyatt Allendc8782d2017-07-26 09:32:03 -0700989 suite('_loadComments', () => {
Kasper Nilssonef511942017-05-16 14:38:48 -0700990 test('empty', done => {
Wyatt Allendc8782d2017-07-26 09:32:03 -0700991 element._loadComments().then(() => {
992 assert.equal(Object.keys(element._commentMap).length, 0);
Wyatt Allen1bc4f2f2017-01-18 17:10:51 -0800993 done();
994 });
995 });
996
Wyatt Allendc8782d2017-07-26 09:32:03 -0700997 test('has paths', done => {
Becky Siegelc7f07dc2017-11-02 16:07:13 -0700998 sandbox.stub(element, '_getPaths').returns({
999 'path/to/file/one.cpp': [{patch_set: 3, message: 'lorem'}],
1000 'path-to/file/two.py': [{patch_set: 5, message: 'ipsum'}],
Wyatt Allen1bc4f2f2017-01-18 17:10:51 -08001001 });
Becky Siegelc7f07dc2017-11-02 16:07:13 -07001002 sandbox.stub(element, '_getCommentsForPath').returns({meta: {}});
Wyatt Allen1bc4f2f2017-01-18 17:10:51 -08001003 element._changeNum = '42';
1004 element._patchRange = {
1005 basePatchNum: '3',
1006 patchNum: '5',
1007 };
Wyatt Allendc8782d2017-07-26 09:32:03 -07001008 element._loadComments().then(() => {
1009 assert.deepEqual(Object.keys(element._commentMap),
Wyatt Allen1bc4f2f2017-01-18 17:10:51 -08001010 ['path/to/file/one.cpp', 'path-to/file/two.py']);
1011 done();
1012 });
1013 });
Wyatt Allen1bc4f2f2017-01-18 17:10:51 -08001014 });
1015
Kasper Nilssonef511942017-05-16 14:38:48 -07001016 suite('_computeCommentSkips', () => {
1017 test('empty file list', () => {
1018 const commentMap = {
Wyatt Allen1bc4f2f2017-01-18 17:10:51 -08001019 'path/one.jpg': true,
1020 'path/three.wav': true,
1021 };
Kasper Nilssonef511942017-05-16 14:38:48 -07001022 const path = 'path/two.m4v';
1023 const fileList = [];
1024 const result = element._computeCommentSkips(commentMap, fileList, path);
Wyatt Allen1bc4f2f2017-01-18 17:10:51 -08001025 assert.isNull(result.previous);
1026 assert.isNull(result.next);
1027 });
1028
Kasper Nilssonef511942017-05-16 14:38:48 -07001029 test('finds skips', () => {
1030 const fileList = ['path/one.jpg', 'path/two.m4v', 'path/three.wav'];
1031 let path = fileList[1];
1032 const commentMap = {};
Wyatt Allen1bc4f2f2017-01-18 17:10:51 -08001033 commentMap[fileList[0]] = true;
1034 commentMap[fileList[1]] = false;
1035 commentMap[fileList[2]] = true;
1036
Kasper Nilssonef511942017-05-16 14:38:48 -07001037 let result = element._computeCommentSkips(commentMap, fileList, path);
Wyatt Allen1bc4f2f2017-01-18 17:10:51 -08001038 assert.equal(result.previous, fileList[0]);
1039 assert.equal(result.next, fileList[2]);
1040
1041 commentMap[fileList[1]] = true;
1042
1043 result = element._computeCommentSkips(commentMap, fileList, path);
1044 assert.equal(result.previous, fileList[0]);
1045 assert.equal(result.next, fileList[2]);
1046
1047 path = fileList[0];
1048
1049 result = element._computeCommentSkips(commentMap, fileList, path);
1050 assert.isNull(result.previous);
1051 assert.equal(result.next, fileList[1]);
1052
1053 path = fileList[2];
1054
1055 result = element._computeCommentSkips(commentMap, fileList, path);
1056 assert.equal(result.previous, fileList[1]);
1057 assert.isNull(result.next);
1058 });
Wyatt Allen1b3eb9c2018-01-10 15:18:32 -08001059
1060 suite('skip next/previous', () => {
1061 let navToChangeStub;
1062 let navToDiffStub;
1063
1064 setup(() => {
1065 navToChangeStub = sandbox.stub(element, '_navToChangeView');
1066 navToDiffStub = sandbox.stub(Gerrit.Nav, 'navigateToDiff');
1067 element._fileList = [
1068 'path/one.jpg', 'path/two.m4v', 'path/three.wav',
1069 ];
1070 element._patchRange = {patchNum: '2', basePatchNum: '1'};
1071 });
1072
1073 suite('_moveToPreviousFileWithComment', () => {
1074 test('no skips', () => {
1075 element._moveToPreviousFileWithComment();
1076 assert.isFalse(navToChangeStub.called);
1077 assert.isFalse(navToDiffStub.called);
1078 });
1079
1080 test('no previous', () => {
1081 const commentMap = {};
1082 commentMap[element._fileList[0]] = false;
1083 commentMap[element._fileList[1]] = false;
1084 commentMap[element._fileList[2]] = true;
1085 element._commentMap = commentMap;
1086 element._path = element._fileList[1];
1087
1088 element._moveToPreviousFileWithComment();
1089 assert.isTrue(navToChangeStub.calledOnce);
1090 assert.isFalse(navToDiffStub.called);
1091 });
1092
1093 test('w/ previous', () => {
1094 const commentMap = {};
1095 commentMap[element._fileList[0]] = true;
1096 commentMap[element._fileList[1]] = false;
1097 commentMap[element._fileList[2]] = true;
1098 element._commentMap = commentMap;
1099 element._path = element._fileList[1];
1100
1101 element._moveToPreviousFileWithComment();
1102 assert.isFalse(navToChangeStub.called);
1103 assert.isTrue(navToDiffStub.calledOnce);
1104 });
1105 });
1106
1107 suite('_moveToNextFileWithComment', () => {
1108 test('no skips', () => {
1109 element._moveToNextFileWithComment();
1110 assert.isFalse(navToChangeStub.called);
1111 assert.isFalse(navToDiffStub.called);
1112 });
1113
1114 test('no previous', () => {
1115 const commentMap = {};
1116 commentMap[element._fileList[0]] = true;
1117 commentMap[element._fileList[1]] = false;
1118 commentMap[element._fileList[2]] = false;
1119 element._commentMap = commentMap;
1120 element._path = element._fileList[1];
1121
1122 element._moveToNextFileWithComment();
1123 assert.isTrue(navToChangeStub.calledOnce);
1124 assert.isFalse(navToDiffStub.called);
1125 });
1126
1127 test('w/ previous', () => {
1128 const commentMap = {};
1129 commentMap[element._fileList[0]] = true;
1130 commentMap[element._fileList[1]] = false;
1131 commentMap[element._fileList[2]] = true;
1132 element._commentMap = commentMap;
1133 element._path = element._fileList[1];
1134
1135 element._moveToNextFileWithComment();
1136 assert.isFalse(navToChangeStub.called);
1137 assert.isTrue(navToDiffStub.calledOnce);
1138 });
1139 });
1140 });
Wyatt Allen1bc4f2f2017-01-18 17:10:51 -08001141 });
Kasper Nilssonf89608d2017-07-24 15:06:07 -07001142
Kasper Nilsson808838e2018-01-23 17:15:38 -08001143 test('_computeEditMode', () => {
1144 const callCompute = range => element._computeEditMode({base: range});
Kasper Nilsson5f1f0c62017-08-08 14:04:54 -07001145 assert.isFalse(callCompute({}));
1146 assert.isFalse(callCompute({basePatchNum: 'PARENT', patchNum: 1}));
1147 assert.isFalse(callCompute({basePatchNum: 'edit', patchNum: 1}));
1148 assert.isTrue(callCompute({basePatchNum: 1, patchNum: 'edit'}));
1149 });
1150
Viktar Donichc5069b12018-01-30 16:17:13 -08001151 test('_computeFileNum', () => {
1152 assert.equal(element._computeFileNum('/foo',
1153 [{value: '/foo'}, {value: '/bar'}]), 1);
1154 assert.equal(element._computeFileNum('/bar',
1155 [{value: '/foo'}, {value: '/bar'}]), 2);
1156 });
1157
Wyatt Allen54ce5dc2018-03-06 11:27:36 -08001158 test('_computeFileNumClass', () => {
1159 assert.equal(element._computeFileNumClass(0, []), '');
1160 assert.equal(element._computeFileNumClass(1,
1161 [{value: '/foo'}, {value: '/bar'}]), 'show');
Viktar Donichc5069b12018-01-30 16:17:13 -08001162 });
1163
Kasper Nilsson03809372018-03-12 14:13:24 -07001164 test('_getReviewedStatus', () => {
1165 const promises = [];
1166 element.$.restAPI.getReviewedFiles.restore();
1167
1168 sandbox.stub(element.$.restAPI, 'getReviewedFiles')
1169 .returns(Promise.resolve(['path']));
1170
1171 promises.push(element._getReviewedStatus(true, null, null, 'path')
1172 .then(reviewed => assert.isFalse(reviewed)));
1173
1174 promises.push(element._getReviewedStatus(false, null, null, 'otherPath')
1175 .then(reviewed => assert.isFalse(reviewed)));
1176
1177 promises.push(element._getReviewedStatus(false, null, null, 'path')
1178 .then(reviewed => assert.isTrue(reviewed)));
1179
1180 return Promise.all(promises);
1181 });
1182
Kasper Nilsson808838e2018-01-23 17:15:38 -08001183 suite('editMode behavior', () => {
Kasper Nilsson5f1f0c62017-08-08 14:04:54 -07001184 setup(() => {
1185 element._loggedIn = true;
1186 });
1187
1188 const isVisible = el => {
1189 assert.ok(el);
1190 return getComputedStyle(el).getPropertyValue('display') !== 'none';
1191 };
1192
1193 test('reviewed checkbox', () => {
Becky Siegelfd7c71f2017-09-26 09:59:33 -07001194 sandbox.stub(element, '_handlePatchChange');
Kasper Nilsson5f1f0c62017-08-08 14:04:54 -07001195 element._patchRange = {patchNum: '1'};
1196 // Reviewed checkbox should be shown.
1197 assert.isTrue(isVisible(element.$.reviewed));
1198 element.set('_patchRange.patchNum', element.EDIT_NAME);
1199 flushAsynchronousOperations();
1200
1201 assert.isFalse(isVisible(element.$.reviewed));
1202 });
1203 });
Kasper Nilsson34a5d892018-04-11 11:10:53 -07001204
1205 test('_paramsChanged sets in projectLookup', () => {
1206 sandbox.stub(element, '_getLineOfInterest');
1207 sandbox.stub(element, '_initCursor');
1208 const setStub = sandbox.stub(element.$.restAPI, 'setInProjectLookup');
1209 element._paramsChanged({
1210 view: Gerrit.Nav.View.DIFF,
1211 changeNum: 101,
1212 project: 'test-project',
1213 path: '',
1214 });
1215 assert.isTrue(setStub.calledOnce);
1216 assert.isTrue(setStub.calledWith(101, 'test-project'));
1217 });
Kasper Nilsson30d54102018-11-12 10:55:29 -08001218
1219 test('shift+m navigates to next unreviewed file', () => {
1220 element._fileList = ['file1', 'file2', 'file3'];
1221 element._reviewedFiles = new Set(['file1', 'file2']);
1222 element._path = 'file1';
1223 const reviewedStub = sandbox.stub(element, '_setReviewed');
1224 const navStub = sandbox.stub(element, '_navToFile');
1225 MockInteractions.pressAndReleaseKeyOn(element, 77, 'shift', 'm');
1226 flushAsynchronousOperations();
1227
1228 assert.isTrue(reviewedStub.lastCall.args[0]);
1229 assert.deepEqual(navStub.lastCall.args, [
1230 'file1',
1231 ['file1', 'file3'],
1232 1,
1233 ]);
1234 });
Paladox none45913eb2019-09-25 20:15:42 +00001235
1236 test('_computeDownloadDropdownLinks', () => {
1237 const downloadLinks = [
1238 {
1239 url: '/changes/test~12/revisions/1/patch?zip&path=index.php',
1240 name: 'Patch',
1241 },
1242 {
1243 url: '/changes/test~12/revisions/1' +
1244 '/files/index.php/download?parent=1',
1245 name: 'Left Content',
1246 },
1247 {
1248 url: '/changes/test~12/revisions/1' +
Paladox noneb55da6e2019-10-06 13:33:54 +00001249 '/files/index.php/download',
Paladox none45913eb2019-09-25 20:15:42 +00001250 name: 'Right Content',
1251 },
1252 ];
Paladox noneb55da6e2019-10-06 13:33:54 +00001253
1254 const side = {
1255 meta_a: true,
1256 meta_b: true,
1257 };
1258
1259 const base = {
1260 patchNum: 1,
1261 basePatchNum: 'PARENT',
1262 };
1263
Paladox none45913eb2019-09-25 20:15:42 +00001264 assert.deepEqual(
1265 element._computeDownloadDropdownLinks(
Paladox noneb55da6e2019-10-06 13:33:54 +00001266 'test', 12, base, 'index.php', side),
1267 downloadLinks);
1268 });
1269
1270 test('_computeDownloadDropdownLinks diff returns renamed', () => {
1271 const downloadLinks = [
1272 {
1273 url: '/changes/test~12/revisions/3/patch?zip&path=index.php',
1274 name: 'Patch',
1275 },
1276 {
1277 url: '/changes/test~12/revisions/2' +
1278 '/files/index2.php/download',
1279 name: 'Left Content',
1280 },
1281 {
1282 url: '/changes/test~12/revisions/3' +
1283 '/files/index.php/download',
1284 name: 'Right Content',
1285 },
1286 ];
1287
1288 const side = {
1289 change_type: 'RENAMED',
1290 meta_a: {
1291 name: 'index2.php',
1292 },
1293 meta_b: true,
1294 };
1295
1296 const base = {
1297 patchNum: 3,
1298 basePatchNum: 2,
1299 };
1300
1301 assert.deepEqual(
1302 element._computeDownloadDropdownLinks(
1303 'test', 12, base, 'index.php', side),
Paladox none45913eb2019-09-25 20:15:42 +00001304 downloadLinks);
1305 });
1306
1307 test('_computeDownloadFileLink', () => {
Paladox noneb55da6e2019-10-06 13:33:54 +00001308 const base = {
1309 patchNum: 1,
1310 basePatchNum: 'PARENT',
1311 };
1312
Paladox none45913eb2019-09-25 20:15:42 +00001313 assert.equal(
1314 element._computeDownloadFileLink(
Paladox noneb55da6e2019-10-06 13:33:54 +00001315 'test', 12, base, 'index.php', true),
Paladox none45913eb2019-09-25 20:15:42 +00001316 '/changes/test~12/revisions/1/files/index.php/download?parent=1');
1317
1318 assert.equal(
1319 element._computeDownloadFileLink(
Paladox noneb55da6e2019-10-06 13:33:54 +00001320 'test', 12, base, 'index.php', false),
1321 '/changes/test~12/revisions/1/files/index.php/download');
Paladox none45913eb2019-09-25 20:15:42 +00001322 });
1323
1324 test('_computeDownloadPatchLink', () => {
1325 assert.equal(
1326 element._computeDownloadPatchLink(
1327 'test', 12, {patchNum: 1}, 'index.php'),
1328 '/changes/test~12/revisions/1/patch?zip&path=index.php');
1329 });
Andrew Bonventreab0f6a82015-11-14 15:40:47 -05001330 });
1331</script>