blob: ce454248c205a3f30ad02e6809575e16a28ab500 [file] [log] [blame]
Dmitrii Filippovacd39a22020-04-02 10:31:43 +02001/**
2 * @license
3 * Copyright (C) 2015 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
Andrew Bonventre547b8ab2015-12-01 01:02:00 -050017
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010018import '../../../test/common-test-setup-karma';
19import '../../edit/gr-edit-constants';
Dhruv Srivastavab213a1f2021-11-19 14:45:40 +010020import '../gr-thread-list/gr-thread-list';
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010021import './gr-change-view';
Dmitrii Filippov0695d402020-10-22 16:57:57 +020022import {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010023 ChangeStatus,
24 CommentSide,
25 DefaultBase,
26 DiffViewMode,
27 HttpMethod,
Dhruv Srivastava69a51732021-04-14 18:23:00 +020028 MessageTag,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010029 PrimaryTab,
Dhruv Srivastava80d34f42021-10-18 16:45:02 +020030 createDefaultPreferences,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010031} from '../../../constants/constants';
32import {GrEditConstants} from '../../edit/gr-edit-constants';
33import {_testOnly_resetEndpoints} from '../../shared/gr-js-api-interface/gr-plugin-endpoints';
Ben Rohlfsebe4acc2020-12-11 21:16:10 +010034import {GerritNav} from '../../core/gr-navigation/gr-navigation';
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010035import {getPluginLoader} from '../../shared/gr-js-api-interface/gr-plugin-loader';
Ben Rohlfsa7ab9502021-02-15 17:45:45 +010036import {EventType, PluginApi} from '../../../api/plugin';
Ben Rohlfs00049652021-10-25 16:40:38 +020037import {
38 mockPromise,
39 queryAndAssert,
40 stubRestApi,
41 stubUsers,
42 waitQueryAndAssert,
43 waitUntil,
44} from '../../../test/test-utils';
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010045import {
46 createAppElementChangeViewParams,
47 createApproval,
Dmitrii Filippov0695d402020-10-22 16:57:57 +020048 createChange,
49 createChangeMessages,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010050 createCommit,
51 createMergeable,
52 createPreferences,
53 createRevision,
Dmitrii Filippov0695d402020-10-22 16:57:57 +020054 createRevisions,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010055 createServerInfo,
56 createUserConfig,
57 TEST_NUMERIC_CHANGE_ID,
58 TEST_PROJECT_NAME,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010059 createEditRevision,
60 createAccountWithIdNameAndEmail,
Dhruv Srivastavada276592021-04-07 14:51:51 +020061 createChangeViewChange,
Milutin Kristofice9ddfa42021-04-20 23:34:45 +020062 createRelatedChangeAndCommitInfo,
Dhruv Srivastava8e1e2b22021-09-30 12:17:55 +010063 createAccountDetailWithId,
Ben Rohlfsa16c51a2021-11-22 12:50:55 +010064 createParsedChange,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010065} from '../../../test/test-data-generators';
66import {ChangeViewPatchRange, GrChangeView} from './gr-change-view';
67import {
68 AccountId,
69 ApprovalInfo,
Dhruv Srivastava591b4902021-03-10 11:48:12 +010070 BasePatchSetNum,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010071 ChangeId,
72 ChangeInfo,
73 CommitId,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010074 EditPatchSetNum,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010075 NumericChangeId,
76 ParentPatchSetNum,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010077 PatchRange,
78 PatchSetNum,
Milutin Kristofice9ddfa42021-04-20 23:34:45 +020079 RelatedChangeAndCommitInfo,
Dhruv Srivastava69a51732021-04-14 18:23:00 +020080 ReviewInputTag,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010081 RevisionInfo,
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +010082 RevisionPatchSetNum,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010083 RobotId,
Ben Rohlfs05750b92021-10-29 08:23:08 +020084 RobotCommentInfo,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +010085 Timestamp,
86 UrlEncodedCommentId,
87} from '../../../types/common';
88import {
89 pressAndReleaseKeyOn,
90 tap,
91} from '@polymer/iron-test-helpers/mock-interactions';
92import {GrEditControls} from '../../edit/gr-edit-controls/gr-edit-controls';
93import {AppElementChangeViewParams} from '../../gr-app-types';
Ben Rohlfs8e28ad82021-09-20 14:48:33 +020094import {SinonFakeTimers, SinonStubbedMember} from 'sinon';
Ben Rohlfsa9d2cff2021-01-22 21:33:58 +010095import {RestApiService} from '../../../services/gr-rest-api/gr-rest-api';
Ben Rohlfs05750b92021-10-29 08:23:08 +020096import {CommentThread} from '../../../utils/comment-util';
Ben Rohlfsebe4acc2020-12-11 21:16:10 +010097import {GerritView} from '../../../services/router/router-model';
Ben Rohlfsa00ef282021-01-22 21:45:53 +010098import {ParsedChangeInfo} from '../../../types/types';
Milutin Kristofic8803ea02020-12-09 23:34:39 +010099import {GrRelatedChangesList} from '../gr-related-changes-list/gr-related-changes-list';
Dhruv Srivastava69a51732021-04-14 18:23:00 +0200100import {ChangeStates} from '../../shared/gr-change-status/gr-change-status';
Chris Poucetbf65b8f2022-01-18 21:18:12 +0000101import {LoadingStatus} from '../../../models/change/change-model';
Ben Rohlfs00049652021-10-25 16:40:38 +0200102import {FocusTarget, GrReplyDialog} from '../gr-reply-dialog/gr-reply-dialog';
103import {GrOverlay} from '../../shared/gr-overlay/gr-overlay';
Paladox none70efbef2021-08-12 05:21:59 +0000104import {GrChangeStar} from '../../shared/gr-change-star/gr-change-star';
Dhruv Srivastavab213a1f2021-11-19 14:45:40 +0100105import {GrThreadList} from '../gr-thread-list/gr-thread-list';
Chris Poucetdd2d0102022-05-13 14:09:39 +0200106import {assertIsDefined} from '../../../utils/common-util';
Dmitrii Filippovacd39a22020-04-02 10:31:43 +0200107
Dmitrii Filippovacd39a22020-04-02 10:31:43 +0200108const fixture = fixtureFromElement('gr-change-view');
Dmitrii Filippov0028b582020-03-24 11:58:55 +0100109
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100110suite('gr-change-view tests', () => {
111 let element: GrChangeView;
112
Frank Borden6988bdf2021-04-07 14:42:00 +0200113 let navigateToChangeStub: SinonStubbedMember<
114 typeof GerritNav.navigateToChange
115 >;
Dmitrii Filippov06117e82020-06-25 13:26:55 +0200116
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100117 const ROBOT_COMMENTS_LIMIT = 10;
118
Tao Zhou18738b92020-05-04 19:44:51 +0200119 // TODO: should have a mock service to generate VALID fake data
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100120 const THREADS: CommentThread[] = [
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100121 {
122 comments: [
123 {
Dhruv Srivastava3dfaf362020-12-01 21:53:59 +0100124 path: '/COMMIT_MSG',
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100125 author: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100126 _account_id: 1000000 as AccountId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100127 name: 'user',
128 username: 'user',
129 },
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100130 patch_set: 2 as PatchSetNum,
131 robot_id: 'rb1' as RobotId,
132 id: 'ecf0b9fa_fe1a5f62' as UrlEncodedCommentId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100133 line: 5,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100134 updated: '2018-02-08 18:49:18.000000000' as Timestamp,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100135 message: 'test',
136 unresolved: true,
137 },
138 {
Dhruv Srivastava3dfaf362020-12-01 21:53:59 +0100139 path: '/COMMIT_MSG',
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100140 author: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100141 _account_id: 1000000 as AccountId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100142 name: 'user',
143 username: 'user',
144 },
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100145 patch_set: 4 as PatchSetNum,
146 id: 'ecf0b9fa_fe1a5f62_1' as UrlEncodedCommentId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100147 line: 5,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100148 updated: '2018-02-08 18:49:18.000000000' as Timestamp,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100149 message: 'test',
150 unresolved: true,
151 },
152 {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100153 id: '503008e2_0ab203ee' as UrlEncodedCommentId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100154 path: '/COMMIT_MSG',
155 line: 5,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100156 in_reply_to: 'ecf0b9fa_fe1a5f62' as UrlEncodedCommentId,
157 updated: '2018-02-13 22:48:48.018000000' as Timestamp,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100158 message: 'draft',
159 unresolved: false,
160 __draft: true,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100161 patch_set: 2 as PatchSetNum,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100162 },
163 ],
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +0100164 patchNum: 4 as RevisionPatchSetNum,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100165 path: '/COMMIT_MSG',
166 line: 5,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100167 rootId: 'ecf0b9fa_fe1a5f62' as UrlEncodedCommentId,
Dhruv Srivastava794db3a2020-11-11 11:28:08 +0100168 commentSide: CommentSide.REVISION,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100169 },
170 {
171 comments: [
172 {
Dhruv Srivastava3dfaf362020-12-01 21:53:59 +0100173 path: '/COMMIT_MSG',
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100174 author: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100175 _account_id: 1000000 as AccountId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100176 name: 'user',
177 username: 'user',
178 },
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100179 patch_set: 3 as PatchSetNum,
180 id: 'ecf0b9fa_fe5f62' as UrlEncodedCommentId,
181 robot_id: 'rb2' as RobotId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100182 line: 5,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100183 updated: '2018-02-08 18:49:18.000000000' as Timestamp,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100184 message: 'test',
185 unresolved: true,
186 },
187 {
Dhruv Srivastava3dfaf362020-12-01 21:53:59 +0100188 path: 'test.txt',
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100189 author: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100190 _account_id: 1000000 as AccountId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100191 name: 'user',
192 username: 'user',
193 },
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100194 patch_set: 3 as PatchSetNum,
195 id: '09a9fb0a_1484e6cf' as UrlEncodedCommentId,
196 side: CommentSide.PARENT,
197 updated: '2018-02-13 22:47:19.000000000' as Timestamp,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100198 message: 'Some comment on another patchset.',
199 unresolved: false,
200 },
201 ],
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100202 patchNum: 3 as PatchSetNum,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100203 path: 'test.txt',
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100204 rootId: '09a9fb0a_1484e6cf' as UrlEncodedCommentId,
205 commentSide: CommentSide.PARENT,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100206 },
207 {
208 comments: [
209 {
Dhruv Srivastava3dfaf362020-12-01 21:53:59 +0100210 path: '/COMMIT_MSG',
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100211 author: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100212 _account_id: 1000000 as AccountId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100213 name: 'user',
214 username: 'user',
215 },
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100216 patch_set: 2 as PatchSetNum,
217 id: '8caddf38_44770ec1' as UrlEncodedCommentId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100218 line: 4,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100219 updated: '2018-02-13 22:48:40.000000000' as Timestamp,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100220 message: 'Another unresolved comment',
221 unresolved: true,
222 },
223 ],
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +0100224 patchNum: 2 as RevisionPatchSetNum,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100225 path: '/COMMIT_MSG',
226 line: 4,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100227 rootId: '8caddf38_44770ec1' as UrlEncodedCommentId,
Dhruv Srivastava794db3a2020-11-11 11:28:08 +0100228 commentSide: CommentSide.REVISION,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100229 },
230 {
231 comments: [
232 {
Dhruv Srivastava3dfaf362020-12-01 21:53:59 +0100233 path: '/COMMIT_MSG',
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100234 author: {
Ben Rohlfs3f279682022-02-25 12:07:27 +0100235 // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100236 _account_id: 1000000 as AccountId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100237 name: 'user',
238 username: 'user',
239 },
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100240 patch_set: 2 as PatchSetNum,
241 id: 'scaddf38_44770ec1' as UrlEncodedCommentId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100242 line: 4,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100243 updated: '2018-02-14 22:48:40.000000000' as Timestamp,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100244 message: 'Yet another unresolved comment',
245 unresolved: true,
246 },
247 ],
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +0100248 patchNum: 2 as RevisionPatchSetNum,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100249 path: '/COMMIT_MSG',
250 line: 4,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100251 rootId: 'scaddf38_44770ec1' as UrlEncodedCommentId,
Dhruv Srivastava794db3a2020-11-11 11:28:08 +0100252 commentSide: CommentSide.REVISION,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100253 },
254 {
255 comments: [
256 {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100257 id: 'zcf0b9fa_fe1a5f62' as UrlEncodedCommentId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100258 path: '/COMMIT_MSG',
259 line: 6,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100260 updated: '2018-02-15 22:48:48.018000000' as Timestamp,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100261 message: 'resolved draft',
262 unresolved: false,
263 __draft: true,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100264 patch_set: 2 as PatchSetNum,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100265 },
266 ],
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +0100267 patchNum: 4 as RevisionPatchSetNum,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100268 path: '/COMMIT_MSG',
269 line: 6,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100270 rootId: 'zcf0b9fa_fe1a5f62' as UrlEncodedCommentId,
Dhruv Srivastava794db3a2020-11-11 11:28:08 +0100271 commentSide: CommentSide.REVISION,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100272 },
273 {
274 comments: [
275 {
Dhruv Srivastava3dfaf362020-12-01 21:53:59 +0100276 path: '/COMMIT_MSG',
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100277 author: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100278 _account_id: 1000000 as AccountId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100279 name: 'user',
280 username: 'user',
281 },
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100282 patch_set: 4 as PatchSetNum,
283 id: 'rc1' as UrlEncodedCommentId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100284 line: 5,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100285 updated: '2019-02-08 18:49:18.000000000' as Timestamp,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100286 message: 'test',
287 unresolved: true,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100288 robot_id: 'rc1' as RobotId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100289 },
290 ],
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +0100291 patchNum: 4 as RevisionPatchSetNum,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100292 path: '/COMMIT_MSG',
293 line: 5,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100294 rootId: 'rc1' as UrlEncodedCommentId,
Dhruv Srivastava794db3a2020-11-11 11:28:08 +0100295 commentSide: CommentSide.REVISION,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100296 },
297 {
298 comments: [
299 {
Dhruv Srivastava3dfaf362020-12-01 21:53:59 +0100300 path: '/COMMIT_MSG',
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100301 author: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100302 _account_id: 1000000 as AccountId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100303 name: 'user',
304 username: 'user',
305 },
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100306 patch_set: 4 as PatchSetNum,
307 id: 'rc2' as UrlEncodedCommentId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100308 line: 5,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100309 updated: '2019-03-08 18:49:18.000000000' as Timestamp,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100310 message: 'test',
311 unresolved: true,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100312 robot_id: 'rc2' as RobotId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100313 },
314 {
Dhruv Srivastava3dfaf362020-12-01 21:53:59 +0100315 path: '/COMMIT_MSG',
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100316 author: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100317 _account_id: 1000000 as AccountId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100318 name: 'user',
319 username: 'user',
320 },
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100321 patch_set: 4 as PatchSetNum,
322 id: 'c2_1' as UrlEncodedCommentId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100323 line: 5,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100324 updated: '2019-03-08 18:49:18.000000000' as Timestamp,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100325 message: 'test',
326 unresolved: true,
327 },
328 ],
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +0100329 patchNum: 4 as RevisionPatchSetNum,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100330 path: '/COMMIT_MSG',
331 line: 5,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100332 rootId: 'rc2' as UrlEncodedCommentId,
Dhruv Srivastava794db3a2020-11-11 11:28:08 +0100333 commentSide: CommentSide.REVISION,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100334 },
335 ];
336
337 setup(() => {
Dmitrii Filippovf97fc6e2020-04-07 09:59:22 +0200338 // Since pluginEndpoints are global, must reset state.
339 _testOnly_resetEndpoints();
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +0200340 navigateToChangeStub = sinon.stub(GerritNav, 'navigateToChange');
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100341
Ben Rohlfs3a6ff7e2021-01-18 14:08:39 +0100342 stubRestApi('getConfig').returns(
343 Promise.resolve({
344 ...createServerInfo(),
345 user: {
346 ...createUserConfig(),
347 anonymous_coward_name: 'test coward name',
348 },
349 })
350 );
Dhruv Srivastava8e1e2b22021-09-30 12:17:55 +0100351 stubRestApi('getAccount').returns(
352 Promise.resolve(createAccountDetailWithId(5))
353 );
Ben Rohlfs3a6ff7e2021-01-18 14:08:39 +0100354 stubRestApi('getDiffComments').returns(Promise.resolve({}));
355 stubRestApi('getDiffRobotComments').returns(Promise.resolve({}));
356 stubRestApi('getDiffDrafts').returns(Promise.resolve({}));
Dmitrii Filippovacd39a22020-04-02 10:31:43 +0200357 element = fixture.instantiate();
Ben Rohlfsa5356e92021-05-07 11:06:17 +0200358 element._changeNum = TEST_NUMERIC_CHANGE_ID;
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +0200359 sinon.stub(element.$.actions, 'reload').returns(Promise.resolve());
Dhruv Srivastava12e2c992020-09-01 16:40:21 +0200360 getPluginLoader().loadPlugins([]);
Chris Poucetd3f52fd2021-11-29 23:16:39 +0100361 window.Gerrit.install(
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100362 plugin => {
363 plugin.registerDynamicCustomComponent(
364 'change-view-tab-header',
365 'gr-checks-change-view-tab-header-view'
366 );
367 plugin.registerDynamicCustomComponent(
368 'change-view-tab-content',
369 'gr-checks-view'
370 );
371 },
372 '0.1',
Ben Rohlfsef1dd592021-03-09 10:58:29 +0100373 'http://some/plugins/url.js'
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100374 );
375 });
376
Chris Pouceta2e173e2021-08-31 01:04:04 +0000377 teardown(async () => {
378 await flush();
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100379 });
380
Dhruv Srivastava163de6f2020-06-04 09:40:28 +0000381 test('_handleMessageAnchorTap', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100382 element._changeNum = 1 as NumericChangeId;
Dhruv Srivastava163de6f2020-06-04 09:40:28 +0000383 element._patchRange = {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100384 basePatchNum: ParentPatchSetNum,
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +0100385 patchNum: 1 as RevisionPatchSetNum,
Dhruv Srivastava163de6f2020-06-04 09:40:28 +0000386 };
Dhruv Srivastavada276592021-04-07 14:51:51 +0200387 element._change = createChangeViewChange();
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +0200388 const getUrlStub = sinon.stub(GerritNav, 'getUrlForChange');
389 const replaceStateStub = sinon.stub(history, 'replaceState');
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100390 element._handleMessageAnchorTap(
391 new CustomEvent('message-anchor-tap', {detail: {id: 'a12345'}})
392 );
Dhruv Srivastava163de6f2020-06-04 09:40:28 +0000393
Dhruv Srivastavac9d12bc2021-11-12 11:32:40 +0100394 assert.equal(getUrlStub.lastCall.args[1]!.messageHash, '#message-a12345');
Dhruv Srivastava163de6f2020-06-04 09:40:28 +0000395 assert.isTrue(replaceStateStub.called);
396 });
397
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200398 test('_handleDiffAgainstBase', () => {
Dmitrii Filippov0695d402020-10-22 16:57:57 +0200399 element._change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +0200400 ...createChangeViewChange(),
Dmitrii Filippov0695d402020-10-22 16:57:57 +0200401 revisions: createRevisions(10),
402 };
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200403 element._patchRange = {
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +0100404 patchNum: 3 as RevisionPatchSetNum,
Dhruv Srivastava591b4902021-03-10 11:48:12 +0100405 basePatchNum: 1 as BasePatchSetNum,
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200406 };
Ben Rohlfs410f5222021-10-19 23:44:02 +0200407 element._handleDiffAgainstBase();
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200408 assert(navigateToChangeStub.called);
409 const args = navigateToChangeStub.getCall(0).args;
Dmitrii Filippov77e5f7f2020-07-10 18:39:45 +0200410 assert.equal(args[0], element._change);
Dhruv Srivastava0633ae12021-11-11 15:16:47 +0100411 assert.equal(args[1]!.patchNum, 3 as PatchSetNum);
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200412 });
413
414 test('_handleDiffAgainstLatest', () => {
Dmitrii Filippov0695d402020-10-22 16:57:57 +0200415 element._change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +0200416 ...createChangeViewChange(),
Dmitrii Filippov0695d402020-10-22 16:57:57 +0200417 revisions: createRevisions(10),
418 };
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200419 element._patchRange = {
Dhruv Srivastava591b4902021-03-10 11:48:12 +0100420 basePatchNum: 1 as BasePatchSetNum,
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +0100421 patchNum: 3 as RevisionPatchSetNum,
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200422 };
Ben Rohlfs410f5222021-10-19 23:44:02 +0200423 element._handleDiffAgainstLatest();
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200424 assert(navigateToChangeStub.called);
425 const args = navigateToChangeStub.getCall(0).args;
Dmitrii Filippov77e5f7f2020-07-10 18:39:45 +0200426 assert.equal(args[0], element._change);
Dhruv Srivastava0633ae12021-11-11 15:16:47 +0100427 assert.equal(args[1]!.patchNum, 10 as PatchSetNum);
428 assert.equal(args[1]!.basePatchNum, 1 as BasePatchSetNum);
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200429 });
430
431 test('_handleDiffBaseAgainstLeft', () => {
Dmitrii Filippov0695d402020-10-22 16:57:57 +0200432 element._change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +0200433 ...createChangeViewChange(),
Dmitrii Filippov0695d402020-10-22 16:57:57 +0200434 revisions: createRevisions(10),
435 };
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200436 element._patchRange = {
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +0100437 patchNum: 3 as RevisionPatchSetNum,
Dhruv Srivastava591b4902021-03-10 11:48:12 +0100438 basePatchNum: 1 as BasePatchSetNum,
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200439 };
Ben Rohlfs410f5222021-10-19 23:44:02 +0200440 element._handleDiffBaseAgainstLeft();
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200441 assert(navigateToChangeStub.called);
442 const args = navigateToChangeStub.getCall(0).args;
Dmitrii Filippov77e5f7f2020-07-10 18:39:45 +0200443 assert.equal(args[0], element._change);
Dhruv Srivastava0633ae12021-11-11 15:16:47 +0100444 assert.equal(args[1]!.patchNum, 1 as PatchSetNum);
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200445 });
446
447 test('_handleDiffRightAgainstLatest', () => {
Dmitrii Filippov0695d402020-10-22 16:57:57 +0200448 element._change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +0200449 ...createChangeViewChange(),
Dmitrii Filippov0695d402020-10-22 16:57:57 +0200450 revisions: createRevisions(10),
451 };
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200452 element._patchRange = {
Dhruv Srivastava591b4902021-03-10 11:48:12 +0100453 basePatchNum: 1 as BasePatchSetNum,
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +0100454 patchNum: 3 as RevisionPatchSetNum,
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200455 };
Ben Rohlfs410f5222021-10-19 23:44:02 +0200456 element._handleDiffRightAgainstLatest();
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200457 assert(navigateToChangeStub.called);
458 const args = navigateToChangeStub.getCall(0).args;
Dhruv Srivastava0633ae12021-11-11 15:16:47 +0100459 assert.equal(args[1]!.patchNum, 10 as PatchSetNum);
460 assert.equal(args[1]!.basePatchNum, 3 as BasePatchSetNum);
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200461 });
462
463 test('_handleDiffBaseAgainstLatest', () => {
Dmitrii Filippov0695d402020-10-22 16:57:57 +0200464 element._change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +0200465 ...createChangeViewChange(),
Dmitrii Filippov0695d402020-10-22 16:57:57 +0200466 revisions: createRevisions(10),
467 };
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200468 element._patchRange = {
Dhruv Srivastava591b4902021-03-10 11:48:12 +0100469 basePatchNum: 1 as BasePatchSetNum,
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +0100470 patchNum: 3 as RevisionPatchSetNum,
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200471 };
Ben Rohlfs410f5222021-10-19 23:44:02 +0200472 element._handleDiffBaseAgainstLatest();
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200473 assert(navigateToChangeStub.called);
474 const args = navigateToChangeStub.getCall(0).args;
Dhruv Srivastava0633ae12021-11-11 15:16:47 +0100475 assert.equal(args[1]!.patchNum, 10 as PatchSetNum);
476 assert.isNotOk(args[1]!.basePatchNum);
Dhruv Srivastava4757b352020-06-12 15:41:42 +0200477 });
478
Dhruv Srivastava8e1e2b22021-09-30 12:17:55 +0100479 test('toggle attention set status', async () => {
480 element._change = {
481 ...createChangeViewChange(),
482 revisions: createRevisions(10),
483 };
484 const addToAttentionSetStub = stubRestApi('addToAttentionSet').returns(
485 Promise.resolve(new Response())
486 );
487
488 const removeFromAttentionSetStub = stubRestApi(
489 'removeFromAttentionSet'
490 ).returns(Promise.resolve(new Response()));
491 element._patchRange = {
492 basePatchNum: 1 as BasePatchSetNum,
493 patchNum: 3 as RevisionPatchSetNum,
494 };
Dhruv Srivastava8e1e2b22021-09-30 12:17:55 +0100495
496 assert.isNotOk(element._change.attention_set);
497 await element._getLoggedIn();
498 await element.restApiService.getAccount();
Ben Rohlfs410f5222021-10-19 23:44:02 +0200499 element._handleToggleAttentionSet();
Dhruv Srivastava8e1e2b22021-09-30 12:17:55 +0100500 assert.isTrue(addToAttentionSetStub.called);
501 assert.isFalse(removeFromAttentionSetStub.called);
502
Ben Rohlfs410f5222021-10-19 23:44:02 +0200503 element._handleToggleAttentionSet();
Dhruv Srivastava8e1e2b22021-09-30 12:17:55 +0100504 assert.isTrue(removeFromAttentionSetStub.called);
505 });
506
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100507 suite('plugins adding to file tab', () => {
Chris Pouceta2e173e2021-08-31 01:04:04 +0000508 setup(async () => {
Ben Rohlfsa5356e92021-05-07 11:06:17 +0200509 element._changeNum = TEST_NUMERIC_CHANGE_ID;
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100510 // Resolving it here instead of during setup() as other tests depend
511 // on flush() not being called during setup.
Chris Pouceta2e173e2021-08-31 01:04:04 +0000512 await flush();
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500513 });
514
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100515 test('plugin added tab shows up as a dynamic endpoint', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100516 assert(
517 element._dynamicTabHeaderEndpoints.includes(
518 'change-view-tab-header-url'
519 )
520 );
521 const primaryTabs = element.shadowRoot!.querySelector('#primaryTabs')!;
522 const paperTabs = primaryTabs.querySelectorAll<HTMLElement>('paper-tab');
Dhruv Srivastava929af7f2020-05-13 19:10:05 +0200523 // 4 Tabs are : Files, Comment Threads, Plugin, Findings
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100524 assert.equal(primaryTabs.querySelectorAll('paper-tab').length, 4);
525 assert.equal(paperTabs[2].dataset.name, 'change-view-tab-header-url');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100526 });
527
Chris Pouceta2e173e2021-08-31 01:04:04 +0000528 test('_setActivePrimaryTab switched tab correctly', async () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100529 element._setActivePrimaryTab(
530 new CustomEvent('', {
531 detail: {tab: 'change-view-tab-header-url'},
532 })
533 );
Chris Pouceta2e173e2021-08-31 01:04:04 +0000534 await flush();
535 assert.equal(element._activeTabs[0], 'change-view-tab-header-url');
Tao Zhou4fd32d52020-04-06 17:23:10 +0200536 });
537
Chris Pouceta2e173e2021-08-31 01:04:04 +0000538 test('show-primary-tab switched primary tab correctly', async () => {
Paladox none6b055dc2020-06-28 14:53:18 +0000539 element.dispatchEvent(
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100540 new CustomEvent('show-primary-tab', {
541 composed: true,
542 bubbles: true,
543 detail: {
544 tab: 'change-view-tab-header-url',
545 },
546 })
547 );
Chris Pouceta2e173e2021-08-31 01:04:04 +0000548 await flush();
549 assert.equal(element._activeTabs[0], 'change-view-tab-header-url');
Tao Zhou4fd32d52020-04-06 17:23:10 +0200550 });
551
Chris Pouceta2e173e2021-08-31 01:04:04 +0000552 test('param change should switch primary tab correctly', async () => {
Dmitrii Filippove903bbf2020-05-06 12:57:39 +0200553 assert.equal(element._activeTabs[0], PrimaryTab.FILES);
Tao Zhou4fd32d52020-04-06 17:23:10 +0200554 // view is required
Dhruv Srivastava49f0a7a2021-10-06 12:03:01 +0100555 element._changeNum = undefined;
Tao Zhou4cd35cb2020-07-22 11:28:22 +0200556 element.params = {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100557 ...createAppElementChangeViewParams(),
558 ...element.params,
Dhruv Srivastava49f0a7a2021-10-06 12:03:01 +0100559 tab: PrimaryTab.FINDINGS,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100560 };
Chris Pouceta2e173e2021-08-31 01:04:04 +0000561 await flush();
562 assert.equal(element._activeTabs[0], PrimaryTab.FINDINGS);
Tao Zhou4fd32d52020-04-06 17:23:10 +0200563 });
564
Chris Pouceta2e173e2021-08-31 01:04:04 +0000565 test('invalid param change should not switch primary tab', async () => {
Dmitrii Filippove903bbf2020-05-06 12:57:39 +0200566 assert.equal(element._activeTabs[0], PrimaryTab.FILES);
Tao Zhou4fd32d52020-04-06 17:23:10 +0200567 // view is required
Tao Zhou4cd35cb2020-07-22 11:28:22 +0200568 element.params = {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100569 ...createAppElementChangeViewParams(),
570 ...element.params,
Dhruv Srivastava49f0a7a2021-10-06 12:03:01 +0100571 tab: 'random',
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100572 };
Chris Pouceta2e173e2021-08-31 01:04:04 +0000573 await flush();
574 assert.equal(element._activeTabs[0], PrimaryTab.FILES);
Kasper Nilssonf0743732016-10-18 13:01:10 -0700575 });
576
Chris Pouceta2e173e2021-08-31 01:04:04 +0000577 test('switching tab sets _selectedTabPluginEndpoint', async () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100578 const paperTabs = element.shadowRoot!.querySelector('#primaryTabs')!;
579 tap(paperTabs.querySelectorAll('paper-tab')[2]);
Chris Pouceta2e173e2021-08-31 01:04:04 +0000580 await flush();
581 assert.equal(
582 element._selectedTabPluginEndpoint,
583 'change-view-tab-content-url'
584 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100585 });
586 });
Paladox none7acb7ac2017-11-09 18:06:18 +0000587
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100588 suite('keyboard shortcuts', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100589 let clock: SinonFakeTimers;
Dhruv Srivastava4caf0842020-09-18 11:50:33 +0200590 setup(() => {
591 clock = sinon.useFakeTimers();
592 });
593
594 teardown(() => {
595 clock.restore();
596 sinon.restore();
597 });
598
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100599 test('t to add topic', () => {
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +0200600 const editStub = sinon.stub(element.$.metadata, 'editTopic');
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100601 pressAndReleaseKeyOn(element, 83, null, 't');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100602 assert(editStub.called);
603 });
604
605 test('S should toggle the CL star', () => {
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +0200606 const starStub = sinon.stub(element.$.changeStar, 'toggleStar');
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100607 pressAndReleaseKeyOn(element, 83, null, 's');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100608 assert(starStub.called);
609 });
610
Dhruv Srivastava4caf0842020-09-18 11:50:33 +0200611 test('toggle star is throttled', () => {
612 const starStub = sinon.stub(element.$.changeStar, 'toggleStar');
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100613 pressAndReleaseKeyOn(element, 83, null, 's');
Dhruv Srivastava4caf0842020-09-18 11:50:33 +0200614 assert(starStub.called);
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100615 pressAndReleaseKeyOn(element, 83, null, 's');
Dhruv Srivastava4caf0842020-09-18 11:50:33 +0200616 assert.equal(starStub.callCount, 1);
617 clock.tick(1000);
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100618 pressAndReleaseKeyOn(element, 83, null, 's');
Dhruv Srivastava4caf0842020-09-18 11:50:33 +0200619 assert.equal(starStub.callCount, 2);
620 });
621
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100622 test('U should navigate to root if no backPage set', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100623 const relativeNavStub = sinon.stub(GerritNav, 'navigateToRelativeUrl');
624 pressAndReleaseKeyOn(element, 85, null, 'u');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100625 assert.isTrue(relativeNavStub.called);
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100626 assert.isTrue(
627 relativeNavStub.lastCall.calledWithExactly(GerritNav.getUrlForRoot())
628 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100629 });
630
631 test('U should navigate to backPage if set', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100632 const relativeNavStub = sinon.stub(GerritNav, 'navigateToRelativeUrl');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100633 element.backPage = '/dashboard/self';
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100634 pressAndReleaseKeyOn(element, 85, null, 'u');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100635 assert.isTrue(relativeNavStub.called);
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100636 assert.isTrue(
637 relativeNavStub.lastCall.calledWithExactly('/dashboard/self')
638 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100639 });
640
Chris Pouceta2e173e2021-08-31 01:04:04 +0000641 test('A fires an error event when not logged in', async () => {
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +0200642 sinon.stub(element, '_getLoggedIn').returns(Promise.resolve(false));
643 const loggedInErrorSpy = sinon.spy();
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100644 element.addEventListener('show-auth-required', loggedInErrorSpy);
Ben Rohlfs410f5222021-10-19 23:44:02 +0200645 pressAndReleaseKeyOn(element, 65, null, 'a');
Chris Pouceta2e173e2021-08-31 01:04:04 +0000646 await flush();
647 assert.isFalse(element.$.replyOverlay.opened);
648 assert.isTrue(loggedInErrorSpy.called);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100649 });
650
Chris Pouceta2e173e2021-08-31 01:04:04 +0000651 test('shift A does not open reply overlay', async () => {
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +0200652 sinon.stub(element, '_getLoggedIn').returns(Promise.resolve(true));
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100653 pressAndReleaseKeyOn(element, 65, 'shift', 'a');
Chris Pouceta2e173e2021-08-31 01:04:04 +0000654 await flush();
655 assert.isFalse(element.$.replyOverlay.opened);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100656 });
657
Chris Pouceta2e173e2021-08-31 01:04:04 +0000658 test('A toggles overlay when logged in', async () => {
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +0200659 sinon.stub(element, '_getLoggedIn').returns(Promise.resolve(true));
Dmitrii Filippov0695d402020-10-22 16:57:57 +0200660 element._change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +0200661 ...createChangeViewChange(),
Dmitrii Filippov0695d402020-10-22 16:57:57 +0200662 revisions: createRevisions(1),
663 messages: createChangeMessages(1),
664 };
Dmitrii Filippov77e5f7f2020-07-10 18:39:45 +0200665 element._change.labels = {};
Dmitrii Filippov77e5f7f2020-07-10 18:39:45 +0200666
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +0200667 const openSpy = sinon.spy(element, '_openReplyDialog');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100668
Ben Rohlfs410f5222021-10-19 23:44:02 +0200669 pressAndReleaseKeyOn(element, 65, null, 'a');
Chris Pouceta2e173e2021-08-31 01:04:04 +0000670 await flush();
671 assert.isTrue(element.$.replyOverlay.opened);
672 element.$.replyOverlay.close();
673 assert.isFalse(element.$.replyOverlay.opened);
674 assert(
Ben Rohlfs00049652021-10-25 16:40:38 +0200675 openSpy.lastCall.calledWithExactly(FocusTarget.ANY),
Chris Pouceta2e173e2021-08-31 01:04:04 +0000676 '_openReplyDialog should have been passed ANY'
677 );
678 assert.equal(openSpy.callCount, 1);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100679 });
680
681 test('fullscreen-overlay-opened hides content', () => {
682 element._loggedIn = true;
683 element._loading = false;
684 element._change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +0200685 ...createChangeViewChange(),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100686 labels: {},
687 actions: {
688 abandon: {
689 enabled: true,
690 label: 'Abandon',
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100691 method: HttpMethod.POST,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100692 title: 'Abandon',
693 },
694 },
695 };
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100696 const handlerSpy = sinon.spy(element, '_handleHideBackgroundContent');
Ben Rohlfs00049652021-10-25 16:40:38 +0200697 const overlay = queryAndAssert<GrOverlay>(element, '#replyOverlay');
698 overlay.dispatchEvent(
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100699 new CustomEvent('fullscreen-overlay-opened', {
700 composed: true,
701 bubbles: true,
702 })
703 );
704 assert.isTrue(handlerSpy.called);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100705 assert.isTrue(element.$.mainContent.classList.contains('overlayOpen'));
706 assert.equal(getComputedStyle(element.$.actions).display, 'flex');
707 });
708
709 test('fullscreen-overlay-closed shows content', () => {
710 element._loggedIn = true;
711 element._loading = false;
712 element._change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +0200713 ...createChangeViewChange(),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100714 labels: {},
715 actions: {
716 abandon: {
717 enabled: true,
718 label: 'Abandon',
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100719 method: HttpMethod.POST,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100720 title: 'Abandon',
721 },
722 },
723 };
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100724 const handlerSpy = sinon.spy(element, '_handleShowBackgroundContent');
Ben Rohlfs00049652021-10-25 16:40:38 +0200725 const overlay = queryAndAssert<GrOverlay>(element, '#replyOverlay');
726 overlay.dispatchEvent(
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100727 new CustomEvent('fullscreen-overlay-closed', {
728 composed: true,
729 bubbles: true,
730 })
731 );
732 assert.isTrue(handlerSpy.called);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100733 assert.isFalse(element.$.mainContent.classList.contains('overlayOpen'));
734 });
735
736 test('expand all messages when expand-diffs fired', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100737 const handleExpand = sinon.stub(element.$.fileList, 'expandAllDiffs');
Tao Zhou0a3c9862020-04-08 14:45:37 +0200738 element.$.fileListHeader.dispatchEvent(
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100739 new CustomEvent('expand-diffs', {
740 composed: true,
741 bubbles: true,
742 })
743 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100744 assert.isTrue(handleExpand.called);
745 });
746
747 test('collapse all messages when collapse-diffs fired', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100748 const handleCollapse = sinon.stub(element.$.fileList, 'collapseAllDiffs');
Tao Zhou0a3c9862020-04-08 14:45:37 +0200749 element.$.fileListHeader.dispatchEvent(
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100750 new CustomEvent('collapse-diffs', {
751 composed: true,
752 bubbles: true,
753 })
754 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100755 assert.isTrue(handleCollapse.called);
756 });
757
Chris Pouceta2e173e2021-08-31 01:04:04 +0000758 test('X should expand all messages', async () => {
759 await flush();
760 const handleExpand = sinon.stub(
761 element.messagesList!,
762 'handleExpandCollapse'
763 );
764 pressAndReleaseKeyOn(element, 88, null, 'x');
765 assert(handleExpand.calledWith(true));
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100766 });
767
Chris Pouceta2e173e2021-08-31 01:04:04 +0000768 test('Z should collapse all messages', async () => {
769 await flush();
770 const handleExpand = sinon.stub(
771 element.messagesList!,
772 'handleExpandCollapse'
773 );
774 pressAndReleaseKeyOn(element, 90, null, 'z');
775 assert(handleExpand.calledWith(false));
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100776 });
777
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100778 test('d should open download overlay', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100779 const stub = sinon
780 .stub(element.$.downloadOverlay, 'open')
781 .returns(Promise.resolve());
Ben Rohlfs410f5222021-10-19 23:44:02 +0200782 pressAndReleaseKeyOn(element, 68, null, 'd');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100783 assert.isTrue(stub.called);
784 });
785
Chris Poucetdd2d0102022-05-13 14:09:39 +0200786 test(', should open diff preferences', async () => {
787 await element.$.fileList.updateComplete;
788 assertIsDefined(element.$.fileList.diffPreferencesDialog);
789 const stub = sinon.stub(element.$.fileList.diffPreferencesDialog, 'open');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100790 element._loggedIn = false;
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100791 pressAndReleaseKeyOn(element, 188, null, ',');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100792 assert.isFalse(stub.called);
793
794 element._loggedIn = true;
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100795 pressAndReleaseKeyOn(element, 188, null, ',');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100796 assert.isTrue(stub.called);
797 });
798
Dhruv Srivastava80d34f42021-10-18 16:45:02 +0200799 test('m should toggle diff mode', async () => {
800 const updatePreferencesStub = stubUsers('updatePreferences');
801 await flush();
802
803 const prefs = {
804 ...createDefaultPreferences(),
805 diff_view: DiffViewMode.SIDE_BY_SIDE,
806 };
Chris Poucetefcdb202021-11-22 23:54:26 +0100807 element.userModel.setPreferences(prefs);
Dhruv Srivastava80d34f42021-10-18 16:45:02 +0200808 element._handleToggleDiffMode();
809 assert.isTrue(
810 updatePreferencesStub.calledWith({diff_view: DiffViewMode.UNIFIED})
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100811 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100812
Dhruv Srivastava80d34f42021-10-18 16:45:02 +0200813 const newPrefs = {
814 ...createDefaultPreferences(),
815 diff_view: DiffViewMode.UNIFIED,
816 };
Chris Poucetefcdb202021-11-22 23:54:26 +0100817 element.userModel.setPreferences(newPrefs);
Dhruv Srivastava80d34f42021-10-18 16:45:02 +0200818 await flush();
Ben Rohlfs410f5222021-10-19 23:44:02 +0200819 element._handleToggleDiffMode();
Dhruv Srivastava80d34f42021-10-18 16:45:02 +0200820 assert.isTrue(
821 updatePreferencesStub.calledWith({diff_view: DiffViewMode.SIDE_BY_SIDE})
822 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100823 });
824 });
825
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100826 suite('thread list and change log tabs', () => {
827 setup(() => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100828 element._changeNum = TEST_NUMERIC_CHANGE_ID;
Kasper Nilsson9c1a3db2018-10-19 15:11:07 -0700829 element._patchRange = {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100830 basePatchNum: ParentPatchSetNum,
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +0100831 patchNum: 1 as RevisionPatchSetNum,
Kasper Nilsson9c1a3db2018-10-19 15:11:07 -0700832 };
Becky Siegel9b03dd22017-10-26 14:57:32 -0700833 element._change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +0200834 ...createChangeViewChange(),
Becky Siegel9b03dd22017-10-26 14:57:32 -0700835 revisions: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100836 rev2: createRevision(2),
837 rev1: createRevision(1),
838 rev13: createRevision(13),
839 rev3: createRevision(3),
Kasper Nilssonf0743732016-10-18 13:01:10 -0700840 },
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100841 current_revision: 'rev3' as CommitId,
842 status: ChangeStatus.NEW,
Kasper Nilssonf0743732016-10-18 13:01:10 -0700843 labels: {
844 test: {
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100845 all: [],
Kasper Nilssonf0743732016-10-18 13:01:10 -0700846 default_value: 0,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100847 values: {},
Kasper Nilssonf0743732016-10-18 13:01:10 -0700848 approved: {},
849 },
850 },
851 };
Milutin Kristofic8803ea02020-12-09 23:34:39 +0100852 const relatedChanges = element.shadowRoot!.querySelector(
853 '#relatedChanges'
854 ) as GrRelatedChangesList;
855 sinon.stub(relatedChanges, 'reload');
Han-Wen Nienhuys577ce0a2021-08-11 12:11:17 +0200856 sinon.stub(element, 'loadData').returns(Promise.resolve());
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +0200857 sinon.spy(element, '_paramsChanged');
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100858 element.params = createAppElementChangeViewParams();
Kasper Nilsson34a5d892018-04-11 11:10:53 -0700859 });
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100860 });
861
Dhruv Srivastavab213a1f2021-11-19 14:45:40 +0100862 suite('Comments tab', () => {
863 setup(async () => {
864 element._changeNum = TEST_NUMERIC_CHANGE_ID;
865 element._change = {
866 ...createChangeViewChange(),
867 revisions: {
868 rev2: createRevision(2),
869 rev1: createRevision(1),
870 rev13: createRevision(13),
871 rev3: createRevision(3),
872 rev4: createRevision(4),
873 },
874 current_revision: 'rev4' as CommitId,
875 };
876 element._commentThreads = THREADS;
877 await flush();
878 const paperTabs = element.shadowRoot!.querySelector('#primaryTabs')!;
879 tap(paperTabs.querySelectorAll('paper-tab')[1]);
880 await flush();
881 });
882
883 test('commentId overrides unresolveOnly default', async () => {
884 const threadList = queryAndAssert<GrThreadList>(
885 element,
886 'gr-thread-list'
887 );
888 assert.isTrue(element.unresolvedOnly);
889 assert.isNotOk(element.scrollCommentId);
890 assert.isTrue(threadList.unresolvedOnly);
891
892 element.scrollCommentId = 'abcd' as UrlEncodedCommentId;
893 await flush();
894 assert.isFalse(threadList.unresolvedOnly);
895 });
896 });
897
898 suite('Findings robot-comment tab', () => {
Frank Borden0a05fa12021-08-09 13:50:52 +0200899 setup(async () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100900 element._changeNum = TEST_NUMERIC_CHANGE_ID;
Kasper Nilssonbbd28672018-08-01 10:23:23 -0700901 element._change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +0200902 ...createChangeViewChange(),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100903 revisions: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100904 rev2: createRevision(2),
905 rev1: createRevision(1),
906 rev13: createRevision(13),
907 rev3: createRevision(3),
908 rev4: createRevision(4),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100909 },
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100910 current_revision: 'rev4' as CommitId,
Kasper Nilssonbbd28672018-08-01 10:23:23 -0700911 };
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100912 element._commentThreads = THREADS;
Frank Borden0a05fa12021-08-09 13:50:52 +0200913 await flush();
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100914 const paperTabs = element.shadowRoot!.querySelector('#primaryTabs')!;
915 tap(paperTabs.querySelectorAll('paper-tab')[3]);
Frank Borden0a05fa12021-08-09 13:50:52 +0200916 await flush();
Kasper Nilssonbbd28672018-08-01 10:23:23 -0700917 });
Milutin Kristofic7a86db12019-08-07 15:26:13 +0200918
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100919 test('robot comments count per patchset', () => {
920 const count = element._robotCommentCountPerPatchSet(THREADS);
921 const expectedCount = {
922 2: 1,
923 3: 1,
924 4: 2,
925 };
926 assert.deepEqual(count, expectedCount);
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100927 assert.equal(
928 element._computeText(createRevision(2), THREADS),
929 'Patchset 2 (1 finding)'
930 );
931 assert.equal(
932 element._computeText(createRevision(4), THREADS),
933 'Patchset 4 (2 findings)'
934 );
935 assert.equal(
936 element._computeText(createRevision(5), THREADS),
937 'Patchset 5'
938 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100939 });
Milutin Kristofic7a86db12019-08-07 15:26:13 +0200940
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100941 test('only robot comments are rendered', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100942 assert.equal(element._robotCommentThreads!.length, 2);
943 assert.equal(
Ben Rohlfs05750b92021-10-29 08:23:08 +0200944 (element._robotCommentThreads![0].comments[0] as RobotCommentInfo)
945 .robot_id,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100946 'rc1'
947 );
948 assert.equal(
Ben Rohlfs05750b92021-10-29 08:23:08 +0200949 (element._robotCommentThreads![1].comments[0] as RobotCommentInfo)
950 .robot_id,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100951 'rc2'
952 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100953 });
954
Chris Pouceta2e173e2021-08-31 01:04:04 +0000955 test('changing patchsets resets robot comments', async () => {
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100956 element.set('_change.current_revision', 'rev3');
Chris Pouceta2e173e2021-08-31 01:04:04 +0000957 await flush();
958 assert.equal(element._robotCommentThreads!.length, 1);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100959 });
960
961 test('Show more button is hidden', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100962 assert.isNull(element.shadowRoot!.querySelector('.show-robot-comments'));
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100963 });
964
965 suite('robot comments show more button', () => {
Chris Pouceta2e173e2021-08-31 01:04:04 +0000966 setup(async () => {
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100967 const arr = [];
968 for (let i = 0; i <= 30; i++) {
969 arr.push(...THREADS);
970 }
971 element._commentThreads = arr;
Chris Pouceta2e173e2021-08-31 01:04:04 +0000972 await flush();
Milutin Kristofic7a86db12019-08-07 15:26:13 +0200973 });
974
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100975 test('Show more button is rendered', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100976 assert.isOk(element.shadowRoot!.querySelector('.show-robot-comments'));
977 assert.equal(
978 element._robotCommentThreads!.length,
979 ROBOT_COMMENTS_LIMIT
980 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100981 });
982
Chris Pouceta2e173e2021-08-31 01:04:04 +0000983 test('Clicking show more button renders all comments', async () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100984 tap(element.shadowRoot!.querySelector('.show-robot-comments')!);
Chris Pouceta2e173e2021-08-31 01:04:04 +0000985 await flush();
986 assert.equal(element._robotCommentThreads!.length, 62);
Milutin Kristofic7a86db12019-08-07 15:26:13 +0200987 });
988 });
Andrew Bonventre547b8ab2015-12-01 01:02:00 -0500989 });
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100990
991 test('reply button is not visible when logged out', () => {
992 assert.equal(getComputedStyle(element.$.replyBtn).display, 'none');
993 element._loggedIn = true;
994 assert.notEqual(getComputedStyle(element.$.replyBtn).display, 'none');
995 });
996
997 test('download tap calls _handleOpenDownloadDialog', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +0100998 const openDialogStub = sinon.stub(element, '_handleOpenDownloadDialog');
Tao Zhou0a3c9862020-04-08 14:45:37 +0200999 element.$.actions.dispatchEvent(
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001000 new CustomEvent('download-tap', {
1001 composed: true,
1002 bubbles: true,
1003 })
1004 );
1005 assert.isTrue(openDialogStub.called);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001006 });
1007
Chris Pouceta2e173e2021-08-31 01:04:04 +00001008 test('fetches the server config on attached', async () => {
1009 await flush();
1010 assert.equal(
1011 element._serverConfig!.user.anonymous_coward_name,
1012 'test coward name'
1013 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001014 });
1015
1016 test('_changeStatuses', () => {
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001017 element._loading = false;
1018 element._change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +02001019 ...createChangeViewChange(),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001020 revisions: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001021 rev2: createRevision(2),
1022 rev1: createRevision(1),
1023 rev13: createRevision(13),
1024 rev3: createRevision(3),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001025 },
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001026 current_revision: 'rev3' as CommitId,
Dmitrii Filippov3bf68892020-07-12 00:19:10 +02001027 status: ChangeStatus.MERGED,
1028 work_in_progress: true,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001029 labels: {
1030 test: {
1031 all: [],
1032 default_value: 0,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001033 values: {},
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001034 approved: {},
1035 },
1036 },
1037 };
1038 element._mergeable = true;
Frank Borden88603372021-06-02 16:50:51 +02001039 const expectedStatuses = [ChangeStates.MERGED, ChangeStates.WIP];
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001040 assert.deepEqual(element._changeStatuses, expectedStatuses);
Ben Rohlfsd47eeb92020-09-25 10:29:48 +02001041 flush();
Chris Poucetcaeea1b2021-08-19 22:12:56 +00001042 const statusChips =
1043 element.shadowRoot!.querySelectorAll('gr-change-status');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001044 assert.equal(statusChips.length, 2);
1045 });
1046
Dhruv Srivastava69a51732021-04-14 18:23:00 +02001047 suite('ChangeStatus revert', () => {
Chris Pouceta2e173e2021-08-31 01:04:04 +00001048 test('do not show any chip if no revert created', async () => {
Dhruv Srivastava4b634ac2021-04-19 12:18:53 +02001049 const change = {
Ben Rohlfsa16c51a2021-11-22 12:50:55 +01001050 ...createParsedChange(),
Dhruv Srivastava4b634ac2021-04-19 12:18:53 +02001051 messages: createChangeMessages(2),
1052 };
1053 const getChangeStub = stubRestApi('getChange');
1054 getChangeStub.onFirstCall().returns(
1055 Promise.resolve({
1056 ...createChange(),
1057 })
1058 );
1059 getChangeStub.onSecondCall().returns(
1060 Promise.resolve({
1061 ...createChange(),
1062 })
1063 );
1064 element._change = change;
1065 element._mergeable = true;
1066 element._submitEnabled = true;
Chris Pouceta2e173e2021-08-31 01:04:04 +00001067 await flush();
Dhruv Srivastava4b634ac2021-04-19 12:18:53 +02001068 element.computeRevertSubmitted(element._change);
Chris Pouceta2e173e2021-08-31 01:04:04 +00001069 await flush();
1070 assert.isFalse(
1071 element._changeStatuses?.includes(ChangeStates.REVERT_SUBMITTED)
1072 );
1073 assert.isFalse(
1074 element._changeStatuses?.includes(ChangeStates.REVERT_CREATED)
1075 );
Dhruv Srivastava4b634ac2021-04-19 12:18:53 +02001076 });
1077
Chris Pouceta2e173e2021-08-31 01:04:04 +00001078 test('do not show any chip if all reverts are abandoned', async () => {
Dhruv Srivastava4a557f22021-04-21 14:10:09 +02001079 const change = {
Ben Rohlfsa16c51a2021-11-22 12:50:55 +01001080 ...createParsedChange(),
Dhruv Srivastava4a557f22021-04-21 14:10:09 +02001081 messages: createChangeMessages(2),
1082 };
1083 change.messages[0].message = 'Created a revert of this change as 12345';
1084 change.messages[0].tag = MessageTag.TAG_REVERT as ReviewInputTag;
1085
1086 change.messages[1].message = 'Created a revert of this change as 23456';
1087 change.messages[1].tag = MessageTag.TAG_REVERT as ReviewInputTag;
1088
1089 const getChangeStub = stubRestApi('getChange');
1090 getChangeStub.onFirstCall().returns(
1091 Promise.resolve({
1092 ...createChange(),
1093 status: ChangeStatus.ABANDONED,
1094 })
1095 );
1096 getChangeStub.onSecondCall().returns(
1097 Promise.resolve({
1098 ...createChange(),
1099 status: ChangeStatus.ABANDONED,
1100 })
1101 );
1102 element._change = change;
1103 element._mergeable = true;
1104 element._submitEnabled = true;
Chris Pouceta2e173e2021-08-31 01:04:04 +00001105 await flush();
Dhruv Srivastava4a557f22021-04-21 14:10:09 +02001106 element.computeRevertSubmitted(element._change);
Chris Pouceta2e173e2021-08-31 01:04:04 +00001107 await flush();
1108 assert.isFalse(
1109 element._changeStatuses?.includes(ChangeStates.REVERT_SUBMITTED)
1110 );
1111 assert.isFalse(
1112 element._changeStatuses?.includes(ChangeStates.REVERT_CREATED)
1113 );
Dhruv Srivastava4a557f22021-04-21 14:10:09 +02001114 });
1115
Chris Pouceta2e173e2021-08-31 01:04:04 +00001116 test('show revert created if no revert is merged', async () => {
Dhruv Srivastava69a51732021-04-14 18:23:00 +02001117 const change = {
Ben Rohlfsa16c51a2021-11-22 12:50:55 +01001118 ...createParsedChange(),
Dhruv Srivastava69a51732021-04-14 18:23:00 +02001119 messages: createChangeMessages(2),
1120 };
1121 change.messages[0].message = 'Created a revert of this change as 12345';
1122 change.messages[0].tag = MessageTag.TAG_REVERT as ReviewInputTag;
Dhruv Srivastava4a557f22021-04-21 14:10:09 +02001123
1124 change.messages[1].message = 'Created a revert of this change as 23456';
1125 change.messages[1].tag = MessageTag.TAG_REVERT as ReviewInputTag;
1126
Dhruv Srivastava69a51732021-04-14 18:23:00 +02001127 const getChangeStub = stubRestApi('getChange');
1128 getChangeStub.onFirstCall().returns(
1129 Promise.resolve({
1130 ...createChange(),
1131 })
1132 );
1133 getChangeStub.onSecondCall().returns(
1134 Promise.resolve({
1135 ...createChange(),
1136 })
1137 );
1138 element._change = change;
1139 element._mergeable = true;
1140 element._submitEnabled = true;
Chris Pouceta2e173e2021-08-31 01:04:04 +00001141 await flush();
Dhruv Srivastava69a51732021-04-14 18:23:00 +02001142 element.computeRevertSubmitted(element._change);
Chris Pouceta2e173e2021-08-31 01:04:04 +00001143 await flush();
1144 assert.isFalse(
1145 element._changeStatuses?.includes(ChangeStates.REVERT_SUBMITTED)
1146 );
1147 assert.isTrue(
1148 element._changeStatuses?.includes(ChangeStates.REVERT_CREATED)
1149 );
Dhruv Srivastava69a51732021-04-14 18:23:00 +02001150 });
1151
Chris Pouceta2e173e2021-08-31 01:04:04 +00001152 test('show revert submitted if revert is merged', async () => {
Dhruv Srivastava69a51732021-04-14 18:23:00 +02001153 const change = {
Ben Rohlfsa16c51a2021-11-22 12:50:55 +01001154 ...createParsedChange(),
Dhruv Srivastava69a51732021-04-14 18:23:00 +02001155 messages: createChangeMessages(2),
1156 };
1157 change.messages[0].message = 'Created a revert of this change as 12345';
1158 change.messages[0].tag = MessageTag.TAG_REVERT as ReviewInputTag;
1159 const getChangeStub = stubRestApi('getChange');
1160 getChangeStub.onFirstCall().returns(
1161 Promise.resolve({
1162 ...createChange(),
1163 status: ChangeStatus.MERGED,
1164 })
1165 );
1166 getChangeStub.onSecondCall().returns(
1167 Promise.resolve({
1168 ...createChange(),
1169 })
1170 );
1171 element._change = change;
1172 element._mergeable = true;
1173 element._submitEnabled = true;
Chris Pouceta2e173e2021-08-31 01:04:04 +00001174 await flush();
Dhruv Srivastava69a51732021-04-14 18:23:00 +02001175 element.computeRevertSubmitted(element._change);
Chris Pouceta2e173e2021-08-31 01:04:04 +00001176 await flush();
1177 assert.isFalse(
1178 element._changeStatuses?.includes(ChangeStates.REVERT_CREATED)
1179 );
1180 assert.isTrue(
1181 element._changeStatuses?.includes(ChangeStates.REVERT_SUBMITTED)
1182 );
Dhruv Srivastava69a51732021-04-14 18:23:00 +02001183 });
1184 });
1185
Chris Poucetdd2d0102022-05-13 14:09:39 +02001186 test('diff preferences open when open-diff-prefs is fired', async () => {
1187 await element.$.fileList.updateComplete;
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001188 const overlayOpenStub = sinon.stub(element.$.fileList, 'openDiffPrefs');
Tao Zhou0a3c9862020-04-08 14:45:37 +02001189 element.$.fileListHeader.dispatchEvent(
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001190 new CustomEvent('open-diff-prefs', {
1191 composed: true,
1192 bubbles: true,
1193 })
1194 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001195 assert.isTrue(overlayOpenStub.called);
1196 });
1197
1198 test('_prepareCommitMsgForLinkify', () => {
1199 let commitMessage = 'R=test@google.com';
1200 let result = element._prepareCommitMsgForLinkify(commitMessage);
1201 assert.equal(result, 'R=\u200Btest@google.com');
1202
1203 commitMessage = 'R=test@google.com\nR=test@google.com';
1204 result = element._prepareCommitMsgForLinkify(commitMessage);
1205 assert.equal(result, 'R=\u200Btest@google.com\nR=\u200Btest@google.com');
1206
1207 commitMessage = 'CC=test@google.com';
1208 result = element._prepareCommitMsgForLinkify(commitMessage);
1209 assert.equal(result, 'CC=\u200Btest@google.com');
David Ostrovskya2401c12020-05-03 19:29:26 +02001210 });
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001211
1212 test('_isSubmitEnabled', () => {
1213 assert.isFalse(element._isSubmitEnabled({}));
1214 assert.isFalse(element._isSubmitEnabled({submit: {}}));
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001215 assert.isTrue(element._isSubmitEnabled({submit: {enabled: true}}));
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001216 });
1217
1218 test('_reload is called when an approved label is removed', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001219 const vote: ApprovalInfo = {
1220 ...createApproval(),
1221 _account_id: 1 as AccountId,
1222 name: 'bojack',
1223 value: 1,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001224 };
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001225 element._changeNum = TEST_NUMERIC_CHANGE_ID;
1226 element._patchRange = {
1227 basePatchNum: ParentPatchSetNum,
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01001228 patchNum: 1 as RevisionPatchSetNum,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001229 };
1230 const change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +02001231 ...createChangeViewChange(),
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001232 owner: createAccountWithIdNameAndEmail(),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001233 revisions: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001234 rev2: createRevision(2),
1235 rev1: createRevision(1),
1236 rev13: createRevision(13),
1237 rev3: createRevision(3),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001238 },
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001239 current_revision: 'rev3' as CommitId,
1240 status: ChangeStatus.NEW,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001241 labels: {
1242 test: {
1243 all: [vote],
1244 default_value: 0,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001245 values: {},
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001246 approved: {},
1247 },
1248 },
1249 };
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001250 element._change = change;
Ben Rohlfsd47eeb92020-09-25 10:29:48 +02001251 flush();
Ben Rohlfs66367b62021-04-30 10:06:32 +02001252 const reloadStub = sinon.stub(element, 'loadData');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001253 element.splice('_change.labels.test.all', 0, 1);
1254 assert.isFalse(reloadStub.called);
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001255 change.labels.test.all.push(vote);
1256 change.labels.test.all.push(vote);
1257 change.labels.test.approved = vote;
Ben Rohlfsd47eeb92020-09-25 10:29:48 +02001258 flush();
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001259 element.splice('_change.labels.test.all', 0, 2);
1260 assert.isTrue(reloadStub.called);
1261 assert.isTrue(reloadStub.calledOnce);
1262 });
1263
1264 test('reply button has updated count when there are drafts', () => {
1265 const getLabel = element._computeReplyButtonLabel;
1266
Dhruv Srivastavadb2ab602021-06-24 15:20:29 +02001267 assert.equal(getLabel(undefined, false), 'Reply');
1268 assert.equal(getLabel(undefined, true), 'Reply');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001269
Dhruv Srivastavadb2ab602021-06-24 15:20:29 +02001270 let drafts = {};
1271 assert.equal(getLabel(drafts, false), 'Reply');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001272
Dhruv Srivastavadb2ab602021-06-24 15:20:29 +02001273 drafts = {
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001274 'file1.txt': [{}],
1275 'file2.txt': [{}, {}],
1276 };
Dhruv Srivastavadb2ab602021-06-24 15:20:29 +02001277 assert.equal(getLabel(drafts, false), 'Reply (3)');
1278 assert.equal(getLabel(drafts, true), 'Start Review (3)');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001279 });
1280
1281 test('change num change', () => {
Ben Rohlfs3a6ff7e2021-01-18 14:08:39 +01001282 const change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +02001283 ...createChangeViewChange(),
Ben Rohlfs3a6ff7e2021-01-18 14:08:39 +01001284 labels: {},
1285 } as ParsedChangeInfo;
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001286 element._changeNum = undefined;
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001287 element._patchRange = {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001288 basePatchNum: ParentPatchSetNum,
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01001289 patchNum: 2 as RevisionPatchSetNum,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001290 };
Ben Rohlfs3a6ff7e2021-01-18 14:08:39 +01001291 element._change = change;
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001292 element.viewState.changeNum = null;
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001293 element.viewState.diffMode = DiffViewMode.UNIFIED;
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001294 assert.equal(element.viewState.numFilesShown, 200);
1295 assert.equal(element._numFilesShown, 200);
1296 element._numFilesShown = 150;
Ben Rohlfsd47eeb92020-09-25 10:29:48 +02001297 flush();
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001298 assert.equal(element.viewState.diffMode, DiffViewMode.UNIFIED);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001299 assert.equal(element.viewState.numFilesShown, 150);
1300
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001301 element._changeNum = 1 as NumericChangeId;
1302 element.params = {
1303 ...createAppElementChangeViewParams(),
1304 changeNum: 1 as NumericChangeId,
1305 };
Ben Rohlfsd47eeb92020-09-25 10:29:48 +02001306 flush();
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001307 assert.equal(element.viewState.diffMode, DiffViewMode.UNIFIED);
1308 assert.equal(element.viewState.changeNum, 1);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001309
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001310 element._changeNum = 2 as NumericChangeId;
1311 element.params = {
1312 ...createAppElementChangeViewParams(),
1313 changeNum: 2 as NumericChangeId,
1314 };
Ben Rohlfsd47eeb92020-09-25 10:29:48 +02001315 flush();
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001316 assert.equal(element.viewState.diffMode, DiffViewMode.UNIFIED);
1317 assert.equal(element.viewState.changeNum, 2);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001318 assert.equal(element.viewState.numFilesShown, 200);
1319 assert.equal(element._numFilesShown, 200);
1320 });
1321
Ben Rohlfs71a8dee2021-06-22 10:06:15 +02001322 test('don’t reload entire page when patchRange changes', async () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001323 const reloadStub = sinon
Ben Rohlfs66367b62021-04-30 10:06:32 +02001324 .stub(element, 'loadData')
Han-Wen Nienhuys577ce0a2021-08-11 12:11:17 +02001325 .callsFake(() => Promise.resolve());
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001326 const reloadPatchDependentStub = sinon
1327 .stub(element, '_reloadPatchNumDependentResources')
Dhruv Srivastava09a1b5a2021-01-20 09:28:15 +01001328 .callsFake(() => Promise.resolve([undefined, undefined, undefined]));
Dhruv Srivastava105fa212021-09-03 12:16:30 +00001329 flush();
Chris Poucetdd2d0102022-05-13 14:09:39 +02001330 await element.$.fileList.updateComplete;
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +02001331 const collapseStub = sinon.stub(element.$.fileList, 'collapseAllDiffs');
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001332 const value: AppElementChangeViewParams = {
1333 ...createAppElementChangeViewParams(),
1334 view: GerritView.CHANGE,
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01001335 patchNum: 1 as RevisionPatchSetNum,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001336 };
Dhruv Srivastava49f0a7a2021-10-06 12:03:01 +01001337 element._changeNum = undefined;
Ben Rohlfs71a8dee2021-06-22 10:06:15 +02001338 element.params = value;
1339 await flush();
Dhruv Srivastava105fa212021-09-03 12:16:30 +00001340 assert.isTrue(reloadStub.calledOnce);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001341
1342 element._initialLoadComplete = true;
Ben Rohlfsd03b9b12021-05-12 12:04:50 +02001343 element._change = {
1344 ...createChangeViewChange(),
1345 revisions: {
1346 rev1: createRevision(1),
1347 rev2: createRevision(2),
1348 },
1349 };
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001350
Dhruv Srivastava591b4902021-03-10 11:48:12 +01001351 value.basePatchNum = 1 as BasePatchSetNum;
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01001352 value.patchNum = 2 as RevisionPatchSetNum;
Ben Rohlfs71a8dee2021-06-22 10:06:15 +02001353 element.params = {...value};
1354 await flush();
Dhruv Srivastava105fa212021-09-03 12:16:30 +00001355 assert.isFalse(reloadStub.calledTwice);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001356 assert.isTrue(reloadPatchDependentStub.calledOnce);
Dhruv Srivastava105fa212021-09-03 12:16:30 +00001357 assert.isTrue(collapseStub.calledTwice);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001358 });
1359
Ben Rohlfs71a8dee2021-06-22 10:06:15 +02001360 test('reload ported comments when patchNum changes', async () => {
Han-Wen Nienhuys577ce0a2021-08-11 12:11:17 +02001361 sinon.stub(element, 'loadData').callsFake(() => Promise.resolve());
Ben Rohlfs1fe7f4d2021-12-06 11:21:49 +01001362 sinon.stub(element, 'loadAndSetCommitInfo');
Dhruv Srivastava09a1b5a2021-01-20 09:28:15 +01001363 sinon.stub(element.$.fileList, 'reload');
Chris Poucetdd2d0102022-05-13 14:09:39 +02001364 await flush();
Chris Poucet6c6b54f2021-12-09 02:53:13 +01001365 const reloadPortedCommentsStub = sinon.stub(
1366 element.getCommentsModel(),
1367 'reloadPortedComments'
1368 );
1369 const reloadPortedDraftsStub = sinon.stub(
1370 element.getCommentsModel(),
1371 'reloadPortedDrafts'
1372 );
Dhruv Srivastava09a1b5a2021-01-20 09:28:15 +01001373 sinon.stub(element.$.fileList, 'collapseAllDiffs');
1374
1375 const value: AppElementChangeViewParams = {
1376 ...createAppElementChangeViewParams(),
1377 view: GerritView.CHANGE,
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01001378 patchNum: 1 as RevisionPatchSetNum,
Dhruv Srivastava09a1b5a2021-01-20 09:28:15 +01001379 };
Ben Rohlfs71a8dee2021-06-22 10:06:15 +02001380 element.params = value;
1381 await flush();
Dhruv Srivastava09a1b5a2021-01-20 09:28:15 +01001382
1383 element._initialLoadComplete = true;
Ben Rohlfsd03b9b12021-05-12 12:04:50 +02001384 element._change = {
1385 ...createChangeViewChange(),
1386 revisions: {
1387 rev1: createRevision(1),
1388 rev2: createRevision(2),
1389 },
1390 };
Dhruv Srivastava09a1b5a2021-01-20 09:28:15 +01001391
Dhruv Srivastava591b4902021-03-10 11:48:12 +01001392 value.basePatchNum = 1 as BasePatchSetNum;
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01001393 value.patchNum = 2 as RevisionPatchSetNum;
Ben Rohlfs71a8dee2021-06-22 10:06:15 +02001394 element.params = {...value};
1395 await flush();
Dhruv Srivastava09a1b5a2021-01-20 09:28:15 +01001396 assert.isTrue(reloadPortedCommentsStub.calledOnce);
Ben Rohlfs718cec02021-11-03 09:04:15 +01001397 assert.isTrue(reloadPortedDraftsStub.calledOnce);
Dhruv Srivastava09a1b5a2021-01-20 09:28:15 +01001398 });
1399
Dhruv Srivastava49f0a7a2021-10-06 12:03:01 +01001400 test('do not reload entire page when patchRange doesnt change', async () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001401 const reloadStub = sinon
Ben Rohlfs66367b62021-04-30 10:06:32 +02001402 .stub(element, 'loadData')
Han-Wen Nienhuys577ce0a2021-08-11 12:11:17 +02001403 .callsFake(() => Promise.resolve());
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +02001404 const collapseStub = sinon.stub(element.$.fileList, 'collapseAllDiffs');
Chris Poucetcaeea1b2021-08-19 22:12:56 +00001405 const value: AppElementChangeViewParams =
1406 createAppElementChangeViewParams();
Ben Rohlfs71a8dee2021-06-22 10:06:15 +02001407 element.params = value;
Dhruv Srivastava49f0a7a2021-10-06 12:03:01 +01001408 // change already loaded
1409 assert.isOk(element._changeNum);
Ben Rohlfs71a8dee2021-06-22 10:06:15 +02001410 await flush();
Dhruv Srivastava49f0a7a2021-10-06 12:03:01 +01001411 assert.isFalse(reloadStub.calledOnce);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001412 element._initialLoadComplete = true;
Ben Rohlfs71a8dee2021-06-22 10:06:15 +02001413 element.params = {...value};
1414 await flush();
Dhruv Srivastava49f0a7a2021-10-06 12:03:01 +01001415 assert.isFalse(reloadStub.calledTwice);
1416 assert.isFalse(collapseStub.calledTwice);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001417 });
1418
Ben Rohlfsc04f61a2021-12-02 14:36:54 +01001419 test('forceReload updates the change', async () => {
1420 const getChangeStub = stubRestApi('getChangeDetail').returns(
1421 Promise.resolve(createParsedChange())
1422 );
1423 const loadDataStub = sinon
1424 .stub(element, 'loadData')
1425 .callsFake(() => Promise.resolve());
1426 const collapseStub = sinon.stub(element.$.fileList, 'collapseAllDiffs');
1427 element.params = {...createAppElementChangeViewParams(), forceReload: true};
1428 await flush();
1429 assert.isTrue(getChangeStub.called);
1430 assert.isTrue(loadDataStub.called);
1431 assert.isTrue(collapseStub.called);
1432 // patchNum is set by changeChanged, so this verifies that _change was set.
1433 assert.isOk(element._patchRange?.patchNum);
1434 });
1435
Ben Rohlfs71a8dee2021-06-22 10:06:15 +02001436 test('do not handle new change numbers', async () => {
1437 const recreateSpy = sinon.spy();
1438 element.addEventListener('recreate-change-view', recreateSpy);
1439
Chris Poucetcaeea1b2021-08-19 22:12:56 +00001440 const value: AppElementChangeViewParams =
1441 createAppElementChangeViewParams();
Ben Rohlfs71a8dee2021-06-22 10:06:15 +02001442 element.params = value;
1443 await flush();
1444 assert.isFalse(recreateSpy.calledOnce);
1445
1446 value.changeNum = 555111333 as NumericChangeId;
1447 element.params = {...value};
1448 await flush();
1449 assert.isTrue(recreateSpy.calledOnce);
1450 });
1451
Ben Rohlfsbdf135d2021-12-20 15:09:02 +01001452 test('related changes are updated when loadData is called', async () => {
Chris Pouceta2e173e2021-08-31 01:04:04 +00001453 await flush();
Milutin Kristofic8803ea02020-12-09 23:34:39 +01001454 const relatedChanges = element.shadowRoot!.querySelector(
1455 '#relatedChanges'
1456 ) as GrRelatedChangesList;
Ben Rohlfsbdf135d2021-12-20 15:09:02 +01001457 const reloadStub = sinon.stub(relatedChanges, 'reload');
1458 stubRestApi('getMergeable').returns(
1459 Promise.resolve({...createMergeable(), mergeable: true})
1460 );
1461
1462 element.params = createAppElementChangeViewParams();
Chris Poucetbf65b8f2022-01-18 21:18:12 +00001463 element.getChangeModel().setState({
Ben Rohlfsbdf135d2021-12-20 15:09:02 +01001464 loadingStatus: LoadingStatus.LOADED,
1465 change: {
1466 ...createChangeViewChange(),
1467 },
1468 });
1469
Chris Pouceta2e173e2021-08-31 01:04:04 +00001470 await element.loadData(true);
1471 assert.isFalse(navigateToChangeStub.called);
Ben Rohlfsbdf135d2021-12-20 15:09:02 +01001472 assert.isTrue(reloadStub.called);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001473 });
1474
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001475 test('_computeCopyTextForTitle', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001476 const change: ChangeInfo = {
Dhruv Srivastavada276592021-04-07 14:51:51 +02001477 ...createChangeViewChange(),
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001478 _number: 123 as NumericChangeId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001479 subject: 'test subject',
1480 revisions: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001481 rev1: createRevision(1),
1482 rev3: createRevision(3),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001483 },
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001484 current_revision: 'rev3' as CommitId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001485 };
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001486 sinon.stub(GerritNav, 'getUrlForChange').returns('/change/123');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001487 assert.equal(
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001488 element._computeCopyTextForTitle(change),
1489 `123: test subject | http://${location.host}/change/123`
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001490 );
1491 });
1492
1493 test('get latest revision', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001494 let change: ChangeInfo = {
1495 ...createChange(),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001496 revisions: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001497 rev1: createRevision(1),
1498 rev3: createRevision(3),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001499 },
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001500 current_revision: 'rev3' as CommitId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001501 };
1502 assert.equal(element._getLatestRevisionSHA(change), 'rev3');
1503 change = {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001504 ...createChange(),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001505 revisions: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001506 rev1: createRevision(1),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001507 },
Dhruv Srivastavada276592021-04-07 14:51:51 +02001508 current_revision: undefined,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001509 };
1510 assert.equal(element._getLatestRevisionSHA(change), 'rev1');
1511 });
1512
1513 test('show commit message edit button', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001514 const change = createChange();
1515 const mergedChanged: ChangeInfo = {
Dhruv Srivastavada276592021-04-07 14:51:51 +02001516 ...createChangeViewChange(),
Dmitrii Filippov4e4522e2020-05-06 12:50:49 +02001517 status: ChangeStatus.MERGED,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001518 };
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001519 assert.isTrue(element._computeHideEditCommitMessage(false, false, change));
1520 assert.isTrue(element._computeHideEditCommitMessage(true, true, change));
1521 assert.isTrue(element._computeHideEditCommitMessage(false, true, change));
1522 assert.isFalse(element._computeHideEditCommitMessage(true, false, change));
1523 assert.isTrue(
1524 element._computeHideEditCommitMessage(true, false, mergedChanged)
1525 );
1526 assert.isTrue(
1527 element._computeHideEditCommitMessage(true, false, change, true)
1528 );
1529 assert.isFalse(
1530 element._computeHideEditCommitMessage(true, false, change, false)
1531 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001532 });
1533
Milutin Kristoficcfcf0af2022-05-12 21:39:06 +02001534 test('_handleCommitMessageSave trims trailing whitespace', async () => {
Dhruv Srivastavada276592021-04-07 14:51:51 +02001535 element._change = createChangeViewChange();
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001536 // Response code is 500, because we want to avoid window reloading
Ben Rohlfs3a6ff7e2021-01-18 14:08:39 +01001537 const putStub = stubRestApi('putChangeCommitMessage').returns(
1538 Promise.resolve(new Response(null, {status: 500}))
1539 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001540
Frank Borden6988bdf2021-04-07 14:42:00 +02001541 const mockEvent = (content: string) =>
1542 new CustomEvent('', {detail: {content}});
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001543
1544 element._handleCommitMessageSave(mockEvent('test \n test '));
1545 assert.equal(putStub.lastCall.args[1], 'test\n test');
Milutin Kristoficcfcf0af2022-05-12 21:39:06 +02001546 element.$.commitMessageEditor.disabled = false;
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001547 element._handleCommitMessageSave(mockEvent(' test\ntest'));
1548 assert.equal(putStub.lastCall.args[1], ' test\ntest');
Milutin Kristoficcfcf0af2022-05-12 21:39:06 +02001549 element.$.commitMessageEditor.disabled = false;
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001550 element._handleCommitMessageSave(mockEvent('\n\n\n\n\n\n\n\n'));
1551 assert.equal(putStub.lastCall.args[1], '\n\n\n\n\n\n\n\n');
1552 });
1553
Chris Pouceta2e173e2021-08-31 01:04:04 +00001554 test('topic is coalesced to null', async () => {
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +02001555 sinon.stub(element, '_changeChanged');
Chris Poucetbf65b8f2022-01-18 21:18:12 +00001556 element.getChangeModel().setState({
Ben Rohlfs61bafc22021-11-29 10:40:08 +01001557 loadingStatus: LoadingStatus.LOADED,
Ben Rohlfsa16c51a2021-11-22 12:50:55 +01001558 change: {
Dhruv Srivastavada276592021-04-07 14:51:51 +02001559 ...createChangeViewChange(),
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001560 labels: {},
1561 current_revision: 'foo' as CommitId,
1562 revisions: {foo: createRevision()},
Ben Rohlfsa16c51a2021-11-22 12:50:55 +01001563 },
1564 });
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001565
Dhruv Srivastava21129812021-12-02 15:48:03 +01001566 await element.performPostChangeLoadTasks();
Chris Pouceta2e173e2021-08-31 01:04:04 +00001567 assert.isNull(element._change!.topic);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001568 });
1569
Chris Pouceta2e173e2021-08-31 01:04:04 +00001570 test('commit sha is populated from getChangeDetail', async () => {
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +02001571 sinon.stub(element, '_changeChanged');
Chris Poucetbf65b8f2022-01-18 21:18:12 +00001572 element.getChangeModel().setState({
Ben Rohlfs61bafc22021-11-29 10:40:08 +01001573 loadingStatus: LoadingStatus.LOADED,
Ben Rohlfsa16c51a2021-11-22 12:50:55 +01001574 change: {
Dhruv Srivastavada276592021-04-07 14:51:51 +02001575 ...createChangeViewChange(),
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001576 labels: {},
1577 current_revision: 'foo' as CommitId,
1578 revisions: {foo: createRevision()},
Ben Rohlfsa16c51a2021-11-22 12:50:55 +01001579 },
1580 });
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001581
Dhruv Srivastava21129812021-12-02 15:48:03 +01001582 await element.performPostChangeLoadTasks();
Chris Pouceta2e173e2021-08-31 01:04:04 +00001583 assert.equal('foo', element._commitInfo!.commit);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001584 });
1585
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001586 test('_getBasePatchNum', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001587 const _change: ChangeInfo = {
Dhruv Srivastavada276592021-04-07 14:51:51 +02001588 ...createChangeViewChange(),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001589 revisions: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001590 '98da160735fb81604b4c40e93c368f380539dd0e': createRevision(),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001591 },
1592 };
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001593 const _patchRange: ChangeViewPatchRange = {
1594 basePatchNum: ParentPatchSetNum,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001595 };
1596 assert.equal(element._getBasePatchNum(_change, _patchRange), 'PARENT');
1597
1598 element._prefs = {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001599 ...createPreferences(),
1600 default_base_for_merges: DefaultBase.FIRST_PARENT,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001601 };
1602
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001603 const _change2: ChangeInfo = {
Dhruv Srivastavada276592021-04-07 14:51:51 +02001604 ...createChangeViewChange(),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001605 revisions: {
1606 '98da160735fb81604b4c40e93c368f380539dd0e': {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001607 ...createRevision(1),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001608 commit: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001609 ...createCommit(),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001610 parents: [
1611 {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001612 commit: '6e12bdf1176eb4ab24d8491ba3b6d0704409cde8' as CommitId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001613 subject: 'test',
1614 },
1615 {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001616 commit: '22f7db4754b5d9816fc581f3d9a6c0ef8429c841' as CommitId,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001617 subject: 'test3',
1618 },
1619 ],
1620 },
1621 },
1622 },
1623 };
1624 assert.equal(element._getBasePatchNum(_change2, _patchRange), -1);
1625
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01001626 _patchRange.patchNum = 1 as RevisionPatchSetNum;
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001627 assert.equal(element._getBasePatchNum(_change2, _patchRange), 'PARENT');
1628 });
1629
Chris Pouceta2e173e2021-08-31 01:04:04 +00001630 test('_openReplyDialog called with `ANY` when coming from tap event', async () => {
1631 await flush();
1632 const openStub = sinon.stub(element, '_openReplyDialog');
1633 tap(element.$.replyBtn);
1634 assert(
Ben Rohlfs00049652021-10-25 16:40:38 +02001635 openStub.lastCall.calledWithExactly(FocusTarget.ANY),
Chris Pouceta2e173e2021-08-31 01:04:04 +00001636 '_openReplyDialog should have been passed ANY'
1637 );
1638 assert.equal(openStub.callCount, 1);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001639 });
1640
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001641 test(
1642 '_openReplyDialog called with `BODY` when coming from message reply' +
1643 'event',
Chris Pouceta2e173e2021-08-31 01:04:04 +00001644 async () => {
1645 await flush();
1646 const openStub = sinon.stub(element, '_openReplyDialog');
1647 element.messagesList!.dispatchEvent(
1648 new CustomEvent('reply', {
1649 detail: {message: {message: 'text'}},
1650 composed: true,
1651 bubbles: true,
1652 })
1653 );
Ben Rohlfs00049652021-10-25 16:40:38 +02001654 assert.isTrue(openStub.calledOnce);
1655 assert.equal(openStub.lastCall.args[0], FocusTarget.BODY);
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001656 }
1657 );
1658
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001659 test('reply dialog focus can be controlled', () => {
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +02001660 const openStub = sinon.stub(element, '_openReplyDialog');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001661
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001662 const e = new CustomEvent('show-reply-dialog', {
1663 detail: {value: {ccsOnly: false}},
1664 });
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001665 element._handleShowReplyDialog(e);
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001666 assert(
1667 openStub.lastCall.calledWithExactly(FocusTarget.REVIEWERS),
1668 '_openReplyDialog should have been passed REVIEWERS'
1669 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001670 assert.equal(openStub.callCount, 1);
1671
1672 e.detail.value = {ccsOnly: true};
1673 element._handleShowReplyDialog(e);
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001674 assert(
1675 openStub.lastCall.calledWithExactly(FocusTarget.CCS),
1676 '_openReplyDialog should have been passed CCS'
1677 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001678 assert.equal(openStub.callCount, 2);
1679 });
1680
1681 test('getUrlParameter functionality', () => {
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +02001682 const locationStub = sinon.stub(element, '_getLocationSearch');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001683
1684 locationStub.returns('?test');
1685 assert.equal(element._getUrlParameter('test'), 'test');
1686 locationStub.returns('?test2=12&test=3');
1687 assert.equal(element._getUrlParameter('test'), 'test');
1688 locationStub.returns('');
1689 assert.isNull(element._getUrlParameter('test'));
1690 locationStub.returns('?');
1691 assert.isNull(element._getUrlParameter('test'));
1692 locationStub.returns('?test2');
1693 assert.isNull(element._getUrlParameter('test'));
1694 });
1695
Chris Pouceta2e173e2021-08-31 01:04:04 +00001696 test('revert dialog opened with revert param', async () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001697 const awaitPluginsLoadedStub = sinon
1698 .stub(getPluginLoader(), 'awaitPluginsLoaded')
1699 .callsFake(() => Promise.resolve());
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001700
1701 element._patchRange = {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001702 basePatchNum: ParentPatchSetNum,
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01001703 patchNum: 2 as RevisionPatchSetNum,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001704 };
1705 element._change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +02001706 ...createChangeViewChange(),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001707 revisions: {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001708 rev1: createRevision(1),
1709 rev2: createRevision(2),
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001710 },
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001711 current_revision: 'rev1' as CommitId,
Dmitrii Filippov4e4522e2020-05-06 12:50:49 +02001712 status: ChangeStatus.MERGED,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001713 labels: {},
1714 actions: {},
1715 };
1716
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001717 sinon.stub(element, '_getUrlParameter').callsFake(param => {
1718 assert.equal(param, 'revert');
1719 return param;
1720 });
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001721
Chris Pouceta2e173e2021-08-31 01:04:04 +00001722 const promise = mockPromise();
1723
1724 sinon
1725 .stub(element.$.actions, 'showRevertDialog')
1726 .callsFake(() => promise.resolve());
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001727
1728 element._maybeShowRevertDialog();
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001729 assert.isTrue(awaitPluginsLoadedStub.called);
Chris Pouceta2e173e2021-08-31 01:04:04 +00001730 await promise;
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001731 });
1732
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001733 suite('reply dialog tests', () => {
1734 setup(() => {
Dmitrii Filippov0695d402020-10-22 16:57:57 +02001735 element._change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +02001736 ...createChangeViewChange(),
Ben Rohlfsa16c51a2021-11-22 12:50:55 +01001737 // element has latest info
1738 revisions: {rev1: createRevision()},
Dmitrii Filippov0695d402020-10-22 16:57:57 +02001739 messages: createChangeMessages(1),
Ben Rohlfsa16c51a2021-11-22 12:50:55 +01001740 current_revision: 'rev1' as CommitId,
1741 labels: {},
Dmitrii Filippov0695d402020-10-22 16:57:57 +02001742 };
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001743 });
1744
Chris Pouceta2e173e2021-08-31 01:04:04 +00001745 test('show reply dialog on open-reply-dialog event', async () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001746 const openReplyDialogStub = sinon.stub(element, '_openReplyDialog');
Tao Zhouda7463c2020-07-14 11:17:20 +02001747 element.dispatchEvent(
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001748 new CustomEvent('open-reply-dialog', {
1749 composed: true,
1750 bubbles: true,
1751 detail: {},
1752 })
1753 );
Chris Pouceta2e173e2021-08-31 01:04:04 +00001754 await flush();
1755 assert.isTrue(openReplyDialogStub.calledOnce);
Tao Zhouda7463c2020-07-14 11:17:20 +02001756 });
1757
Ben Rohlfs00049652021-10-25 16:40:38 +02001758 test('reply from comment adds quote text', async () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001759 const e = new CustomEvent('', {
1760 detail: {message: {message: 'quote text'}},
1761 });
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001762 element._handleMessageReply(e);
Ben Rohlfs00049652021-10-25 16:40:38 +02001763 const dialog = await waitQueryAndAssert<GrReplyDialog>(
1764 element,
1765 '#replyDialog'
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001766 );
Ben Rohlfs00049652021-10-25 16:40:38 +02001767 const openSpy = sinon.spy(dialog, 'open');
Chris Poucetefcdb202021-11-22 23:54:26 +01001768 await flush();
Ben Rohlfs00049652021-10-25 16:40:38 +02001769 await waitUntil(() => openSpy.called && !!openSpy.lastCall.args[1]);
1770 assert.equal(openSpy.lastCall.args[1], '> quote text\n\n');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001771 });
1772 });
1773
Chris Pouceta2e173e2021-08-31 01:04:04 +00001774 test('reply button is disabled until server config is loaded', async () => {
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001775 assert.isTrue(element._replyDisabled);
Milutin Kristoficbec88f12020-10-13 16:53:28 +02001776 // fetches the server config on attached
Chris Pouceta2e173e2021-08-31 01:04:04 +00001777 await flush();
1778 assert.isFalse(element._replyDisabled);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001779 });
1780
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001781 test('header class computation', () => {
1782 assert.equal(element._computeHeaderClass(), 'header');
1783 assert.equal(element._computeHeaderClass(true), 'header editMode');
1784 });
1785
Chris Pouceta2e173e2021-08-31 01:04:04 +00001786 test('_maybeScrollToMessage', async () => {
1787 await flush();
1788 const scrollStub = sinon.stub(element.messagesList!, 'scrollToMessage');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001789
Chris Pouceta2e173e2021-08-31 01:04:04 +00001790 element._maybeScrollToMessage('');
1791 assert.isFalse(scrollStub.called);
1792 element._maybeScrollToMessage('message');
1793 assert.isFalse(scrollStub.called);
1794 element._maybeScrollToMessage('#message-TEST');
1795 assert.isTrue(scrollStub.called);
1796 assert.equal(scrollStub.lastCall.args[0], 'TEST');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001797 });
1798
1799 test('topic update reloads related changes', () => {
Milutin Kristofic8803ea02020-12-09 23:34:39 +01001800 flush();
1801 const relatedChanges = element.shadowRoot!.querySelector(
1802 '#relatedChanges'
1803 ) as GrRelatedChangesList;
1804 const reloadStub = sinon.stub(relatedChanges, 'reload');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001805 element.dispatchEvent(new CustomEvent('topic-changed'));
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001806 assert.isTrue(reloadStub.calledOnce);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001807 });
1808
1809 test('_computeEditMode', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001810 const callCompute = (
1811 range: PatchRange,
1812 params: AppElementChangeViewParams
1813 ) =>
1814 element._computeEditMode(
1815 {base: range, path: '', value: range},
1816 {base: params, path: '', value: params}
1817 );
1818 assert.isTrue(
1819 callCompute(
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01001820 {basePatchNum: ParentPatchSetNum, patchNum: 1 as RevisionPatchSetNum},
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001821 {...createAppElementChangeViewParams(), edit: true}
1822 )
1823 );
1824 assert.isFalse(
1825 callCompute(
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01001826 {basePatchNum: ParentPatchSetNum, patchNum: 1 as RevisionPatchSetNum},
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001827 createAppElementChangeViewParams()
1828 )
1829 );
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001830 assert.isTrue(
1831 callCompute(
Dhruv Srivastava591b4902021-03-10 11:48:12 +01001832 {basePatchNum: 1 as BasePatchSetNum, patchNum: EditPatchSetNum},
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001833 createAppElementChangeViewParams()
1834 )
1835 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001836 });
1837
1838 test('_processEdit', () => {
1839 element._patchRange = {};
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001840 const change: ParsedChangeInfo = {
Dhruv Srivastavada276592021-04-07 14:51:51 +02001841 ...createChangeViewChange(),
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001842 current_revision: 'foo' as CommitId,
1843 revisions: {
Ben Rohlfs5e167022021-12-06 11:48:22 +01001844 foo: {...createRevision()},
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001845 },
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001846 };
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001847
Ben Rohlfs1fe7f4d2021-12-06 11:21:49 +01001848 // With no edit, nothing happens.
1849 element._processEdit(change);
1850 assert.equal(element._patchRange.patchNum, undefined);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001851
Ben Rohlfs1fe7f4d2021-12-06 11:21:49 +01001852 change.revisions['bar'] = {
1853 _number: EditPatchSetNum,
1854 basePatchNum: 1 as BasePatchSetNum,
1855 commit: {
1856 ...createCommit(),
1857 commit: 'bar' as CommitId,
1858 },
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001859 fetch: {},
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001860 };
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001861
Ben Rohlfs1fe7f4d2021-12-06 11:21:49 +01001862 // When edit is set, but not patchNum, then switch to edit ps.
1863 element._processEdit(change);
1864 assert.equal(element._patchRange.patchNum, EditPatchSetNum);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001865
Ben Rohlfs1fe7f4d2021-12-06 11:21:49 +01001866 // When edit is set, but patchNum as well, then keep patchNum.
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01001867 element._patchRange.patchNum = 5 as RevisionPatchSetNum;
Ben Rohlfs8ccb2d42021-12-08 11:22:20 +01001868 element.routerPatchNum = 5 as RevisionPatchSetNum;
Ben Rohlfs1fe7f4d2021-12-06 11:21:49 +01001869 element._processEdit(change);
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01001870 assert.equal(element._patchRange.patchNum, 5 as RevisionPatchSetNum);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001871 });
1872
Frank Borden8198a832022-04-11 17:31:15 +02001873 test('file-action-tap handling', async () => {
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001874 element._patchRange = {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001875 basePatchNum: ParentPatchSetNum,
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01001876 patchNum: 1 as RevisionPatchSetNum,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001877 };
Milutin Kristoficbec88f12020-10-13 16:53:28 +02001878 element._change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +02001879 ...createChangeViewChange(),
Milutin Kristoficbec88f12020-10-13 16:53:28 +02001880 };
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001881 const fileList = element.$.fileList;
1882 const Actions = GrEditConstants.Actions;
Milutin Kristofic21b0dc92020-05-18 22:44:11 +02001883 element.$.fileListHeader.editMode = true;
Frank Borden8198a832022-04-11 17:31:15 +02001884 await element.$.fileListHeader.updateComplete;
Ben Rohlfsd47eeb92020-09-25 10:29:48 +02001885 flush();
Frank Borden8198a832022-04-11 17:31:15 +02001886 const controls = queryAndAssert<GrEditControls>(
1887 element.$.fileListHeader,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001888 '#editControls'
Frank Borden8198a832022-04-11 17:31:15 +02001889 );
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001890 const openDeleteDialogStub = sinon.stub(controls, 'openDeleteDialog');
1891 const openRenameDialogStub = sinon.stub(controls, 'openRenameDialog');
1892 const openRestoreDialogStub = sinon.stub(controls, 'openRestoreDialog');
1893 const getEditUrlForDiffStub = sinon.stub(GerritNav, 'getEditUrlForDiff');
1894 const navigateToRelativeUrlStub = sinon.stub(
1895 GerritNav,
1896 'navigateToRelativeUrl'
1897 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001898
1899 // Delete
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001900 fileList.dispatchEvent(
1901 new CustomEvent('file-action-tap', {
1902 detail: {action: Actions.DELETE.id, path: 'foo'},
1903 bubbles: true,
1904 composed: true,
1905 })
1906 );
Ben Rohlfsd47eeb92020-09-25 10:29:48 +02001907 flush();
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001908
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001909 assert.isTrue(openDeleteDialogStub.called);
1910 assert.equal(openDeleteDialogStub.lastCall.args[0], 'foo');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001911
1912 // Restore
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001913 fileList.dispatchEvent(
1914 new CustomEvent('file-action-tap', {
1915 detail: {action: Actions.RESTORE.id, path: 'foo'},
1916 bubbles: true,
1917 composed: true,
1918 })
1919 );
Ben Rohlfsd47eeb92020-09-25 10:29:48 +02001920 flush();
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001921
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001922 assert.isTrue(openRestoreDialogStub.called);
1923 assert.equal(openRestoreDialogStub.lastCall.args[0], 'foo');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001924
1925 // Rename
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001926 fileList.dispatchEvent(
1927 new CustomEvent('file-action-tap', {
1928 detail: {action: Actions.RENAME.id, path: 'foo'},
1929 bubbles: true,
1930 composed: true,
1931 })
1932 );
Ben Rohlfsd47eeb92020-09-25 10:29:48 +02001933 flush();
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001934
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001935 assert.isTrue(openRenameDialogStub.called);
1936 assert.equal(openRenameDialogStub.lastCall.args[0], 'foo');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001937
1938 // Open
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001939 fileList.dispatchEvent(
1940 new CustomEvent('file-action-tap', {
1941 detail: {action: Actions.OPEN.id, path: 'foo'},
1942 bubbles: true,
1943 composed: true,
1944 })
1945 );
Ben Rohlfsd47eeb92020-09-25 10:29:48 +02001946 flush();
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001947
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001948 assert.isTrue(getEditUrlForDiffStub.called);
1949 assert.equal(getEditUrlForDiffStub.lastCall.args[1], 'foo');
1950 assert.equal(getEditUrlForDiffStub.lastCall.args[2], 1 as PatchSetNum);
1951 assert.isTrue(navigateToRelativeUrlStub.called);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001952 });
1953
1954 test('_selectedRevision updates when patchNum is changed', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001955 const revision1: RevisionInfo = createRevision(1);
1956 const revision2: RevisionInfo = createRevision(2);
Chris Poucetbf65b8f2022-01-18 21:18:12 +00001957 element.getChangeModel().setState({
Ben Rohlfs61bafc22021-11-29 10:40:08 +01001958 loadingStatus: LoadingStatus.LOADED,
Ben Rohlfsa16c51a2021-11-22 12:50:55 +01001959 change: {
Dhruv Srivastavada276592021-04-07 14:51:51 +02001960 ...createChangeViewChange(),
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001961 revisions: {
1962 aaa: revision1,
1963 bbb: revision2,
1964 },
1965 labels: {},
1966 actions: {},
1967 current_revision: 'bbb' as CommitId,
Ben Rohlfsa16c51a2021-11-22 12:50:55 +01001968 },
1969 });
1970
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001971 sinon
1972 .stub(element, '_getPreferences')
1973 .returns(Promise.resolve(createPreferences()));
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01001974 element._patchRange = {patchNum: 2 as RevisionPatchSetNum};
Dhruv Srivastava21129812021-12-02 15:48:03 +01001975 return element.performPostChangeLoadTasks().then(() => {
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01001976 assert.strictEqual(element._selectedRevision, revision2);
1977
1978 element.set('_patchRange.patchNum', '1');
1979 assert.strictEqual(element._selectedRevision, revision1);
1980 });
1981 });
1982
Ben Rohlfs1fe7f4d2021-12-06 11:21:49 +01001983 test('_selectedRevision is assigned when patchNum is edit', async () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001984 const revision1 = createRevision(1);
1985 const revision2 = createRevision(2);
1986 const revision3 = createEditRevision();
Chris Poucetbf65b8f2022-01-18 21:18:12 +00001987 element.getChangeModel().setState({
Ben Rohlfs61bafc22021-11-29 10:40:08 +01001988 loadingStatus: LoadingStatus.LOADED,
Ben Rohlfsa16c51a2021-11-22 12:50:55 +01001989 change: {
Dhruv Srivastavada276592021-04-07 14:51:51 +02001990 ...createChangeViewChange(),
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01001991 revisions: {
1992 aaa: revision1,
1993 bbb: revision2,
1994 ccc: revision3,
1995 },
1996 labels: {},
1997 actions: {},
1998 current_revision: 'ccc' as CommitId,
Ben Rohlfsa16c51a2021-11-22 12:50:55 +01001999 },
2000 });
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002001 sinon
2002 .stub(element, '_getPreferences')
2003 .returns(Promise.resolve(createPreferences()));
2004 element._patchRange = {patchNum: EditPatchSetNum};
Ben Rohlfs1fe7f4d2021-12-06 11:21:49 +01002005 await element.performPostChangeLoadTasks();
2006 assert.strictEqual(element._selectedRevision, revision3);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002007 });
2008
2009 test('_sendShowChangeEvent', () => {
Dhruv Srivastavada276592021-04-07 14:51:51 +02002010 const change = {...createChangeViewChange(), labels: {}};
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002011 element._change = {...change};
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01002012 element._patchRange = {patchNum: 4 as RevisionPatchSetNum};
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002013 element._mergeable = true;
Chris Poucetc6e880b2021-11-15 19:57:06 +01002014 const showStub = sinon.stub(element.jsAPI, 'handleEvent');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002015 element._sendShowChangeEvent();
2016 assert.isTrue(showStub.calledOnce);
Ben Rohlfsa47355d2020-08-30 15:56:13 +02002017 assert.equal(showStub.lastCall.args[0], EventType.SHOW_CHANGE);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002018 assert.deepEqual(showStub.lastCall.args[1], {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002019 change,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002020 patchNum: 4,
2021 info: {mergeable: true},
2022 });
2023 });
2024
Dhruv Srivastava254b1da2021-10-27 12:32:44 +02002025 test('patch range changed', () => {
2026 element._patchRange = undefined;
2027 element._change = createChangeViewChange();
Ben Rohlfs3f279682022-02-25 12:07:27 +01002028 element._change.revisions = createRevisions(4);
Dhruv Srivastava254b1da2021-10-27 12:32:44 +02002029 element._change.current_revision = '1' as CommitId;
2030 element._change = {...element._change};
2031
2032 const params = createAppElementChangeViewParams();
2033
2034 assert.isFalse(element.hasPatchRangeChanged(params));
2035 assert.isFalse(element.hasPatchNumChanged(params));
2036
2037 params.basePatchNum = ParentPatchSetNum;
2038 // undefined means navigate to latest patchset
2039 params.patchNum = undefined;
2040
2041 element._patchRange = {
2042 patchNum: 2 as RevisionPatchSetNum,
2043 basePatchNum: ParentPatchSetNum,
2044 };
2045
2046 assert.isTrue(element.hasPatchRangeChanged(params));
2047 assert.isTrue(element.hasPatchNumChanged(params));
2048
2049 element._patchRange = {
2050 patchNum: 4 as RevisionPatchSetNum,
2051 basePatchNum: ParentPatchSetNum,
2052 };
2053
2054 assert.isFalse(element.hasPatchRangeChanged(params));
2055 assert.isFalse(element.hasPatchNumChanged(params));
2056 });
2057
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002058 suite('_handleEditTap', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002059 let fireEdit: () => void;
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002060
2061 setup(() => {
2062 fireEdit = () => {
2063 element.$.actions.dispatchEvent(new CustomEvent('edit-tap'));
2064 };
2065 navigateToChangeStub.restore();
2066
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002067 element._change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +02002068 ...createChangeViewChange(),
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002069 revisions: {rev1: createRevision()},
2070 };
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002071 });
2072
Chris Pouceta2e173e2021-08-31 01:04:04 +00002073 test('edit exists in revisions', async () => {
2074 const promise = mockPromise();
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +02002075 sinon.stub(GerritNav, 'navigateToChange').callsFake((...args) => {
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002076 assert.equal(args.length, 2);
Dhruv Srivastava0633ae12021-11-11 15:16:47 +01002077 assert.equal(args[1]!.patchNum, EditPatchSetNum); // patchNum
Chris Pouceta2e173e2021-08-31 01:04:04 +00002078 promise.resolve();
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002079 });
2080
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002081 element.set('_change.revisions.rev2', {
Ben Rohlfs41039d12021-02-03 17:58:39 +01002082 _number: EditPatchSetNum,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002083 });
Chris Pouceta2e173e2021-08-31 01:04:04 +00002084 await flush();
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002085
2086 fireEdit();
Chris Pouceta2e173e2021-08-31 01:04:04 +00002087 await promise;
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002088 });
2089
Chris Pouceta2e173e2021-08-31 01:04:04 +00002090 test('no edit exists in revisions, non-latest patchset', async () => {
2091 const promise = mockPromise();
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +02002092 sinon.stub(GerritNav, 'navigateToChange').callsFake((...args) => {
Dhruv Srivastava0633ae12021-11-11 15:16:47 +01002093 assert.equal(args.length, 2);
2094 assert.equal(args[1]!.patchNum, 1 as PatchSetNum); // patchNum
2095 assert.equal(args[1]!.isEdit, true); // opt_isEdit
Chris Pouceta2e173e2021-08-31 01:04:04 +00002096 promise.resolve();
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002097 });
2098
2099 element.set('_change.revisions.rev2', {_number: 2});
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01002100 element._patchRange = {patchNum: 1 as RevisionPatchSetNum};
Chris Pouceta2e173e2021-08-31 01:04:04 +00002101 await flush();
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002102
2103 fireEdit();
Chris Pouceta2e173e2021-08-31 01:04:04 +00002104 await promise;
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002105 });
2106
Chris Pouceta2e173e2021-08-31 01:04:04 +00002107 test('no edit exists in revisions, latest patchset', async () => {
2108 const promise = mockPromise();
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +02002109 sinon.stub(GerritNav, 'navigateToChange').callsFake((...args) => {
Dhruv Srivastava0633ae12021-11-11 15:16:47 +01002110 assert.equal(args.length, 2);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002111 // No patch should be specified when patchNum == latest.
Dhruv Srivastava0633ae12021-11-11 15:16:47 +01002112 assert.isNotOk(args[1]!.patchNum); // patchNum
2113 assert.equal(args[1]!.isEdit, true); // opt_isEdit
Chris Pouceta2e173e2021-08-31 01:04:04 +00002114 promise.resolve();
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002115 });
2116
2117 element.set('_change.revisions.rev2', {_number: 2});
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01002118 element._patchRange = {patchNum: 2 as RevisionPatchSetNum};
Chris Pouceta2e173e2021-08-31 01:04:04 +00002119 await flush();
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002120
2121 fireEdit();
Chris Pouceta2e173e2021-08-31 01:04:04 +00002122 await promise;
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002123 });
2124 });
2125
Chris Pouceta2e173e2021-08-31 01:04:04 +00002126 test('_handleStopEditTap', async () => {
Milutin Kristoficbec88f12020-10-13 16:53:28 +02002127 element._change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +02002128 ...createChangeViewChange(),
Milutin Kristoficbec88f12020-10-13 16:53:28 +02002129 };
Milutin Kristofic21b07582022-04-20 08:33:57 +02002130 sinon.stub(element.$.metadata, 'computeLabelNames');
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002131 navigateToChangeStub.restore();
Chris Pouceta2e173e2021-08-31 01:04:04 +00002132 const promise = mockPromise();
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +02002133 sinon.stub(GerritNav, 'navigateToChange').callsFake((...args) => {
Dhruv Srivastava0633ae12021-11-11 15:16:47 +01002134 assert.equal(args.length, 2);
2135 assert.equal(args[1]!.patchNum, 1 as PatchSetNum); // patchNum
Chris Pouceta2e173e2021-08-31 01:04:04 +00002136 promise.resolve();
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002137 });
2138
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01002139 element._patchRange = {patchNum: 1 as RevisionPatchSetNum};
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002140 element.$.actions.dispatchEvent(
2141 new CustomEvent('stop-edit-tap', {bubbles: false})
2142 );
Chris Pouceta2e173e2021-08-31 01:04:04 +00002143 await promise;
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002144 });
2145
2146 suite('plugin endpoints', () => {
Chris Pouceta2e173e2021-08-31 01:04:04 +00002147 test('endpoint params', async () => {
Dhruv Srivastavada276592021-04-07 14:51:51 +02002148 element._change = {...createChangeViewChange(), labels: {}};
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002149 element._selectedRevision = createRevision();
Chris Pouceta2e173e2021-08-31 01:04:04 +00002150 const promise = mockPromise();
Chris Poucetd3f52fd2021-11-29 23:16:39 +01002151 window.Gerrit.install(
2152 promise.resolve,
2153 '0.1',
2154 'http://some/plugins/url.js'
2155 );
Chris Pouceta2e173e2021-08-31 01:04:04 +00002156 await flush();
2157 const plugin: PluginApi = (await promise) as PluginApi;
2158 const hookEl = await plugin
2159 .hook('change-view-integration')
2160 .getLastAttached();
2161 assert.strictEqual((hookEl as any).plugin, plugin);
2162 assert.strictEqual((hookEl as any).change, element._change);
2163 assert.strictEqual((hookEl as any).revision, element._selectedRevision);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002164 });
2165 });
2166
2167 suite('_getMergeability', () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002168 let getMergeableStub: SinonStubbedMember<RestApiService['getMergeable']>;
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002169 setup(() => {
Dhruv Srivastavada276592021-04-07 14:51:51 +02002170 element._change = {...createChangeViewChange(), labels: {}};
Ben Rohlfs3a6ff7e2021-01-18 14:08:39 +01002171 getMergeableStub = stubRestApi('getMergeable').returns(
2172 Promise.resolve({...createMergeable(), mergeable: true})
2173 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002174 });
2175
2176 test('merged change', () => {
2177 element._mergeable = null;
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002178 element._change!.status = ChangeStatus.MERGED;
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002179 return element._getMergeability().then(() => {
2180 assert.isFalse(element._mergeable);
2181 assert.isFalse(getMergeableStub.called);
2182 });
2183 });
2184
2185 test('abandoned change', () => {
2186 element._mergeable = null;
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002187 element._change!.status = ChangeStatus.ABANDONED;
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002188 return element._getMergeability().then(() => {
2189 assert.isFalse(element._mergeable);
2190 assert.isFalse(getMergeableStub.called);
2191 });
2192 });
2193
2194 test('open change', () => {
2195 element._mergeable = null;
2196 return element._getMergeability().then(() => {
2197 assert.isTrue(element._mergeable);
2198 assert.isTrue(getMergeableStub.called);
2199 });
2200 });
2201 });
2202
Paladox none70efbef2021-08-12 05:21:59 +00002203 test('_handleToggleStar called when star is tapped', async () => {
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002204 element._change = {
Dhruv Srivastavada276592021-04-07 14:51:51 +02002205 ...createChangeViewChange(),
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002206 owner: {_account_id: 1 as AccountId},
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002207 starred: false,
2208 };
2209 element._loggedIn = true;
Paladox none70efbef2021-08-12 05:21:59 +00002210 await flush();
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002211
Paladox none70efbef2021-08-12 05:21:59 +00002212 const stub = sinon.stub(element, '_handleToggleStar');
2213
2214 const changeStar = queryAndAssert<GrChangeStar>(element, '#changeStar');
2215 tap(queryAndAssert<HTMLButtonElement>(changeStar, 'button')!);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002216 assert.isTrue(stub.called);
2217 });
2218
2219 suite('gr-reporting tests', () => {
2220 setup(() => {
2221 element._patchRange = {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002222 basePatchNum: ParentPatchSetNum,
Dhruv Srivastava1c41a1b72021-03-11 16:24:53 +01002223 patchNum: 1 as RevisionPatchSetNum,
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002224 };
Dhruv Srivastava21129812021-12-02 15:48:03 +01002225 sinon
2226 .stub(element, 'performPostChangeLoadTasks')
2227 .returns(Promise.resolve(false));
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +02002228 sinon.stub(element, '_getProjectConfig').returns(Promise.resolve());
Dmitrii Filippov7d4f2f32020-06-28 23:14:26 +02002229 sinon.stub(element, '_getMergeability').returns(Promise.resolve());
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002230 sinon.stub(element, '_getLatestCommitMessage').returns(Promise.resolve());
Ben Rohlfs3a6ff7e2021-01-18 14:08:39 +01002231 sinon
2232 .stub(element, '_reloadPatchNumDependentResources')
Dhruv Srivastava09a1b5a2021-01-20 09:28:15 +01002233 .returns(Promise.resolve([undefined, undefined, undefined]));
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002234 });
2235
Chris Pouceta2e173e2021-08-31 01:04:04 +00002236 test("don't report changeDisplayed on reply", async () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002237 const changeDisplayStub = sinon.stub(
Chris Poucetc6e880b2021-11-15 19:57:06 +01002238 element.reporting,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002239 'changeDisplayed'
2240 );
2241 const changeFullyLoadedStub = sinon.stub(
Chris Poucetc6e880b2021-11-15 19:57:06 +01002242 element.reporting,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002243 'changeFullyLoaded'
2244 );
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002245 element._handleReplySent();
Chris Pouceta2e173e2021-08-31 01:04:04 +00002246 await flush();
2247 assert.isFalse(changeDisplayStub.called);
2248 assert.isFalse(changeFullyLoadedStub.called);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002249 });
2250
Ben Rohlfs71a8dee2021-06-22 10:06:15 +02002251 test('report changeDisplayed on _paramsChanged', async () => {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002252 const changeDisplayStub = sinon.stub(
Chris Poucetc6e880b2021-11-15 19:57:06 +01002253 element.reporting,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002254 'changeDisplayed'
2255 );
2256 const changeFullyLoadedStub = sinon.stub(
Chris Poucetc6e880b2021-11-15 19:57:06 +01002257 element.reporting,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002258 'changeFullyLoaded'
2259 );
Dhruv Srivastava49f0a7a2021-10-06 12:03:01 +01002260 // reset so reload is triggered
2261 element._changeNum = undefined;
Ben Rohlfs71a8dee2021-06-22 10:06:15 +02002262 element.params = {
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002263 ...createAppElementChangeViewParams(),
Ben Rohlfsa5356e92021-05-07 11:06:17 +02002264 changeNum: TEST_NUMERIC_CHANGE_ID,
Dmitrii Filippov78448cd2020-10-26 17:39:11 +01002265 project: TEST_PROJECT_NAME,
Ben Rohlfs71a8dee2021-06-22 10:06:15 +02002266 };
Chris Poucetbf65b8f2022-01-18 21:18:12 +00002267 element.getChangeModel().setState({
Dhruv Srivastava21129812021-12-02 15:48:03 +01002268 loadingStatus: LoadingStatus.LOADED,
2269 change: {
2270 ...createChangeViewChange(),
2271 labels: {},
2272 current_revision: 'foo' as CommitId,
2273 revisions: {foo: createRevision()},
2274 },
2275 });
Ben Rohlfs71a8dee2021-06-22 10:06:15 +02002276 await flush();
2277 assert.isTrue(changeDisplayStub.called);
2278 assert.isTrue(changeFullyLoadedStub.called);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002279 });
2280 });
Milutin Kristofice9ddfa42021-04-20 23:34:45 +02002281
2282 test('_calculateHasParent', () => {
2283 const changeId = '123' as ChangeId;
2284 const relatedChanges: RelatedChangeAndCommitInfo[] = [];
2285
2286 assert.equal(element._calculateHasParent(changeId, relatedChanges), false);
2287
2288 relatedChanges.push({
2289 ...createRelatedChangeAndCommitInfo(),
2290 change_id: '123' as ChangeId,
2291 });
2292 assert.equal(element._calculateHasParent(changeId, relatedChanges), false);
2293
2294 relatedChanges.push({
2295 ...createRelatedChangeAndCommitInfo(),
2296 change_id: '234' as ChangeId,
2297 });
2298 assert.equal(element._calculateHasParent(changeId, relatedChanges), true);
2299 });
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +01002300});