Dmitrii Filippov | 06117e8 | 2020-06-25 13:26:55 +0200 | [diff] [blame] | 1 | /** |
| 2 | * @license |
| 3 | * Copyright (C) 2018 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 | */ |
Ole Rehmsen | e5de55e | 2018-08-23 16:52:57 +0200 | [diff] [blame] | 17 | |
Dmitrii Filippov | 06117e8 | 2020-06-25 13:26:55 +0200 | [diff] [blame] | 18 | import '../../../test/common-test-setup-karma.js'; |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 19 | import './gr-diff-host.js'; |
Dmitrii Filippov | 26f9124 | 2020-03-23 20:57:55 +0100 | [diff] [blame] | 20 | import {GrDiffBuilderImage} from '../gr-diff-builder/gr-diff-builder-image.js'; |
Dmitrii Filippov | eb8b269 | 2020-04-06 18:02:35 +0200 | [diff] [blame] | 21 | import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 22 | import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js'; |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 23 | import {sortComments, createCommentThreads} from '../../../utils/comment-util.js'; |
| 24 | import {Side, CommentSide} from '../../../constants/constants.js'; |
Dmitrii Filippov | 0695d40 | 2020-10-22 16:57:57 +0200 | [diff] [blame] | 25 | import {createChange} from '../../../test/test-data-generators.js'; |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 26 | import {FILE} from '../gr-diff/gr-diff-line.js'; |
Dhruv Srivastava | b223df2 | 2020-12-08 17:48:59 +0100 | [diff] [blame] | 27 | import {CoverageType} from '../../../types/types.js'; |
Dmitrii Filippov | 9fcdcb7 | 2020-04-07 13:26:52 +0200 | [diff] [blame] | 28 | |
Dmitrii Filippov | 06117e8 | 2020-06-25 13:26:55 +0200 | [diff] [blame] | 29 | const basicFixture = fixtureFromElement('gr-diff-host'); |
| 30 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 31 | suite('gr-diff-host tests', () => { |
| 32 | let element; |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 33 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 34 | let getLoggedIn; |
Ole Rehmsen | e5de55e | 2018-08-23 16:52:57 +0200 | [diff] [blame] | 35 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 36 | setup(() => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 37 | getLoggedIn = false; |
| 38 | stub('gr-rest-api-interface', { |
| 39 | async getLoggedIn() { return getLoggedIn; }, |
| 40 | }); |
Dmitrii Filippov | 06117e8 | 2020-06-25 13:26:55 +0200 | [diff] [blame] | 41 | element = basicFixture.instantiate(); |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 42 | element.changeNum = 123; |
| 43 | element.path = 'some/path'; |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 44 | sinon.stub(element.reporting, 'time'); |
| 45 | sinon.stub(element.reporting, 'timeEnd'); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 46 | }); |
| 47 | |
| 48 | suite('plugin layers', () => { |
| 49 | const pluginLayers = [{annotate: () => {}}, {annotate: () => {}}]; |
Ole Rehmsen | e5de55e | 2018-08-23 16:52:57 +0200 | [diff] [blame] | 50 | setup(() => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 51 | stub('gr-js-api-interface', { |
| 52 | getDiffLayers() { return pluginLayers; }, |
Ole Rehmsen | 578f921 | 2019-04-11 23:58:56 +0200 | [diff] [blame] | 53 | }); |
Dmitrii Filippov | 06117e8 | 2020-06-25 13:26:55 +0200 | [diff] [blame] | 54 | element = basicFixture.instantiate(); |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 55 | element.changeNum = 123; |
| 56 | element.path = 'some/path'; |
Ole Rehmsen | e5de55e | 2018-08-23 16:52:57 +0200 | [diff] [blame] | 57 | }); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 58 | test('plugin layers requested', () => { |
| 59 | element.patchRange = {}; |
Dmitrii Filippov | 0695d40 | 2020-10-22 16:57:57 +0200 | [diff] [blame] | 60 | element.change = createChange(); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 61 | element.reload(); |
| 62 | assert(element.$.jsAPI.getDiffLayers.called); |
Ole Rehmsen | e5de55e | 2018-08-23 16:52:57 +0200 | [diff] [blame] | 63 | }); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 64 | }); |
Ole Rehmsen | e5de55e | 2018-08-23 16:52:57 +0200 | [diff] [blame] | 65 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 66 | test('thread-discard handling', () => { |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 67 | const threads = createCommentThreads([ |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 68 | { |
| 69 | id: 4711, |
Dhruv Srivastava | ae9ac14 | 2020-12-01 22:57:19 +0100 | [diff] [blame] | 70 | diffSide: Side.LEFT, |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 71 | updated: '2015-12-20 15:01:20.396000000', |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 72 | patch_set: 1, |
| 73 | path: 'some/path', |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 74 | }, |
| 75 | { |
| 76 | id: 42, |
Dhruv Srivastava | ae9ac14 | 2020-12-01 22:57:19 +0100 | [diff] [blame] | 77 | diffSide: Side.LEFT, |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 78 | updated: '2017-12-20 15:01:20.396000000', |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 79 | patch_set: 1, |
| 80 | path: 'some/path', |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 81 | }, |
| 82 | ]); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 83 | element._parentIndex = 1; |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 84 | element.changeNum = 2; |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 85 | element.path = 'some/path'; |
| 86 | element.projectName = 'Some project'; |
| 87 | const threadEls = threads.map( |
| 88 | thread => { |
| 89 | const threadEl = element._createThreadElement(thread); |
| 90 | // Polymer 2 doesn't fire ready events and doesn't execute |
| 91 | // observers if element is not added to the Dom. |
| 92 | // See https://github.com/Polymer/old-docs-site/issues/2322 |
| 93 | // and https://github.com/Polymer/polymer/issues/4526 |
| 94 | element._attachThreadElement(threadEl); |
| 95 | return threadEl; |
Mayank Kumar | 41b0f95 | 2019-10-03 18:04:08 -0700 | [diff] [blame] | 96 | }); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 97 | assert.equal(threadEls.length, 2); |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 98 | assert.equal(threadEls[0].comments[0].id, 4711); |
| 99 | assert.equal(threadEls[1].comments[0].id, 42); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 100 | for (const threadEl of threadEls) { |
Tao Zhou | 93a4ed7 | 2020-08-21 09:52:02 +0200 | [diff] [blame] | 101 | element.appendChild(threadEl); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 102 | } |
Mayank Kumar | 41b0f95 | 2019-10-03 18:04:08 -0700 | [diff] [blame] | 103 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 104 | threadEls[0].dispatchEvent( |
| 105 | new CustomEvent('thread-discard', {detail: {rootId: 4711}})); |
| 106 | const attachedThreads = element.queryAllEffectiveChildren( |
| 107 | 'gr-comment-thread'); |
| 108 | assert.equal(attachedThreads.length, 1); |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 109 | assert.equal(attachedThreads[0].comments[0].id, 42); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 110 | }); |
| 111 | |
| 112 | suite('render reporting', () => { |
| 113 | test('starts total and content timer on render-start', done => { |
| 114 | element.dispatchEvent( |
| 115 | new CustomEvent('render-start', {bubbles: true, composed: true})); |
Milutin Kristofic | da88b33 | 2020-03-24 10:19:12 +0100 | [diff] [blame] | 116 | assert.isTrue(element.reporting.time.calledWithExactly( |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 117 | 'Diff Total Render')); |
Milutin Kristofic | da88b33 | 2020-03-24 10:19:12 +0100 | [diff] [blame] | 118 | assert.isTrue(element.reporting.time.calledWithExactly( |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 119 | 'Diff Content Render')); |
| 120 | done(); |
| 121 | }); |
| 122 | |
| 123 | test('ends content timer on render-content', () => { |
| 124 | element.dispatchEvent( |
| 125 | new CustomEvent('render-content', {bubbles: true, composed: true})); |
Milutin Kristofic | da88b33 | 2020-03-24 10:19:12 +0100 | [diff] [blame] | 126 | assert.isTrue(element.reporting.timeEnd.calledWithExactly( |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 127 | 'Diff Content Render')); |
| 128 | }); |
| 129 | |
Ole | b036826 | 2020-10-12 16:50:24 +0200 | [diff] [blame] | 130 | test('ends total and syntax timer after syntax layer', async () => { |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 131 | sinon.stub(element.reporting, 'diffViewContentDisplayed'); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 132 | let notifySyntaxProcessed; |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 133 | sinon.stub(element.$.syntaxLayer, 'process').returns(new Promise( |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 134 | resolve => { |
| 135 | notifySyntaxProcessed = resolve; |
| 136 | })); |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 137 | sinon.stub(element.restApiService, 'getDiff').returns( |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 138 | Promise.resolve({content: []})); |
| 139 | element.patchRange = {}; |
Dmitrii Filippov | 0695d40 | 2020-10-22 16:57:57 +0200 | [diff] [blame] | 140 | element.change = createChange(); |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 141 | element.restApiService.getDiffPreferences().then(prefs => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 142 | element.prefs = prefs; |
| 143 | return element.reload(true); |
| 144 | }); |
| 145 | // Multiple cascading microtasks are scheduled. |
Ole | b036826 | 2020-10-12 16:50:24 +0200 | [diff] [blame] | 146 | await flush(); |
| 147 | notifySyntaxProcessed(); |
| 148 | // Multiple cascading microtasks are scheduled. |
| 149 | await flush(); |
| 150 | assert.isTrue(element.reporting.timeEnd.calledWithExactly( |
| 151 | 'Diff Total Render')); |
| 152 | assert.isTrue(element.reporting.timeEnd.calledWithExactly( |
| 153 | 'Diff Syntax Render')); |
| 154 | assert.isTrue(element.reporting.diffViewContentDisplayed.called); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 155 | }); |
Mayank Kumar | 41b0f95 | 2019-10-03 18:04:08 -0700 | [diff] [blame] | 156 | |
Ole | b036826 | 2020-10-12 16:50:24 +0200 | [diff] [blame] | 157 | test('ends total timer w/ no syntax layer processing', async () => { |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 158 | sinon.stub(element.restApiService, 'getDiff').returns( |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 159 | Promise.resolve({content: []})); |
| 160 | element.patchRange = {}; |
Dmitrii Filippov | 0695d40 | 2020-10-22 16:57:57 +0200 | [diff] [blame] | 161 | element.change = createChange(); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 162 | element.reload(); |
| 163 | // Multiple cascading microtasks are scheduled. |
Ole | b036826 | 2020-10-12 16:50:24 +0200 | [diff] [blame] | 164 | await flush(); |
| 165 | // Reporting can be called with other parameters (ex. PluginsLoaded), |
| 166 | // but only 'Diff Total Render' is important in this test. |
| 167 | assert.equal( |
| 168 | element.reporting.timeEnd.getCalls() |
| 169 | .filter(call => call.calledWithExactly('Diff Total Render')) |
| 170 | .length, |
| 171 | 1); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 172 | }); |
| 173 | |
Ole | b036826 | 2020-10-12 16:50:24 +0200 | [diff] [blame] | 174 | test('completes reload promise after syntax layer processing', async () => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 175 | let notifySyntaxProcessed; |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 176 | sinon.stub(element.$.syntaxLayer, 'process').returns(new Promise( |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 177 | resolve => { |
| 178 | notifySyntaxProcessed = resolve; |
| 179 | })); |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 180 | sinon.stub(element.restApiService, 'getDiff').returns( |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 181 | Promise.resolve({content: []})); |
| 182 | element.patchRange = {}; |
Dmitrii Filippov | 0695d40 | 2020-10-22 16:57:57 +0200 | [diff] [blame] | 183 | element.change = createChange(); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 184 | let reloadComplete = false; |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 185 | element.restApiService.getDiffPreferences() |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 186 | .then(prefs => { |
| 187 | element.prefs = prefs; |
| 188 | return element.reload(); |
| 189 | }) |
| 190 | .then(() => { |
| 191 | reloadComplete = true; |
| 192 | }); |
| 193 | // Multiple cascading microtasks are scheduled. |
Ole | b036826 | 2020-10-12 16:50:24 +0200 | [diff] [blame] | 194 | await flush(); |
| 195 | assert.isFalse(reloadComplete); |
| 196 | notifySyntaxProcessed(); |
| 197 | // Assert after the notification task is processed. |
| 198 | await flush(); |
| 199 | assert.isTrue(reloadComplete); |
Ole Rehmsen | 578f921 | 2019-04-11 23:58:56 +0200 | [diff] [blame] | 200 | }); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 201 | }); |
Ole Rehmsen | 578f921 | 2019-04-11 23:58:56 +0200 | [diff] [blame] | 202 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 203 | test('reload() cancels before network resolves', () => { |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 204 | const cancelStub = sinon.stub(element.$.diff, 'cancel'); |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 205 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 206 | // Stub the network calls into requests that never resolve. |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 207 | sinon.stub(element, '_getDiff').callsFake(() => new Promise(() => {})); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 208 | element.patchRange = {}; |
Dmitrii Filippov | 0695d40 | 2020-10-22 16:57:57 +0200 | [diff] [blame] | 209 | element.change = createChange(); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 210 | |
Ole | e3ea65d | 2020-10-13 14:59:08 +0200 | [diff] [blame] | 211 | // Needs to be set to something first for it to cancel. |
| 212 | element.diff = { |
| 213 | content: [{ |
| 214 | a: ['foo'], |
| 215 | }], |
| 216 | }; |
| 217 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 218 | element.reload(); |
| 219 | assert.isTrue(cancelStub.called); |
| 220 | }); |
| 221 | |
| 222 | suite('not logged in', () => { |
| 223 | setup(() => { |
| 224 | getLoggedIn = false; |
Dmitrii Filippov | 06117e8 | 2020-06-25 13:26:55 +0200 | [diff] [blame] | 225 | element = basicFixture.instantiate(); |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 226 | element.changeNum = 123; |
Dmitrii Filippov | 0695d40 | 2020-10-22 16:57:57 +0200 | [diff] [blame] | 227 | element.change = createChange(); |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 228 | element.path = 'some/path'; |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 229 | }); |
| 230 | |
| 231 | test('reload() loads files weblinks', () => { |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 232 | const weblinksStub = sinon.stub(GerritNav, '_generateWeblinks') |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 233 | .returns({name: 'stubb', url: '#s'}); |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 234 | sinon.stub(element.restApiService, 'getDiff').returns(Promise.resolve({ |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 235 | content: [], |
| 236 | })); |
| 237 | element.projectName = 'test-project'; |
| 238 | element.path = 'test-path'; |
| 239 | element.commitRange = {baseCommit: 'test-base', commit: 'test-commit'}; |
Tao Zhou | fd9ffb5 | 2019-09-20 13:05:46 +0200 | [diff] [blame] | 240 | element.patchRange = {}; |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 241 | return element.reload().then(() => { |
| 242 | assert.isTrue(weblinksStub.calledTwice); |
| 243 | assert.isTrue(weblinksStub.firstCall.calledWith({ |
| 244 | commit: 'test-base', |
| 245 | file: 'test-path', |
| 246 | options: { |
| 247 | weblinks: undefined, |
| 248 | }, |
| 249 | repo: 'test-project', |
Dmitrii Filippov | eb8b269 | 2020-04-06 18:02:35 +0200 | [diff] [blame] | 250 | type: GerritNav.WeblinkType.FILE})); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 251 | assert.isTrue(weblinksStub.secondCall.calledWith({ |
| 252 | commit: 'test-commit', |
| 253 | file: 'test-path', |
| 254 | options: { |
| 255 | weblinks: undefined, |
| 256 | }, |
| 257 | repo: 'test-project', |
Dmitrii Filippov | eb8b269 | 2020-04-06 18:02:35 +0200 | [diff] [blame] | 258 | type: GerritNav.WeblinkType.FILE})); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 259 | assert.deepEqual(element.filesWeblinks, { |
| 260 | meta_a: [{name: 'stubb', url: '#s'}], |
| 261 | meta_b: [{name: 'stubb', url: '#s'}], |
| 262 | }); |
| 263 | }); |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 264 | }); |
| 265 | |
Milutin Kristofic | 890bee0 | 2020-06-10 17:12:00 +0200 | [diff] [blame] | 266 | test('prefetch getDiff', done => { |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 267 | const diffRestApiStub = sinon.stub(element.restApiService, 'getDiff') |
Milutin Kristofic | 890bee0 | 2020-06-10 17:12:00 +0200 | [diff] [blame] | 268 | .returns(Promise.resolve({content: []})); |
| 269 | element.changeNum = 123; |
| 270 | element.patchRange = {basePatchNum: 1, patchNum: 2}; |
| 271 | element.path = 'file.txt'; |
| 272 | element.prefetchDiff(); |
| 273 | element._getDiff().then(() =>{ |
| 274 | assert.isTrue(diffRestApiStub.calledOnce); |
| 275 | done(); |
| 276 | }); |
| 277 | }); |
| 278 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 279 | test('_getDiff handles null diff responses', done => { |
| 280 | stub('gr-rest-api-interface', { |
| 281 | getDiff() { return Promise.resolve(null); }, |
| 282 | }); |
| 283 | element.changeNum = 123; |
| 284 | element.patchRange = {basePatchNum: 1, patchNum: 2}; |
| 285 | element.path = 'file.txt'; |
| 286 | element._getDiff().then(done); |
| 287 | }); |
| 288 | |
| 289 | test('reload resolves on error', () => { |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 290 | const onErrStub = sinon.stub(element, '_handleGetDiffError'); |
Ole | 5d9d393 | 2020-10-09 17:54:53 +0200 | [diff] [blame] | 291 | const error = new Response(null, {ok: false, status: 500}); |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 292 | sinon.stub(element.restApiService, 'getDiff').callsFake( |
Ole | 5d9d393 | 2020-10-09 17:54:53 +0200 | [diff] [blame] | 293 | (changeNum, basePatchNum, patchNum, path, whitespace, onErr) => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 294 | onErr(error); |
| 295 | }); |
| 296 | element.patchRange = {}; |
| 297 | return element.reload().then(() => { |
| 298 | assert.isTrue(onErrStub.calledOnce); |
| 299 | }); |
| 300 | }); |
| 301 | |
| 302 | suite('_handleGetDiffError', () => { |
| 303 | let serverErrorStub; |
| 304 | let pageErrorStub; |
| 305 | |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 306 | setup(() => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 307 | serverErrorStub = sinon.stub(); |
Ben Rohlfs | ea4cb7e | 2020-12-03 16:00:00 +0100 | [diff] [blame] | 308 | document.addEventListener('server-error', serverErrorStub); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 309 | pageErrorStub = sinon.stub(); |
| 310 | element.addEventListener('page-error', pageErrorStub); |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 311 | }); |
| 312 | |
Ben Rohlfs | ea4cb7e | 2020-12-03 16:00:00 +0100 | [diff] [blame] | 313 | teardown(() => { |
| 314 | document.removeEventListener('server-error', serverErrorStub); |
| 315 | }); |
| 316 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 317 | test('page error on HTTP-409', () => { |
| 318 | element._handleGetDiffError({status: 409}); |
| 319 | assert.isTrue(serverErrorStub.calledOnce); |
| 320 | assert.isFalse(pageErrorStub.called); |
| 321 | assert.isNotOk(element._errorMessage); |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 322 | }); |
| 323 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 324 | test('server error on non-HTTP-409', () => { |
| 325 | element._handleGetDiffError({status: 500}); |
| 326 | assert.isFalse(serverErrorStub.called); |
| 327 | assert.isTrue(pageErrorStub.calledOnce); |
| 328 | assert.isNotOk(element._errorMessage); |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 329 | }); |
| 330 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 331 | test('error message if showLoadFailure', () => { |
| 332 | element.showLoadFailure = true; |
| 333 | element._handleGetDiffError({status: 500, statusText: 'Failure!'}); |
| 334 | assert.isFalse(serverErrorStub.called); |
| 335 | assert.isFalse(pageErrorStub.called); |
| 336 | assert.equal(element._errorMessage, |
| 337 | 'Encountered error when loading the diff: 500 Failure!'); |
| 338 | }); |
| 339 | }); |
| 340 | |
| 341 | suite('image diffs', () => { |
| 342 | let mockFile1; |
| 343 | let mockFile2; |
| 344 | setup(() => { |
| 345 | mockFile1 = { |
| 346 | body: 'Qk06AAAAAAAAADYAAAAoAAAAAQAAAP////8BACAAAAAAAAAAAAATCwAAE' + |
| 347 | 'wsAAAAAAAAAAAAAAAAA/w==', |
| 348 | type: 'image/bmp', |
| 349 | }; |
| 350 | mockFile2 = { |
| 351 | body: 'Qk06AAAAAAAAADYAAAAoAAAAAQAAAP////8BACAAAAAAAAAAAAATCwAAE' + |
| 352 | 'wsAAAAAAAAAAAAA/////w==', |
| 353 | type: 'image/bmp', |
| 354 | }; |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 355 | sinon.stub(element.restApiService, |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 356 | 'getB64FileContents') |
| 357 | .callsFake( |
| 358 | (changeId, patchNum, path, opt_parentIndex) => Promise.resolve( |
| 359 | opt_parentIndex === 1 ? mockFile1 : mockFile2) |
| 360 | ); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 361 | |
| 362 | element.patchRange = {basePatchNum: 'PARENT', patchNum: 1}; |
Dmitrii Filippov | 0695d40 | 2020-10-22 16:57:57 +0200 | [diff] [blame] | 363 | element.change = createChange(); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 364 | element.comments = { |
| 365 | left: [], |
| 366 | right: [], |
| 367 | meta: {patchRange: element.patchRange}, |
| 368 | }; |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 369 | }); |
| 370 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 371 | test('renders image diffs with same file name', done => { |
| 372 | const mockDiff = { |
| 373 | meta_a: {name: 'carrot.jpg', content_type: 'image/jpeg', lines: 66}, |
| 374 | meta_b: {name: 'carrot.jpg', content_type: 'image/jpeg', |
| 375 | lines: 560}, |
| 376 | intraline_status: 'OK', |
| 377 | change_type: 'MODIFIED', |
| 378 | diff_header: [ |
| 379 | 'diff --git a/carrot.jpg b/carrot.jpg', |
| 380 | 'index 2adc47d..f9c2f2c 100644', |
| 381 | '--- a/carrot.jpg', |
| 382 | '+++ b/carrot.jpg', |
| 383 | 'Binary files differ', |
| 384 | ], |
| 385 | content: [{skip: 66}], |
| 386 | binary: true, |
| 387 | }; |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 388 | sinon.stub(element.restApiService, 'getDiff') |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 389 | .returns(Promise.resolve(mockDiff)); |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 390 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 391 | const rendered = () => { |
| 392 | // Recognizes that it should be an image diff. |
| 393 | assert.isTrue(element.isImageDiff); |
| 394 | assert.instanceOf( |
| 395 | element.$.diff.$.diffBuilder._builder, GrDiffBuilderImage); |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 396 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 397 | // Left image rendered with the parent commit's version of the file. |
| 398 | const leftImage = |
| 399 | element.$.diff.$.diffTable.querySelector('td.left img'); |
| 400 | const leftLabel = |
| 401 | element.$.diff.$.diffTable.querySelector('td.left label'); |
| 402 | const leftLabelContent = leftLabel.querySelector('.label'); |
| 403 | const leftLabelName = leftLabel.querySelector('.name'); |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 404 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 405 | const rightImage = |
| 406 | element.$.diff.$.diffTable.querySelector('td.right img'); |
| 407 | const rightLabel = element.$.diff.$.diffTable.querySelector( |
| 408 | 'td.right label'); |
| 409 | const rightLabelContent = rightLabel.querySelector('.label'); |
| 410 | const rightLabelName = rightLabel.querySelector('.name'); |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 411 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 412 | assert.isNotOk(rightLabelName); |
| 413 | assert.isNotOk(leftLabelName); |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 414 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 415 | let leftLoaded = false; |
| 416 | let rightLoaded = false; |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 417 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 418 | leftImage.addEventListener('load', () => { |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 419 | assert.isOk(leftImage); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 420 | assert.equal(leftImage.getAttribute('src'), |
| 421 | 'data:image/bmp;base64, ' + mockFile1.body); |
| 422 | assert.equal(leftLabelContent.textContent, '1×1 image/bmp'); |
| 423 | leftLoaded = true; |
| 424 | if (rightLoaded) { |
| 425 | element.removeEventListener('render', rendered); |
| 426 | done(); |
| 427 | } |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 428 | }); |
| 429 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 430 | rightImage.addEventListener('load', () => { |
| 431 | assert.isOk(rightImage); |
| 432 | assert.equal(rightImage.getAttribute('src'), |
| 433 | 'data:image/bmp;base64, ' + mockFile2.body); |
| 434 | assert.equal(rightLabelContent.textContent, '1×1 image/bmp'); |
| 435 | |
| 436 | rightLoaded = true; |
| 437 | if (leftLoaded) { |
| 438 | element.removeEventListener('render', rendered); |
| 439 | done(); |
| 440 | } |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 441 | }); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 442 | }; |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 443 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 444 | element.addEventListener('render', rendered); |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 445 | |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 446 | element.restApiService.getDiffPreferences().then(prefs => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 447 | element.prefs = prefs; |
| 448 | element.reload(); |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 449 | }); |
| 450 | }); |
| 451 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 452 | test('renders image diffs with a different file name', done => { |
| 453 | const mockDiff = { |
| 454 | meta_a: {name: 'carrot.jpg', content_type: 'image/jpeg', lines: 66}, |
| 455 | meta_b: {name: 'carrot2.jpg', content_type: 'image/jpeg', |
| 456 | lines: 560}, |
| 457 | intraline_status: 'OK', |
| 458 | change_type: 'MODIFIED', |
| 459 | diff_header: [ |
| 460 | 'diff --git a/carrot.jpg b/carrot2.jpg', |
| 461 | 'index 2adc47d..f9c2f2c 100644', |
| 462 | '--- a/carrot.jpg', |
| 463 | '+++ b/carrot2.jpg', |
| 464 | 'Binary files differ', |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 465 | ], |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 466 | content: [{skip: 66}], |
| 467 | binary: true, |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 468 | }; |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 469 | sinon.stub(element.restApiService, 'getDiff') |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 470 | .returns(Promise.resolve(mockDiff)); |
| 471 | |
| 472 | const rendered = () => { |
| 473 | // Recognizes that it should be an image diff. |
| 474 | assert.isTrue(element.isImageDiff); |
| 475 | assert.instanceOf( |
| 476 | element.$.diff.$.diffBuilder._builder, GrDiffBuilderImage); |
| 477 | |
| 478 | // Left image rendered with the parent commit's version of the file. |
| 479 | const leftImage = |
| 480 | element.$.diff.$.diffTable.querySelector('td.left img'); |
| 481 | const leftLabel = |
| 482 | element.$.diff.$.diffTable.querySelector('td.left label'); |
| 483 | const leftLabelContent = leftLabel.querySelector('.label'); |
| 484 | const leftLabelName = leftLabel.querySelector('.name'); |
| 485 | |
| 486 | const rightImage = |
| 487 | element.$.diff.$.diffTable.querySelector('td.right img'); |
| 488 | const rightLabel = element.$.diff.$.diffTable.querySelector( |
| 489 | 'td.right label'); |
| 490 | const rightLabelContent = rightLabel.querySelector('.label'); |
| 491 | const rightLabelName = rightLabel.querySelector('.name'); |
| 492 | |
| 493 | assert.isOk(rightLabelName); |
| 494 | assert.isOk(leftLabelName); |
| 495 | assert.equal(leftLabelName.textContent, mockDiff.meta_a.name); |
| 496 | assert.equal(rightLabelName.textContent, mockDiff.meta_b.name); |
| 497 | |
| 498 | let leftLoaded = false; |
| 499 | let rightLoaded = false; |
| 500 | |
| 501 | leftImage.addEventListener('load', () => { |
| 502 | assert.isOk(leftImage); |
| 503 | assert.equal(leftImage.getAttribute('src'), |
| 504 | 'data:image/bmp;base64, ' + mockFile1.body); |
| 505 | assert.equal(leftLabelContent.textContent, '1×1 image/bmp'); |
| 506 | leftLoaded = true; |
| 507 | if (rightLoaded) { |
| 508 | element.removeEventListener('render', rendered); |
| 509 | done(); |
| 510 | } |
| 511 | }); |
| 512 | |
| 513 | rightImage.addEventListener('load', () => { |
| 514 | assert.isOk(rightImage); |
| 515 | assert.equal(rightImage.getAttribute('src'), |
| 516 | 'data:image/bmp;base64, ' + mockFile2.body); |
| 517 | assert.equal(rightLabelContent.textContent, '1×1 image/bmp'); |
| 518 | |
| 519 | rightLoaded = true; |
| 520 | if (leftLoaded) { |
| 521 | element.removeEventListener('render', rendered); |
| 522 | done(); |
| 523 | } |
| 524 | }); |
| 525 | }; |
| 526 | |
| 527 | element.addEventListener('render', rendered); |
| 528 | |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 529 | element.restApiService.getDiffPreferences().then(prefs => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 530 | element.prefs = prefs; |
| 531 | element.reload(); |
| 532 | }); |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 533 | }); |
| 534 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 535 | test('renders added image', done => { |
| 536 | const mockDiff = { |
| 537 | meta_b: {name: 'carrot.jpg', content_type: 'image/jpeg', |
| 538 | lines: 560}, |
| 539 | intraline_status: 'OK', |
| 540 | change_type: 'ADDED', |
| 541 | diff_header: [ |
| 542 | 'diff --git a/carrot.jpg b/carrot.jpg', |
| 543 | 'index 0000000..f9c2f2c 100644', |
| 544 | '--- /dev/null', |
| 545 | '+++ b/carrot.jpg', |
| 546 | 'Binary files differ', |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 547 | ], |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 548 | content: [{skip: 66}], |
| 549 | binary: true, |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 550 | }; |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 551 | sinon.stub(element.restApiService, 'getDiff') |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 552 | .returns(Promise.resolve(mockDiff)); |
| 553 | |
| 554 | element.addEventListener('render', () => { |
| 555 | // Recognizes that it should be an image diff. |
| 556 | assert.isTrue(element.isImageDiff); |
| 557 | assert.instanceOf( |
| 558 | element.$.diff.$.diffBuilder._builder, GrDiffBuilderImage); |
| 559 | |
| 560 | const leftImage = |
| 561 | element.$.diff.$.diffTable.querySelector('td.left img'); |
| 562 | const rightImage = |
| 563 | element.$.diff.$.diffTable.querySelector('td.right img'); |
| 564 | |
| 565 | assert.isNotOk(leftImage); |
| 566 | assert.isOk(rightImage); |
| 567 | done(); |
| 568 | }); |
| 569 | |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 570 | element.restApiService.getDiffPreferences().then(prefs => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 571 | element.prefs = prefs; |
| 572 | element.reload(); |
| 573 | }); |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 574 | }); |
| 575 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 576 | test('renders removed image', done => { |
| 577 | const mockDiff = { |
| 578 | meta_a: {name: 'carrot.jpg', content_type: 'image/jpeg', |
| 579 | lines: 560}, |
| 580 | intraline_status: 'OK', |
| 581 | change_type: 'DELETED', |
| 582 | diff_header: [ |
| 583 | 'diff --git a/carrot.jpg b/carrot.jpg', |
| 584 | 'index f9c2f2c..0000000 100644', |
| 585 | '--- a/carrot.jpg', |
| 586 | '+++ /dev/null', |
| 587 | 'Binary files differ', |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 588 | ], |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 589 | content: [{skip: 66}], |
| 590 | binary: true, |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 591 | }; |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 592 | sinon.stub(element.restApiService, 'getDiff') |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 593 | .returns(Promise.resolve(mockDiff)); |
| 594 | |
| 595 | element.addEventListener('render', () => { |
| 596 | // Recognizes that it should be an image diff. |
| 597 | assert.isTrue(element.isImageDiff); |
| 598 | assert.instanceOf( |
| 599 | element.$.diff.$.diffBuilder._builder, GrDiffBuilderImage); |
| 600 | |
| 601 | const leftImage = |
| 602 | element.$.diff.$.diffTable.querySelector('td.left img'); |
| 603 | const rightImage = |
| 604 | element.$.diff.$.diffTable.querySelector('td.right img'); |
| 605 | |
| 606 | assert.isOk(leftImage); |
| 607 | assert.isNotOk(rightImage); |
| 608 | done(); |
| 609 | }); |
| 610 | |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 611 | element.restApiService.getDiffPreferences().then(prefs => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 612 | element.prefs = prefs; |
| 613 | element.reload(); |
| 614 | }); |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 615 | }); |
| 616 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 617 | test('does not render disallowed image type', done => { |
| 618 | const mockDiff = { |
| 619 | meta_a: {name: 'carrot.jpg', content_type: 'image/jpeg-evil', |
| 620 | lines: 560}, |
| 621 | intraline_status: 'OK', |
| 622 | change_type: 'DELETED', |
| 623 | diff_header: [ |
| 624 | 'diff --git a/carrot.jpg b/carrot.jpg', |
| 625 | 'index f9c2f2c..0000000 100644', |
| 626 | '--- a/carrot.jpg', |
| 627 | '+++ /dev/null', |
| 628 | 'Binary files differ', |
| 629 | ], |
| 630 | content: [{skip: 66}], |
| 631 | binary: true, |
| 632 | }; |
| 633 | mockFile1.type = 'image/jpeg-evil'; |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 634 | |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 635 | sinon.stub(element.restApiService, 'getDiff') |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 636 | .returns(Promise.resolve(mockDiff)); |
| 637 | |
| 638 | element.addEventListener('render', () => { |
| 639 | // Recognizes that it should be an image diff. |
| 640 | assert.isTrue(element.isImageDiff); |
| 641 | assert.instanceOf( |
| 642 | element.$.diff.$.diffBuilder._builder, GrDiffBuilderImage); |
| 643 | const leftImage = |
| 644 | element.$.diff.$.diffTable.querySelector('td.left img'); |
| 645 | assert.isNotOk(leftImage); |
| 646 | done(); |
| 647 | }); |
| 648 | |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 649 | element.restApiService.getDiffPreferences().then(prefs => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 650 | element.prefs = prefs; |
| 651 | element.reload(); |
| 652 | }); |
| 653 | }); |
| 654 | }); |
| 655 | }); |
| 656 | |
| 657 | test('delegates cancel()', () => { |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 658 | const stub = sinon.stub(element.$.diff, 'cancel'); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 659 | element.patchRange = {}; |
Ole | e3ea65d | 2020-10-13 14:59:08 +0200 | [diff] [blame] | 660 | element.cancel(); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 661 | assert.isTrue(stub.calledOnce); |
| 662 | assert.equal(stub.lastCall.args.length, 0); |
| 663 | }); |
| 664 | |
| 665 | test('delegates getCursorStops()', () => { |
| 666 | const returnValue = [document.createElement('b')]; |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 667 | const stub = sinon.stub(element.$.diff, 'getCursorStops') |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 668 | .returns(returnValue); |
| 669 | assert.equal(element.getCursorStops(), returnValue); |
| 670 | assert.isTrue(stub.calledOnce); |
| 671 | assert.equal(stub.lastCall.args.length, 0); |
| 672 | }); |
| 673 | |
| 674 | test('delegates isRangeSelected()', () => { |
| 675 | const returnValue = true; |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 676 | const stub = sinon.stub(element.$.diff, 'isRangeSelected') |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 677 | .returns(returnValue); |
| 678 | assert.equal(element.isRangeSelected(), returnValue); |
| 679 | assert.isTrue(stub.calledOnce); |
| 680 | assert.equal(stub.lastCall.args.length, 0); |
| 681 | }); |
| 682 | |
| 683 | test('delegates toggleLeftDiff()', () => { |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 684 | const stub = sinon.stub(element.$.diff, 'toggleLeftDiff'); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 685 | element.toggleLeftDiff(); |
| 686 | assert.isTrue(stub.calledOnce); |
| 687 | assert.equal(stub.lastCall.args.length, 0); |
| 688 | }); |
| 689 | |
| 690 | suite('blame', () => { |
| 691 | setup(() => { |
Dmitrii Filippov | 06117e8 | 2020-06-25 13:26:55 +0200 | [diff] [blame] | 692 | element = basicFixture.instantiate(); |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 693 | element.changeNum = 123; |
| 694 | element.path = 'some/path'; |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 695 | }); |
| 696 | |
| 697 | test('clearBlame', () => { |
| 698 | element._blame = []; |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 699 | const setBlameSpy = sinon.spy(element.$.diff.$.diffBuilder, 'setBlame'); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 700 | element.clearBlame(); |
| 701 | assert.isNull(element._blame); |
| 702 | assert.isTrue(setBlameSpy.calledWithExactly(null)); |
| 703 | assert.equal(element.isBlameLoaded, false); |
| 704 | }); |
| 705 | |
| 706 | test('loadBlame', () => { |
| 707 | const mockBlame = [{id: 'commit id', ranges: [{start: 1, end: 2}]}]; |
| 708 | const showAlertStub = sinon.stub(); |
| 709 | element.addEventListener('show-alert', showAlertStub); |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 710 | const getBlameStub = sinon.stub(element.restApiService, 'getBlame') |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 711 | .returns(Promise.resolve(mockBlame)); |
| 712 | element.changeNum = 42; |
| 713 | element.patchRange = {patchNum: 5, basePatchNum: 4}; |
| 714 | element.path = 'foo/bar.baz'; |
| 715 | return element.loadBlame().then(() => { |
| 716 | assert.isTrue(getBlameStub.calledWithExactly( |
| 717 | 42, 5, 'foo/bar.baz', true)); |
| 718 | assert.isFalse(showAlertStub.called); |
| 719 | assert.equal(element._blame, mockBlame); |
| 720 | assert.equal(element.isBlameLoaded, true); |
Ole Rehmsen | b1a7967 | 2018-08-27 22:43:38 +0200 | [diff] [blame] | 721 | }); |
Ole Rehmsen | e5de55e | 2018-08-23 16:52:57 +0200 | [diff] [blame] | 722 | }); |
Wyatt Allen | efc8121 | 2018-08-20 16:40:48 -0700 | [diff] [blame] | 723 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 724 | test('loadBlame empty', () => { |
| 725 | const mockBlame = []; |
| 726 | const showAlertStub = sinon.stub(); |
| 727 | element.addEventListener('show-alert', showAlertStub); |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 728 | sinon.stub(element.restApiService, 'getBlame') |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 729 | .returns(Promise.resolve(mockBlame)); |
| 730 | element.changeNum = 42; |
| 731 | element.patchRange = {patchNum: 5, basePatchNum: 4}; |
| 732 | element.path = 'foo/bar.baz'; |
| 733 | return element.loadBlame() |
| 734 | .then(() => { |
| 735 | assert.isTrue(false, 'Promise should not resolve'); |
| 736 | }) |
| 737 | .catch(() => { |
| 738 | assert.isTrue(showAlertStub.calledOnce); |
| 739 | assert.isNull(element._blame); |
| 740 | assert.equal(element.isBlameLoaded, false); |
| 741 | }); |
| 742 | }); |
| 743 | }); |
| 744 | |
| 745 | test('getThreadEls() returns .comment-threads', () => { |
| 746 | const threadEl = document.createElement('div'); |
| 747 | threadEl.className = 'comment-thread'; |
Tao Zhou | 93a4ed7 | 2020-08-21 09:52:02 +0200 | [diff] [blame] | 748 | element.$.diff.appendChild(threadEl); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 749 | assert.deepEqual(element.getThreadEls(), [threadEl]); |
| 750 | }); |
| 751 | |
| 752 | test('delegates addDraftAtLine(el)', () => { |
| 753 | const param0 = document.createElement('b'); |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 754 | const stub = sinon.stub(element.$.diff, 'addDraftAtLine'); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 755 | element.addDraftAtLine(param0); |
| 756 | assert.isTrue(stub.calledOnce); |
| 757 | assert.equal(stub.lastCall.args.length, 1); |
| 758 | assert.equal(stub.lastCall.args[0], param0); |
| 759 | }); |
| 760 | |
| 761 | test('delegates clearDiffContent()', () => { |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 762 | const stub = sinon.stub(element.$.diff, 'clearDiffContent'); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 763 | element.clearDiffContent(); |
| 764 | assert.isTrue(stub.calledOnce); |
| 765 | assert.equal(stub.lastCall.args.length, 0); |
| 766 | }); |
| 767 | |
| 768 | test('delegates expandAllContext()', () => { |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 769 | const stub = sinon.stub(element.$.diff, 'expandAllContext'); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 770 | element.expandAllContext(); |
| 771 | assert.isTrue(stub.calledOnce); |
| 772 | assert.equal(stub.lastCall.args.length, 0); |
| 773 | }); |
| 774 | |
| 775 | test('passes in changeNum', () => { |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 776 | element.changeNum = 12345; |
| 777 | assert.equal(element.$.diff.changeNum, 12345); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 778 | }); |
| 779 | |
| 780 | test('passes in noAutoRender', () => { |
| 781 | const value = true; |
| 782 | element.noAutoRender = value; |
| 783 | assert.equal(element.$.diff.noAutoRender, value); |
| 784 | }); |
| 785 | |
| 786 | test('passes in patchRange', () => { |
| 787 | const value = {patchNum: 'foo', basePatchNum: 'bar'}; |
| 788 | element.patchRange = value; |
| 789 | assert.equal(element.$.diff.patchRange, value); |
| 790 | }); |
| 791 | |
| 792 | test('passes in path', () => { |
| 793 | const value = 'some/file/path'; |
| 794 | element.path = value; |
| 795 | assert.equal(element.$.diff.path, value); |
| 796 | }); |
| 797 | |
| 798 | test('passes in prefs', () => { |
| 799 | const value = {}; |
| 800 | element.prefs = value; |
| 801 | assert.equal(element.$.diff.prefs, value); |
| 802 | }); |
| 803 | |
| 804 | test('passes in changeNum', () => { |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 805 | element.changeNum = 12345; |
| 806 | assert.equal(element.$.diff.changeNum, 12345); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 807 | }); |
| 808 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 809 | test('passes in displayLine', () => { |
| 810 | const value = true; |
| 811 | element.displayLine = value; |
| 812 | assert.equal(element.$.diff.displayLine, value); |
| 813 | }); |
| 814 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 815 | test('passes in hidden', () => { |
| 816 | const value = true; |
| 817 | element.hidden = value; |
| 818 | assert.equal(element.$.diff.hidden, value); |
| 819 | assert.isNotNull(element.getAttribute('hidden')); |
| 820 | }); |
| 821 | |
| 822 | test('passes in noRenderOnPrefsChange', () => { |
| 823 | const value = true; |
| 824 | element.noRenderOnPrefsChange = value; |
| 825 | assert.equal(element.$.diff.noRenderOnPrefsChange, value); |
| 826 | }); |
| 827 | |
| 828 | test('passes in lineWrapping', () => { |
| 829 | const value = true; |
| 830 | element.lineWrapping = value; |
| 831 | assert.equal(element.$.diff.lineWrapping, value); |
| 832 | }); |
| 833 | |
| 834 | test('passes in viewMode', () => { |
| 835 | const value = 'SIDE_BY_SIDE'; |
| 836 | element.viewMode = value; |
| 837 | assert.equal(element.$.diff.viewMode, value); |
| 838 | }); |
| 839 | |
| 840 | test('passes in lineOfInterest', () => { |
| 841 | const value = {number: 123, leftSide: true}; |
| 842 | element.lineOfInterest = value; |
| 843 | assert.equal(element.$.diff.lineOfInterest, value); |
| 844 | }); |
| 845 | |
| 846 | suite('_reportDiff', () => { |
| 847 | let reportStub; |
| 848 | |
| 849 | setup(() => { |
Dmitrii Filippov | 06117e8 | 2020-06-25 13:26:55 +0200 | [diff] [blame] | 850 | element = basicFixture.instantiate(); |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 851 | element.changeNum = 123; |
Tao Zhou | e0d7c65 | 2020-05-04 11:32:05 +0200 | [diff] [blame] | 852 | element.path = 'file.txt'; |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 853 | element.patchRange = {basePatchNum: 1}; |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 854 | reportStub = sinon.stub(element.reporting, 'reportInteraction'); |
Dhruv Srivastava | b84bf91 | 2020-02-03 19:05:59 +0100 | [diff] [blame] | 855 | }); |
| 856 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 857 | test('null and content-less', () => { |
| 858 | element._reportDiff(null); |
| 859 | assert.isFalse(reportStub.called); |
Ole Rehmsen | 8c8ce2d | 2018-10-12 16:20:57 +0200 | [diff] [blame] | 860 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 861 | element._reportDiff({}); |
| 862 | assert.isFalse(reportStub.called); |
Ole Rehmsen | 8c8ce2d | 2018-10-12 16:20:57 +0200 | [diff] [blame] | 863 | }); |
| 864 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 865 | test('diff w/ no delta', () => { |
| 866 | const diff = { |
| 867 | content: [ |
| 868 | {ab: ['foo', 'bar']}, |
| 869 | {ab: ['baz', 'foo']}, |
| 870 | ], |
| 871 | }; |
| 872 | element._reportDiff(diff); |
| 873 | assert.isTrue(reportStub.calledOnce); |
| 874 | assert.equal(reportStub.lastCall.args[0], 'rebase-percent-zero'); |
| 875 | assert.isUndefined(reportStub.lastCall.args[1]); |
| 876 | }); |
| 877 | |
| 878 | test('diff w/ no rebase delta', () => { |
| 879 | const diff = { |
| 880 | content: [ |
| 881 | {ab: ['foo', 'bar']}, |
| 882 | {a: ['baz', 'foo']}, |
| 883 | {ab: ['foo', 'bar']}, |
| 884 | {a: ['baz', 'foo'], b: ['bar', 'baz']}, |
| 885 | {ab: ['foo', 'bar']}, |
| 886 | {b: ['baz', 'foo']}, |
| 887 | {ab: ['foo', 'bar']}, |
| 888 | ], |
| 889 | }; |
| 890 | element._reportDiff(diff); |
| 891 | assert.isTrue(reportStub.calledOnce); |
| 892 | assert.equal(reportStub.lastCall.args[0], 'rebase-percent-zero'); |
| 893 | assert.isUndefined(reportStub.lastCall.args[1]); |
| 894 | }); |
| 895 | |
| 896 | test('diff w/ some rebase delta', () => { |
| 897 | const diff = { |
| 898 | content: [ |
| 899 | {ab: ['foo', 'bar']}, |
| 900 | {a: ['baz', 'foo'], due_to_rebase: true}, |
| 901 | {ab: ['foo', 'bar']}, |
| 902 | {a: ['baz', 'foo'], b: ['bar', 'baz']}, |
| 903 | {ab: ['foo', 'bar']}, |
| 904 | {b: ['baz', 'foo'], due_to_rebase: true}, |
| 905 | {ab: ['foo', 'bar']}, |
| 906 | {a: ['baz', 'foo']}, |
| 907 | ], |
| 908 | }; |
| 909 | element._reportDiff(diff); |
| 910 | assert.isTrue(reportStub.calledOnce); |
| 911 | assert.isTrue(reportStub.calledWith( |
| 912 | 'rebase-percent-nonzero', |
| 913 | {percentRebaseDelta: 50} |
| 914 | )); |
| 915 | }); |
| 916 | |
| 917 | test('diff w/ all rebase delta', () => { |
| 918 | const diff = {content: [{ |
| 919 | a: ['foo', 'bar'], |
| 920 | b: ['baz', 'foo'], |
| 921 | due_to_rebase: true, |
| 922 | }]}; |
| 923 | element._reportDiff(diff); |
| 924 | assert.isTrue(reportStub.calledOnce); |
| 925 | assert.isTrue(reportStub.calledWith( |
| 926 | 'rebase-percent-nonzero', |
| 927 | {percentRebaseDelta: 100} |
| 928 | )); |
| 929 | }); |
| 930 | |
| 931 | test('diff against parent event', () => { |
| 932 | element.patchRange.basePatchNum = 'PARENT'; |
| 933 | const diff = {content: [{ |
| 934 | a: ['foo', 'bar'], |
| 935 | b: ['baz', 'foo'], |
| 936 | }]}; |
| 937 | element._reportDiff(diff); |
| 938 | assert.isTrue(reportStub.calledOnce); |
| 939 | assert.equal(reportStub.lastCall.args[0], 'diff-against-parent'); |
| 940 | assert.isUndefined(reportStub.lastCall.args[1]); |
| 941 | }); |
| 942 | }); |
| 943 | |
| 944 | test('comments sorting', () => { |
| 945 | const comments = [ |
| 946 | { |
| 947 | id: 'new_draft', |
| 948 | message: 'i do not like either of you', |
Dhruv Srivastava | ae9ac14 | 2020-12-01 22:57:19 +0100 | [diff] [blame] | 949 | diffSide: Side.LEFT, |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 950 | __draft: true, |
| 951 | updated: '2015-12-20 15:01:20.396000000', |
| 952 | }, |
| 953 | { |
| 954 | id: 'sallys_confession', |
Ole Rehmsen | 8c8ce2d | 2018-10-12 16:20:57 +0200 | [diff] [blame] | 955 | message: 'i like you, jack', |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 956 | updated: '2015-12-23 15:00:20.396000000', |
| 957 | line: 1, |
Dhruv Srivastava | ae9ac14 | 2020-12-01 22:57:19 +0100 | [diff] [blame] | 958 | diffSide: Side.LEFT, |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 959 | }, { |
| 960 | id: 'jacks_reply', |
| 961 | message: 'i like you, too', |
| 962 | updated: '2015-12-24 15:01:20.396000000', |
Dhruv Srivastava | ae9ac14 | 2020-12-01 22:57:19 +0100 | [diff] [blame] | 963 | diffSide: Side.LEFT, |
Ole Rehmsen | 8c8ce2d | 2018-10-12 16:20:57 +0200 | [diff] [blame] | 964 | line: 1, |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 965 | in_reply_to: 'sallys_confession', |
| 966 | }, |
| 967 | ]; |
Dhruv Srivastava | bc089d9 | 2020-09-23 16:31:01 +0200 | [diff] [blame] | 968 | const sortedComments = sortComments(comments); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 969 | assert.equal(sortedComments[0], comments[1]); |
| 970 | assert.equal(sortedComments[1], comments[2]); |
| 971 | assert.equal(sortedComments[2], comments[0]); |
| 972 | }); |
Ole Rehmsen | 8c8ce2d | 2018-10-12 16:20:57 +0200 | [diff] [blame] | 973 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 974 | test('_createThreads', () => { |
| 975 | const comments = [ |
| 976 | { |
| 977 | id: 'sallys_confession', |
| 978 | message: 'i like you, jack', |
| 979 | updated: '2015-12-23 15:00:20.396000000', |
| 980 | line: 1, |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 981 | patch_set: 1, |
| 982 | path: 'some/path', |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 983 | }, { |
| 984 | id: 'jacks_reply', |
| 985 | message: 'i like you, too', |
| 986 | updated: '2015-12-24 15:01:20.396000000', |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 987 | line: 1, |
| 988 | in_reply_to: 'sallys_confession', |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 989 | patch_set: 1, |
| 990 | path: 'some/path', |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 991 | }, |
| 992 | { |
| 993 | id: 'new_draft', |
| 994 | message: 'i do not like either of you', |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 995 | __draft: true, |
| 996 | updated: '2015-12-20 15:01:20.396000000', |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 997 | patch_set: 1, |
| 998 | path: 'some/path', |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 999 | }, |
| 1000 | ]; |
| 1001 | |
Dhruv Srivastava | 868f20a | 2020-12-02 15:37:20 +0100 | [diff] [blame] | 1002 | const actualThreads = createCommentThreads(comments, |
| 1003 | {basePatchNum: 1, patchNum: 4}); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1004 | |
| 1005 | assert.equal(actualThreads.length, 2); |
| 1006 | |
Dhruv Srivastava | b223df2 | 2020-12-08 17:48:59 +0100 | [diff] [blame] | 1007 | assert.equal(actualThreads[0].diffSide, Side.LEFT); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1008 | assert.equal(actualThreads[0].comments.length, 2); |
| 1009 | assert.deepEqual(actualThreads[0].comments[0], comments[0]); |
| 1010 | assert.deepEqual(actualThreads[0].comments[1], comments[1]); |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 1011 | assert.equal(actualThreads[0].patchNum, 1); |
| 1012 | assert.equal(actualThreads[0].line, 1); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1013 | |
Dhruv Srivastava | b223df2 | 2020-12-08 17:48:59 +0100 | [diff] [blame] | 1014 | assert.equal(actualThreads[1].diffSide, Side.LEFT); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1015 | assert.equal(actualThreads[1].comments.length, 1); |
| 1016 | assert.deepEqual(actualThreads[1].comments[0], comments[2]); |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 1017 | assert.equal(actualThreads[1].patchNum, 1); |
| 1018 | assert.equal(actualThreads[1].line, FILE); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1019 | }); |
| 1020 | |
Dhruv Srivastava | 868f20a | 2020-12-02 15:37:20 +0100 | [diff] [blame] | 1021 | test('_createThreads derives patchNum and range', () => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1022 | const comments = [{ |
| 1023 | id: 'betsys_confession', |
| 1024 | message: 'i like you, jack', |
| 1025 | updated: '2015-12-24 15:00:10.396000000', |
| 1026 | range: { |
| 1027 | start_line: 1, |
| 1028 | start_character: 1, |
| 1029 | end_line: 1, |
| 1030 | end_character: 2, |
| 1031 | }, |
| 1032 | patch_set: 5, |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 1033 | path: '/p', |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1034 | line: 1, |
| 1035 | }]; |
| 1036 | |
| 1037 | const expectedThreads = [ |
| 1038 | { |
Dhruv Srivastava | b223df2 | 2020-12-08 17:48:59 +0100 | [diff] [blame] | 1039 | diffSide: Side.LEFT, |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 1040 | commentSide: CommentSide.REVISION, |
| 1041 | path: '/p', |
| 1042 | rootId: 'betsys_confession', |
Dhruv Srivastava | 2073c49 | 2020-12-16 16:36:39 +0100 | [diff] [blame] | 1043 | mergeParentNum: undefined, |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1044 | comments: [{ |
| 1045 | id: 'betsys_confession', |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 1046 | path: '/p', |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1047 | message: 'i like you, jack', |
| 1048 | updated: '2015-12-24 15:00:10.396000000', |
Ole Rehmsen | 8c8ce2d | 2018-10-12 16:20:57 +0200 | [diff] [blame] | 1049 | range: { |
| 1050 | start_line: 1, |
| 1051 | start_character: 1, |
| 1052 | end_line: 1, |
| 1053 | end_character: 2, |
| 1054 | }, |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1055 | patch_set: 5, |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1056 | line: 1, |
| 1057 | }], |
| 1058 | patchNum: 5, |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1059 | range: { |
| 1060 | start_line: 1, |
| 1061 | start_character: 1, |
| 1062 | end_line: 1, |
| 1063 | end_character: 2, |
Ole Rehmsen | 8c8ce2d | 2018-10-12 16:20:57 +0200 | [diff] [blame] | 1064 | }, |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 1065 | line: 1, |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1066 | }, |
| 1067 | ]; |
Ole Rehmsen | 8c8ce2d | 2018-10-12 16:20:57 +0200 | [diff] [blame] | 1068 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1069 | assert.deepEqual( |
Dhruv Srivastava | 868f20a | 2020-12-02 15:37:20 +0100 | [diff] [blame] | 1070 | createCommentThreads(comments, {basePatchNum: 5, patchNum: 10}), |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1071 | expectedThreads); |
| 1072 | }); |
Ole Rehmsen | 8c8ce2d | 2018-10-12 16:20:57 +0200 | [diff] [blame] | 1073 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1074 | test('_createThreads does not thread unrelated comments at same location', |
| 1075 | () => { |
| 1076 | const comments = [ |
| 1077 | { |
| 1078 | id: 'sallys_confession', |
| 1079 | message: 'i like you, jack', |
| 1080 | updated: '2015-12-23 15:00:20.396000000', |
Dhruv Srivastava | ae9ac14 | 2020-12-01 22:57:19 +0100 | [diff] [blame] | 1081 | diffSide: Side.LEFT, |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 1082 | path: '/p', |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1083 | }, { |
| 1084 | id: 'jacks_reply', |
| 1085 | message: 'i like you, too', |
| 1086 | updated: '2015-12-24 15:01:20.396000000', |
Dhruv Srivastava | ae9ac14 | 2020-12-01 22:57:19 +0100 | [diff] [blame] | 1087 | diffSide: Side.LEFT, |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 1088 | path: '/p', |
Tao Zhou | 3dba39e | 2019-12-13 15:14:31 +0100 | [diff] [blame] | 1089 | }, |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1090 | ]; |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 1091 | assert.equal(createCommentThreads(comments).length, 2); |
Tao Zhou | 3dba39e | 2019-12-13 15:14:31 +0100 | [diff] [blame] | 1092 | }); |
| 1093 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1094 | test('_getOrCreateThread', () => { |
Dhruv Srivastava | b223df2 | 2020-12-08 17:48:59 +0100 | [diff] [blame] | 1095 | const diffSide = Side.LEFT; |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 1096 | const commentSide = CommentSide.PARENT; |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1097 | |
| 1098 | assert.isOk(element._getOrCreateThread('2', 3, |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 1099 | diffSide, commentSide, '/p')); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1100 | |
| 1101 | let threads = dom(element.$.diff) |
| 1102 | .queryDistributedElements('gr-comment-thread'); |
| 1103 | |
| 1104 | assert.equal(threads.length, 1); |
Dhruv Srivastava | d3fbf8853 | 2020-11-20 14:25:17 +0100 | [diff] [blame] | 1105 | assert.equal(threads[0].diffSide, diffSide); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1106 | assert.equal(threads[0].range, undefined); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1107 | assert.equal(threads[0].patchNum, 2); |
| 1108 | |
| 1109 | // Try to fetch a thread with a different range. |
| 1110 | const range = { |
| 1111 | start_line: 1, |
| 1112 | start_character: 1, |
| 1113 | end_line: 1, |
| 1114 | end_character: 3, |
| 1115 | }; |
| 1116 | |
| 1117 | assert.isOk(element._getOrCreateThread( |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 1118 | '3', 1, diffSide, commentSide, '/p', range)); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1119 | |
| 1120 | threads = dom(element.$.diff) |
| 1121 | .queryDistributedElements('gr-comment-thread'); |
| 1122 | |
| 1123 | assert.equal(threads.length, 2); |
Dhruv Srivastava | d3fbf8853 | 2020-11-20 14:25:17 +0100 | [diff] [blame] | 1124 | assert.equal(threads[1].diffSide, diffSide); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1125 | assert.equal(threads[1].range, range); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1126 | assert.equal(threads[1].patchNum, 3); |
| 1127 | }); |
| 1128 | |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 1129 | test('thread should use old file path if first created ' + |
Tao Zhou | e0d7c65 | 2020-05-04 11:32:05 +0200 | [diff] [blame] | 1130 | 'on patch set (left) before renaming', () => { |
Dhruv Srivastava | b223df2 | 2020-12-08 17:48:59 +0100 | [diff] [blame] | 1131 | const diffSide = Side.LEFT; |
Tao Zhou | e0d7c65 | 2020-05-04 11:32:05 +0200 | [diff] [blame] | 1132 | element.file = {basePath: 'file_renamed.txt', path: element.path}; |
| 1133 | |
| 1134 | assert.isOk(element._getOrCreateThread('2', 3, |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 1135 | diffSide, CommentSide.REVISION, '/p')); |
Tao Zhou | e0d7c65 | 2020-05-04 11:32:05 +0200 | [diff] [blame] | 1136 | |
| 1137 | const threads = dom(element.$.diff) |
| 1138 | .queryDistributedElements('gr-comment-thread'); |
| 1139 | |
| 1140 | assert.equal(threads.length, 1); |
Dhruv Srivastava | d3fbf8853 | 2020-11-20 14:25:17 +0100 | [diff] [blame] | 1141 | assert.equal(threads[0].diffSide, diffSide); |
Tao Zhou | e0d7c65 | 2020-05-04 11:32:05 +0200 | [diff] [blame] | 1142 | assert.equal(threads[0].path, element.file.basePath); |
| 1143 | }); |
| 1144 | |
| 1145 | test('thread should use new file path if first created' + |
| 1146 | 'on patch set (right) after renaming', () => { |
Dhruv Srivastava | b223df2 | 2020-12-08 17:48:59 +0100 | [diff] [blame] | 1147 | const diffSide = Side.RIGHT; |
Tao Zhou | e0d7c65 | 2020-05-04 11:32:05 +0200 | [diff] [blame] | 1148 | element.file = {basePath: 'file_renamed.txt', path: element.path}; |
| 1149 | |
| 1150 | assert.isOk(element._getOrCreateThread('2', 3, |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 1151 | diffSide, CommentSide.REVISION, '/p')); |
Tao Zhou | e0d7c65 | 2020-05-04 11:32:05 +0200 | [diff] [blame] | 1152 | |
| 1153 | const threads = dom(element.$.diff) |
| 1154 | .queryDistributedElements('gr-comment-thread'); |
| 1155 | |
| 1156 | assert.equal(threads.length, 1); |
Dhruv Srivastava | d3fbf8853 | 2020-11-20 14:25:17 +0100 | [diff] [blame] | 1157 | assert.equal(threads[0].diffSide, diffSide); |
Tao Zhou | e0d7c65 | 2020-05-04 11:32:05 +0200 | [diff] [blame] | 1158 | assert.equal(threads[0].path, element.file.path); |
| 1159 | }); |
| 1160 | |
| 1161 | test('thread should use new file path if first created' + |
| 1162 | 'on patch set (left) but is base', () => { |
Dhruv Srivastava | b223df2 | 2020-12-08 17:48:59 +0100 | [diff] [blame] | 1163 | const diffSide = Side.LEFT; |
Tao Zhou | e0d7c65 | 2020-05-04 11:32:05 +0200 | [diff] [blame] | 1164 | element.file = {basePath: 'file_renamed.txt', path: element.path}; |
| 1165 | |
| 1166 | assert.isOk(element._getOrCreateThread('2', 3, |
Dhruv Srivastava | 794db3a | 2020-11-11 11:28:08 +0100 | [diff] [blame] | 1167 | diffSide, CommentSide.PARENT, '/p', undefined)); |
Tao Zhou | e0d7c65 | 2020-05-04 11:32:05 +0200 | [diff] [blame] | 1168 | |
| 1169 | const threads = dom(element.$.diff) |
| 1170 | .queryDistributedElements('gr-comment-thread'); |
| 1171 | |
| 1172 | assert.equal(threads.length, 1); |
Dhruv Srivastava | d3fbf8853 | 2020-11-20 14:25:17 +0100 | [diff] [blame] | 1173 | assert.equal(threads[0].diffSide, diffSide); |
Tao Zhou | e0d7c65 | 2020-05-04 11:32:05 +0200 | [diff] [blame] | 1174 | assert.equal(threads[0].path, element.file.path); |
| 1175 | }); |
| 1176 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1177 | test('_filterThreadElsForLocation with no threads', () => { |
| 1178 | const line = {beforeNumber: 3, afterNumber: 5}; |
| 1179 | |
| 1180 | const threads = []; |
| 1181 | assert.deepEqual(element._filterThreadElsForLocation(threads, line), []); |
| 1182 | assert.deepEqual(element._filterThreadElsForLocation(threads, line, |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 1183 | Side.LEFT), []); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1184 | assert.deepEqual(element._filterThreadElsForLocation(threads, line, |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 1185 | Side.RIGHT), []); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1186 | }); |
| 1187 | |
| 1188 | test('_filterThreadElsForLocation for line comments', () => { |
| 1189 | const line = {beforeNumber: 3, afterNumber: 5}; |
| 1190 | |
| 1191 | const l3 = document.createElement('div'); |
| 1192 | l3.setAttribute('line-num', 3); |
Dhruv Srivastava | b223df2 | 2020-12-08 17:48:59 +0100 | [diff] [blame] | 1193 | l3.setAttribute('diff-side', Side.LEFT); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1194 | |
| 1195 | const l5 = document.createElement('div'); |
| 1196 | l5.setAttribute('line-num', 5); |
Dhruv Srivastava | b223df2 | 2020-12-08 17:48:59 +0100 | [diff] [blame] | 1197 | l5.setAttribute('diff-side', Side.LEFT); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1198 | |
| 1199 | const r3 = document.createElement('div'); |
| 1200 | r3.setAttribute('line-num', 3); |
Dhruv Srivastava | b223df2 | 2020-12-08 17:48:59 +0100 | [diff] [blame] | 1201 | r3.setAttribute('diff-side', Side.RIGHT); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1202 | |
| 1203 | const r5 = document.createElement('div'); |
| 1204 | r5.setAttribute('line-num', 5); |
Dhruv Srivastava | b223df2 | 2020-12-08 17:48:59 +0100 | [diff] [blame] | 1205 | r5.setAttribute('diff-side', Side.RIGHT); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1206 | |
| 1207 | const threadEls = [l3, l5, r3, r5]; |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1208 | assert.deepEqual(element._filterThreadElsForLocation(threadEls, line, |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 1209 | Side.LEFT), [l3]); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1210 | assert.deepEqual(element._filterThreadElsForLocation(threadEls, line, |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 1211 | Side.RIGHT), [r5]); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1212 | }); |
| 1213 | |
| 1214 | test('_filterThreadElsForLocation for file comments', () => { |
| 1215 | const line = {beforeNumber: 'FILE', afterNumber: 'FILE'}; |
| 1216 | |
| 1217 | const l = document.createElement('div'); |
Dhruv Srivastava | b223df2 | 2020-12-08 17:48:59 +0100 | [diff] [blame] | 1218 | l.setAttribute('diff-side', Side.LEFT); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1219 | l.setAttribute('line-num', 'FILE'); |
| 1220 | |
| 1221 | const r = document.createElement('div'); |
Dhruv Srivastava | b223df2 | 2020-12-08 17:48:59 +0100 | [diff] [blame] | 1222 | r.setAttribute('diff-side', Side.RIGHT); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1223 | r.setAttribute('line-num', 'FILE'); |
| 1224 | |
| 1225 | const threadEls = [l, r]; |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1226 | assert.deepEqual(element._filterThreadElsForLocation(threadEls, line, |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 1227 | Side.LEFT), [l]); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1228 | assert.deepEqual(element._filterThreadElsForLocation(threadEls, line, |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 1229 | Side.RIGHT), [r]); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1230 | }); |
| 1231 | |
| 1232 | suite('syntax layer with syntax_highlighting on', () => { |
| 1233 | setup(() => { |
| 1234 | const prefs = { |
| 1235 | line_length: 10, |
| 1236 | show_tabs: true, |
| 1237 | tab_size: 4, |
| 1238 | context: -1, |
| 1239 | syntax_highlighting: true, |
| 1240 | }; |
| 1241 | element.patchRange = {}; |
| 1242 | element.prefs = prefs; |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 1243 | element.changeNum = 123; |
Dmitrii Filippov | 0695d40 | 2020-10-22 16:57:57 +0200 | [diff] [blame] | 1244 | element.change = createChange(); |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 1245 | element.path = 'some/path'; |
Tao Zhou | 3dba39e | 2019-12-13 15:14:31 +0100 | [diff] [blame] | 1246 | }); |
Hermann Loose | 234616a | 2020-02-11 16:54:27 +0100 | [diff] [blame] | 1247 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1248 | test('gr-diff-host provides syntax highlighting layer to gr-diff', () => { |
| 1249 | element.reload(); |
| 1250 | assert.equal(element.$.diff.layers[0], element.$.syntaxLayer); |
| 1251 | }); |
Hermann Loose | 234616a | 2020-02-11 16:54:27 +0100 | [diff] [blame] | 1252 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1253 | test('rendering normal-sized diff does not disable syntax', () => { |
| 1254 | element.diff = { |
| 1255 | content: [{ |
| 1256 | a: ['foo'], |
| 1257 | }], |
| 1258 | }; |
| 1259 | assert.isTrue(element.$.syntaxLayer.enabled); |
| 1260 | }); |
Hermann Loose | 234616a | 2020-02-11 16:54:27 +0100 | [diff] [blame] | 1261 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1262 | test('rendering large diff disables syntax', () => { |
| 1263 | // Before it renders, set the first diff line to 500 '*' characters. |
| 1264 | element.diff = { |
| 1265 | content: [{ |
| 1266 | a: [new Array(501).join('*')], |
| 1267 | }], |
| 1268 | }; |
| 1269 | assert.isFalse(element.$.syntaxLayer.enabled); |
| 1270 | }); |
Hermann Loose | 234616a | 2020-02-11 16:54:27 +0100 | [diff] [blame] | 1271 | |
Ole | b036826 | 2020-10-12 16:50:24 +0200 | [diff] [blame] | 1272 | test('starts syntax layer processing on render event', async () => { |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 1273 | sinon.stub(element.$.syntaxLayer, 'process') |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1274 | .returns(Promise.resolve()); |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 1275 | sinon.stub(element.restApiService, 'getDiff').returns( |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1276 | Promise.resolve({content: []})); |
| 1277 | element.reload(); |
Ole | b036826 | 2020-10-12 16:50:24 +0200 | [diff] [blame] | 1278 | await flush(); |
| 1279 | element.dispatchEvent( |
| 1280 | new CustomEvent('render', {bubbles: true, composed: true})); |
| 1281 | assert.isTrue(element.$.syntaxLayer.process.called); |
Hermann Loose | 234616a | 2020-02-11 16:54:27 +0100 | [diff] [blame] | 1282 | }); |
Ole Rehmsen | e5de55e | 2018-08-23 16:52:57 +0200 | [diff] [blame] | 1283 | }); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1284 | |
David Ostrovsky | a2401c1 | 2020-05-03 19:29:26 +0200 | [diff] [blame] | 1285 | suite('syntax layer with syntax_highlighting off', () => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1286 | setup(() => { |
| 1287 | const prefs = { |
| 1288 | line_length: 10, |
| 1289 | show_tabs: true, |
| 1290 | tab_size: 4, |
| 1291 | context: -1, |
| 1292 | }; |
| 1293 | element.diff = { |
| 1294 | content: [{ |
| 1295 | a: ['foo'], |
| 1296 | }], |
| 1297 | }; |
| 1298 | element.patchRange = {}; |
Dmitrii Filippov | 0695d40 | 2020-10-22 16:57:57 +0200 | [diff] [blame] | 1299 | element.change = createChange(); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1300 | element.prefs = prefs; |
| 1301 | }); |
| 1302 | |
| 1303 | test('gr-diff-host provides syntax highlighting layer', () => { |
| 1304 | element.reload(); |
| 1305 | assert.equal(element.$.diff.layers[0], element.$.syntaxLayer); |
| 1306 | }); |
| 1307 | |
| 1308 | test('syntax layer should be disabled', () => { |
| 1309 | assert.isFalse(element.$.syntaxLayer.enabled); |
| 1310 | }); |
| 1311 | |
| 1312 | test('still disabled for large diff', () => { |
| 1313 | // Before it renders, set the first diff line to 500 '*' characters. |
| 1314 | element.diff = { |
| 1315 | content: [{ |
| 1316 | a: [new Array(501).join('*')], |
| 1317 | }], |
| 1318 | }; |
| 1319 | assert.isFalse(element.$.syntaxLayer.enabled); |
| 1320 | }); |
| 1321 | }); |
| 1322 | |
| 1323 | suite('coverage layer', () => { |
| 1324 | let notifyStub; |
Malgorzata Salawa | 4acc575 | 2020-12-08 13:55:49 +0100 | [diff] [blame] | 1325 | let coverageProviderStub; |
| 1326 | const exampleRanges = [ |
| 1327 | { |
Dhruv Srivastava | b223df2 | 2020-12-08 17:48:59 +0100 | [diff] [blame] | 1328 | type: CoverageType.COVERED, |
| 1329 | side: Side.RIGHT, |
Malgorzata Salawa | 4acc575 | 2020-12-08 13:55:49 +0100 | [diff] [blame] | 1330 | code_range: { |
| 1331 | start_line: 1, |
| 1332 | end_line: 2, |
| 1333 | }, |
| 1334 | }, |
| 1335 | { |
Dhruv Srivastava | b223df2 | 2020-12-08 17:48:59 +0100 | [diff] [blame] | 1336 | type: CoverageType.NOT_COVERED, |
| 1337 | side: Side.RIGHT, |
Malgorzata Salawa | 4acc575 | 2020-12-08 13:55:49 +0100 | [diff] [blame] | 1338 | code_range: { |
| 1339 | start_line: 3, |
| 1340 | end_line: 4, |
| 1341 | }, |
| 1342 | }, |
| 1343 | ]; |
| 1344 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1345 | setup(() => { |
| 1346 | notifyStub = sinon.stub(); |
Malgorzata Salawa | 4acc575 | 2020-12-08 13:55:49 +0100 | [diff] [blame] | 1347 | coverageProviderStub = sinon.stub().returns( |
| 1348 | Promise.resolve(exampleRanges)); |
| 1349 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1350 | stub('gr-js-api-interface', { |
Ben Rohlfs | 65af06d | 2020-09-17 09:22:42 +0200 | [diff] [blame] | 1351 | getCoverageAnnotationApis() { |
| 1352 | return Promise.resolve([{ |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1353 | notify: notifyStub, |
| 1354 | getCoverageProvider() { |
Malgorzata Salawa | 4acc575 | 2020-12-08 13:55:49 +0100 | [diff] [blame] | 1355 | return coverageProviderStub; |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1356 | }, |
Ben Rohlfs | 65af06d | 2020-09-17 09:22:42 +0200 | [diff] [blame] | 1357 | }]); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1358 | }, |
| 1359 | }); |
Dmitrii Filippov | 06117e8 | 2020-06-25 13:26:55 +0200 | [diff] [blame] | 1360 | element = basicFixture.instantiate(); |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 1361 | element.changeNum = 123; |
Dmitrii Filippov | 0695d40 | 2020-10-22 16:57:57 +0200 | [diff] [blame] | 1362 | element.change = createChange(); |
Ben Rohlfs | 1d48706 | 2020-09-26 11:26:03 +0200 | [diff] [blame] | 1363 | element.path = 'some/path'; |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1364 | const prefs = { |
| 1365 | line_length: 10, |
| 1366 | show_tabs: true, |
| 1367 | tab_size: 4, |
| 1368 | context: -1, |
| 1369 | }; |
| 1370 | element.diff = { |
| 1371 | content: [{ |
| 1372 | a: ['foo'], |
| 1373 | }], |
| 1374 | }; |
| 1375 | element.patchRange = {}; |
| 1376 | element.prefs = prefs; |
| 1377 | }); |
| 1378 | |
Ben Rohlfs | 65af06d | 2020-09-17 09:22:42 +0200 | [diff] [blame] | 1379 | test('getCoverageAnnotationApis should be called', done => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1380 | element.reload(); |
| 1381 | flush(() => { |
Ben Rohlfs | 65af06d | 2020-09-17 09:22:42 +0200 | [diff] [blame] | 1382 | assert.isTrue(element.$.jsAPI.getCoverageAnnotationApis.calledOnce); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1383 | done(); |
| 1384 | }); |
| 1385 | }); |
| 1386 | |
| 1387 | test('coverageRangeChanged should be called', done => { |
| 1388 | element.reload(); |
| 1389 | flush(() => { |
| 1390 | assert.equal(notifyStub.callCount, 2); |
Dhruv Srivastava | b223df2 | 2020-12-08 17:48:59 +0100 | [diff] [blame] | 1391 | assert.isTrue(notifyStub.calledWithExactly( |
| 1392 | 'some/path', 1, 2, Side.RIGHT)); |
| 1393 | assert.isTrue(notifyStub.calledWithExactly( |
| 1394 | 'some/path', 3, 4, Side.RIGHT)); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1395 | done(); |
| 1396 | }); |
| 1397 | }); |
Malgorzata Salawa | 4acc575 | 2020-12-08 13:55:49 +0100 | [diff] [blame] | 1398 | |
| 1399 | test('provider is called with appropriate params', done => { |
| 1400 | element.patchRange.basePatchNum = 1; |
| 1401 | element.patchRange.patchNum = 3; |
| 1402 | |
| 1403 | element.reload(); |
| 1404 | flush(() => { |
| 1405 | assert.isTrue(coverageProviderStub.calledWithExactly( |
| 1406 | 123, 'some/path', 1, 3, element.change)); |
| 1407 | done(); |
| 1408 | }); |
| 1409 | }); |
| 1410 | |
| 1411 | test('provider is called with appropriate params - special patchset values', |
| 1412 | done => { |
| 1413 | element.patchRange.basePatchNum = 'PARENT'; |
| 1414 | element.patchRange.patchNum = 'invalid'; |
| 1415 | |
| 1416 | element.reload(); |
| 1417 | flush(() => { |
| 1418 | assert.isTrue(coverageProviderStub.calledWithExactly( |
| 1419 | 123, 'some/path', undefined, undefined, element.change)); |
| 1420 | done(); |
| 1421 | }); |
| 1422 | }); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1423 | }); |
| 1424 | |
| 1425 | suite('trailing newlines', () => { |
| 1426 | setup(() => { |
| 1427 | }); |
| 1428 | |
| 1429 | suite('_lastChunkForSide', () => { |
| 1430 | test('deltas', () => { |
| 1431 | const diff = {content: [ |
| 1432 | {a: ['foo', 'bar'], b: ['baz']}, |
| 1433 | {ab: ['foo', 'bar', 'baz']}, |
| 1434 | {b: ['foo']}, |
| 1435 | ]}; |
| 1436 | assert.equal(element._lastChunkForSide(diff, false), diff.content[2]); |
| 1437 | assert.equal(element._lastChunkForSide(diff, true), diff.content[1]); |
| 1438 | |
| 1439 | diff.content.push({a: ['foo'], b: ['bar']}); |
| 1440 | assert.equal(element._lastChunkForSide(diff, false), diff.content[3]); |
| 1441 | assert.equal(element._lastChunkForSide(diff, true), diff.content[3]); |
| 1442 | }); |
| 1443 | |
| 1444 | test('addition with a undefined', () => { |
| 1445 | const diff = {content: [ |
| 1446 | {b: ['foo', 'bar', 'baz']}, |
| 1447 | ]}; |
| 1448 | assert.equal(element._lastChunkForSide(diff, false), diff.content[0]); |
| 1449 | assert.isNull(element._lastChunkForSide(diff, true)); |
| 1450 | }); |
| 1451 | |
| 1452 | test('addition with a empty', () => { |
| 1453 | const diff = {content: [ |
| 1454 | {a: [], b: ['foo', 'bar', 'baz']}, |
| 1455 | ]}; |
| 1456 | assert.equal(element._lastChunkForSide(diff, false), diff.content[0]); |
| 1457 | assert.isNull(element._lastChunkForSide(diff, true)); |
| 1458 | }); |
| 1459 | |
| 1460 | test('deletion with b undefined', () => { |
| 1461 | const diff = {content: [ |
| 1462 | {a: ['foo', 'bar', 'baz']}, |
| 1463 | ]}; |
| 1464 | assert.isNull(element._lastChunkForSide(diff, false)); |
| 1465 | assert.equal(element._lastChunkForSide(diff, true), diff.content[0]); |
| 1466 | }); |
| 1467 | |
| 1468 | test('deletion with b empty', () => { |
| 1469 | const diff = {content: [ |
| 1470 | {a: ['foo', 'bar', 'baz'], b: []}, |
| 1471 | ]}; |
| 1472 | assert.isNull(element._lastChunkForSide(diff, false)); |
| 1473 | assert.equal(element._lastChunkForSide(diff, true), diff.content[0]); |
| 1474 | }); |
| 1475 | |
| 1476 | test('empty', () => { |
| 1477 | const diff = {content: []}; |
| 1478 | assert.isNull(element._lastChunkForSide(diff, false)); |
| 1479 | assert.isNull(element._lastChunkForSide(diff, true)); |
| 1480 | }); |
| 1481 | }); |
| 1482 | |
| 1483 | suite('_hasTrailingNewlines', () => { |
| 1484 | test('shared no trailing', () => { |
| 1485 | const diff = undefined; |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 1486 | sinon.stub(element, '_lastChunkForSide') |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1487 | .returns({ab: ['foo', 'bar']}); |
| 1488 | assert.isFalse(element._hasTrailingNewlines(diff, false)); |
| 1489 | assert.isFalse(element._hasTrailingNewlines(diff, true)); |
| 1490 | }); |
| 1491 | |
| 1492 | test('delta trailing in right', () => { |
| 1493 | const diff = undefined; |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 1494 | sinon.stub(element, '_lastChunkForSide') |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1495 | .returns({a: ['foo', 'bar'], b: ['baz', '']}); |
| 1496 | assert.isTrue(element._hasTrailingNewlines(diff, false)); |
| 1497 | assert.isFalse(element._hasTrailingNewlines(diff, true)); |
| 1498 | }); |
| 1499 | |
| 1500 | test('addition', () => { |
| 1501 | const diff = undefined; |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 1502 | sinon.stub(element, '_lastChunkForSide').callsFake((diff, leftSide) => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1503 | if (leftSide) { return null; } |
| 1504 | return {b: ['foo', '']}; |
| 1505 | }); |
| 1506 | assert.isTrue(element._hasTrailingNewlines(diff, false)); |
| 1507 | assert.isNull(element._hasTrailingNewlines(diff, true)); |
| 1508 | }); |
| 1509 | |
| 1510 | test('deletion', () => { |
| 1511 | const diff = undefined; |
Dmitrii Filippov | 7d4f2f3 | 2020-06-28 23:14:26 +0200 | [diff] [blame] | 1512 | sinon.stub(element, '_lastChunkForSide').callsFake((diff, leftSide) => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 1513 | if (!leftSide) { return null; } |
| 1514 | return {a: ['foo']}; |
| 1515 | }); |
| 1516 | assert.isNull(element._hasTrailingNewlines(diff, false)); |
| 1517 | assert.isFalse(element._hasTrailingNewlines(diff, true)); |
| 1518 | }); |
| 1519 | }); |
| 1520 | }); |
| 1521 | }); |
Dmitrii Filippov | 06117e8 | 2020-06-25 13:26:55 +0200 | [diff] [blame] | 1522 | |