Merge "Remove old submit requirements from labels and reviewers"
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-reviewer-flow/gr-change-list-reviewer-flow.ts b/polygerrit-ui/app/elements/change-list/gr-change-list-reviewer-flow/gr-change-list-reviewer-flow.ts
index 24719e8..42ff8f6 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-reviewer-flow/gr-change-list-reviewer-flow.ts
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-reviewer-flow/gr-change-list-reviewer-flow.ts
@@ -10,6 +10,7 @@
import {configModelToken} from '../../../models/config/config-model';
import {resolve} from '../../../models/dependency';
import {
+ AccountDetailInfo,
AccountInfo,
ChangeInfo,
NumericChangeId,
@@ -32,6 +33,8 @@
import {getDisplayName} from '../../../utils/display-name-util';
import {AccountInputDetail} from '../../shared/gr-account-list/gr-account-list';
import '@polymer/iron-icon/iron-icon';
+import {getReplyByReason} from '../../../utils/attention-set-util';
+import {intersection} from '../../../utils/common-util';
@customElement('gr-change-list-reviewer-flow')
export class GrChangeListReviewerFlow extends LitElement {
@@ -72,6 +75,8 @@
private isLoggedIn = false;
+ private account?: AccountDetailInfo;
+
static override get styles() {
return css`
gr-dialog {
@@ -125,6 +130,11 @@
() => getAppContext().userModel.loggedIn$,
isLoggedIn => (this.isLoggedIn = isLoggedIn)
);
+ subscribe(
+ this,
+ () => getAppContext().userModel.account$,
+ account => (this.account = account)
+ );
}
override render() {
@@ -335,7 +345,8 @@
])
);
const inFlightActions = this.getBulkActionsModel().addReviewers(
- this.updatedAccountsByReviewerState
+ this.updatedAccountsByReviewerState,
+ getReplyByReason(this.account, this.serverConfig)
);
await allSettled(
@@ -383,13 +394,7 @@
const reviewersPerChange = this.selectedChanges.map(
change => change.reviewers[reviewerState] ?? []
);
- if (reviewersPerChange.length === 0) {
- return [];
- }
- // Gets reviewers present in all changes
- return reviewersPerChange.reduce((a, b) =>
- a.filter(reviewer => b.includes(reviewer))
- );
+ return intersection(reviewersPerChange);
}
private createSuggestionsProvider(
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-reviewer-flow/gr-change-list-reviewer-flow_test.ts b/polygerrit-ui/app/elements/change-list/gr-change-list-reviewer-flow/gr-change-list-reviewer-flow_test.ts
index edcad8f..e34a269 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-reviewer-flow/gr-change-list-reviewer-flow_test.ts
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-reviewer-flow/gr-change-list-reviewer-flow_test.ts
@@ -245,6 +245,14 @@
{reviewer: accounts[2]._account_id, state: ReviewerState.REVIEWER},
{reviewer: accounts[5]._account_id, state: ReviewerState.CC},
],
+ ignore_automatic_attention_set_rules: true,
+ // only the reviewer is added to the attention set, not the cc
+ add_to_attention_set: [
+ {
+ reason: '<GERRIT_ACCOUNT_1> replied on the change',
+ user: accounts[2]._account_id,
+ },
+ ],
},
]);
assert.sameDeepOrderedMembers(saveChangeReviewStub.secondCall.args, [
@@ -255,6 +263,14 @@
{reviewer: accounts[2]._account_id, state: ReviewerState.REVIEWER},
{reviewer: accounts[5]._account_id, state: ReviewerState.CC},
],
+ ignore_automatic_attention_set_rules: true,
+ // only the reviewer is added to the attention set, not the cc
+ add_to_attention_set: [
+ {
+ reason: '<GERRIT_ACCOUNT_1> replied on the change',
+ user: accounts[2]._account_id,
+ },
+ ],
},
]);
});
@@ -357,7 +373,7 @@
);
await flush();
- // prettier and shadoDom string don't agree on long text in divs
+ // prettier and shadowDom string don't agree on long text in divs
expect(element).shadowDom.to.equal(
/* prettier-ignore */
/* HTML */ `
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
index 105c0d8..3db1012 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
@@ -633,6 +633,12 @@
private connected$ = new BehaviorSubject(false);
+ /**
+ * For `connectedCallback()` to distinguish between connecting to the DOM for
+ * the first time or if just re-connecting.
+ */
+ private isFirstConnection = true;
+
/** Simply reflects the router-model value. */
// visible for testing
routerPatchNum?: PatchSetNum;
@@ -649,12 +655,29 @@
'fullscreen-overlay-opened',
() => this._handleHideBackgroundContent()
);
-
this.addEventListener('fullscreen-overlay-closed', () =>
this._handleShowBackgroundContent()
);
-
this.addEventListener('open-reply-dialog', () => this._openReplyDialog());
+ this.addEventListener('change-message-deleted', () => fireReload(this));
+ this.addEventListener('editable-content-save', e =>
+ this._handleCommitMessageSave(e)
+ );
+ this.addEventListener('editable-content-cancel', () =>
+ this._handleCommitMessageCancel()
+ );
+ this.addEventListener('open-fix-preview', e => this._onOpenFixPreview(e));
+ this.addEventListener('close-fix-preview', e => this._onCloseFixPreview(e));
+
+ this.addEventListener(EventType.SHOW_PRIMARY_TAB, e =>
+ this._setActivePrimaryTab(e)
+ );
+ this.addEventListener('reload', e => {
+ this.loadData(
+ /* isLocationChange= */ false,
+ /* clearPatchset= */ e.detail && e.detail.clearPatchset
+ );
+ });
}
private setupSubscriptions() {
@@ -699,24 +722,23 @@
override connectedCallback() {
super.connectedCallback();
+ this.firstConnectedCallback();
this.connected$.next(true);
- this.setupSubscriptions();
- this._throttledToggleChangeStar = throttleWrap<KeyboardEvent>(_ =>
- this._handleToggleChangeStar()
- );
- this._getServerConfig().then(config => {
- this._serverConfig = config;
- this._replyDisabled = false;
- });
- this._getLoggedIn().then(loggedIn => {
- this._loggedIn = loggedIn;
- if (loggedIn) {
- this.restApiService.getAccount().then(acct => {
- this._account = acct;
- });
- }
- });
+ // Make sure to reverse everything below this line in disconnectedCallback().
+ // Or consider using either firstConnectedCallback() or constructor().
+ this.setupSubscriptions();
+ document.addEventListener('visibilitychange', this.handleVisibilityChange);
+ document.addEventListener('scroll', this.handleScroll);
+ }
+
+ /**
+ * For initialization that should only happen once, not again when
+ * re-connecting to the DOM later.
+ */
+ private firstConnectedCallback() {
+ if (!this.isFirstConnection) return;
+ this.isFirstConnection = false;
getPluginLoader()
.awaitPluginsLoaded()
@@ -734,26 +756,21 @@
})
.then(() => this._initActiveTabs(this.params));
- this.addEventListener('change-message-deleted', () => fireReload(this));
- this.addEventListener('editable-content-save', e =>
- this._handleCommitMessageSave(e)
+ this._throttledToggleChangeStar = throttleWrap<KeyboardEvent>(_ =>
+ this._handleToggleChangeStar()
);
- this.addEventListener('editable-content-cancel', () =>
- this._handleCommitMessageCancel()
- );
- this.addEventListener('open-fix-preview', e => this._onOpenFixPreview(e));
- this.addEventListener('close-fix-preview', e => this._onCloseFixPreview(e));
- document.addEventListener('visibilitychange', this.handleVisibilityChange);
- document.addEventListener('scroll', this.handleScroll);
+ this._getServerConfig().then(config => {
+ this._serverConfig = config;
+ this._replyDisabled = false;
+ });
- this.addEventListener(EventType.SHOW_PRIMARY_TAB, e =>
- this._setActivePrimaryTab(e)
- );
- this.addEventListener('reload', e => {
- this.loadData(
- /* isLocationChange= */ false,
- /* clearPatchset= */ e.detail && e.detail.clearPatchset
- );
+ this._getLoggedIn().then(loggedIn => {
+ this._loggedIn = loggedIn;
+ if (loggedIn) {
+ this.restApiService.getAccount().then(acct => {
+ this._account = acct;
+ });
+ }
});
}
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.ts b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.ts
index 8d82e41..66df866 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.ts
@@ -17,11 +17,9 @@
import '../../../test/common-test-setup-karma';
import '../../shared/gr-date-formatter/gr-date-formatter';
import './gr-file-list';
-import {createCommentApiMockWithTemplateElement} from '../../../test/mocks/comment-api';
import {FilesExpandedState} from '../gr-file-list-constants';
import {GerritNav} from '../../core/gr-navigation/gr-navigation';
import {runA11yAudit} from '../../../test/a11y-test-utils';
-import {html} from '@polymer/polymer/lib/utils/html-tag';
import {
listenOnce,
mockPromise,
@@ -61,12 +59,7 @@
import {PolymerDeepPropertyChange} from '@polymer/polymer/interfaces';
import {GrEditFileControls} from '../../edit/gr-edit-file-controls/gr-edit-file-controls';
-const commentApiMock = createCommentApiMockWithTemplateElement(
- 'gr-file-list-comment-api-mock',
- html` <gr-file-list id="fileList"></gr-file-list> `
-);
-
-const basicFixture = fixtureFromElement(commentApiMock.is);
+const basicFixture = fixtureFromElement('gr-file-list');
suite('gr-diff a11y test', () => {
test('audit', async () => {
@@ -85,7 +78,6 @@
suite('gr-file-list tests', () => {
let element: GrFileList;
- let commentApiWrapper: any;
let saveStub: sinon.SinonStub;
@@ -103,8 +95,7 @@
// Element must be wrapped in an element with direct access to the
// comment API.
- commentApiWrapper = basicFixture.instantiate();
- element = commentApiWrapper.$.fileList;
+ element = basicFixture.instantiate();
element._loading = false;
element.diffPrefs = {} as DiffPreferencesInfo;
@@ -1976,8 +1967,7 @@
// Element must be wrapped in an element with direct access to the
// comment API.
- commentApiWrapper = basicFixture.instantiate();
- element = commentApiWrapper.$.fileList;
+ element = basicFixture.instantiate();
element.diffPrefs = {} as DiffPreferencesInfo;
element.change = {
...createParsedChange(),
diff --git a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list_test.ts b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list_test.ts
index b9cb616..ac487f8 100644
--- a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list_test.ts
@@ -17,10 +17,8 @@
import '../../../test/common-test-setup-karma';
import './gr-messages-list';
-import {createCommentApiMockWithTemplateElement} from '../../../test/mocks/comment-api';
import {CombinedMessage, GrMessagesList, TEST_ONLY} from './gr-messages-list';
import {MessageTag} from '../../../constants/constants';
-import {html} from '@polymer/polymer/lib/utils/html-tag';
import {
query,
queryAll,
@@ -43,16 +41,7 @@
import * as MockInteractions from '@polymer/iron-test-helpers/mock-interactions';
import {assertIsDefined} from '../../../utils/common-util';
-createCommentApiMockWithTemplateElement(
- 'gr-messages-list-comment-mock-api',
- html` <gr-messages-list id="messagesList"></gr-messages-list> `
-);
-
-const basicFixture = fixtureFromTemplate(html`
- <gr-messages-list-comment-mock-api>
- <gr-messages-list></gr-messages-list>
- </gr-messages-list-comment-mock-api>
-`);
+const basicFixture = fixtureFromElement('gr-messages-list');
const author = {
_account_id: 42 as AccountId,
@@ -99,8 +88,6 @@
let element: GrMessagesList;
let messages: ChangeMessageInfo[];
- let commentApiWrapper: any;
-
const getMessages = function () {
return queryAll<GrMessage>(element, 'gr-message');
};
@@ -156,13 +143,7 @@
stubRestApi('getDiffDrafts').returns(Promise.resolve({}));
messages = generateRandomMessages(3);
- // Element must be wrapped in an element with direct access to the
- // comment API.
- commentApiWrapper = basicFixture.instantiate();
- element = queryAndAssert<GrMessagesList>(
- commentApiWrapper,
- '#messagesList'
- );
+ element = basicFixture.instantiate();
await element.getCommentsModel().reloadComments(0 as NumericChangeId);
element.messages = messages;
await flush();
@@ -507,8 +488,6 @@
let element: GrMessagesList;
let messages: ChangeMessageInfo[];
- let commentApiWrapper: any;
-
setup(() => {
stubRestApi('getLoggedIn').returns(Promise.resolve(false));
stubRestApi('getDiffComments').returns(Promise.resolve({}));
@@ -529,13 +508,7 @@
}),
];
- // Element must be wrapped in an element with direct access to the
- // comment API.
- commentApiWrapper = basicFixture.instantiate();
- element = queryAndAssert<GrMessagesList>(
- commentApiWrapper,
- '#messagesList'
- );
+ element = basicFixture.instantiate();
element.messages = messages;
flush();
});
diff --git a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.ts b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.ts
index dc501c8..2e48771 100644
--- a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.ts
+++ b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.ts
@@ -20,7 +20,6 @@
import '../../shared/revision-info/revision-info';
import './gr-patch-range-select';
import {GrPatchRangeSelect} from './gr-patch-range-select';
-import '../../../test/mocks/comment-api';
import {RevisionInfo as RevisionInfoClass} from '../../shared/revision-info/revision-info';
import {ChangeComments} from '../gr-comment-api/gr-comment-api';
import {stubRestApi} from '../../../test/test-utils';
diff --git a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view.ts b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view.ts
index 81661e2..76259b9 100644
--- a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view.ts
+++ b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view.ts
@@ -376,9 +376,7 @@
@change=${this.handleToggleDark}
@click=${this.onTapDarkToggle}
></paper-toggle-button>
- <div id="darkThemeToggleLabel">
- Dark theme (the toggle reloads the page)
- </div>
+ <div id="darkThemeToggleLabel">Dark theme</div>
</div>
</section>
<h2
@@ -1161,6 +1159,7 @@
// private but used in test
reloadPage() {
+ fireAlert(this, 'Reloading...');
windowLocationReload();
}
diff --git a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.ts b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.ts
index a514f00..ae42619 100644
--- a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.ts
+++ b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.ts
@@ -177,7 +177,7 @@
>
</paper-toggle-button>
<div id="darkThemeToggleLabel">
- Dark theme (the toggle reloads the page)
+ Dark theme
</div>
</div>
</section>
diff --git a/polygerrit-ui/app/elements/shared/gr-account-list/gr-account-list.ts b/polygerrit-ui/app/elements/shared/gr-account-list/gr-account-list.ts
index 48d6998..3fecd63 100644
--- a/polygerrit-ui/app/elements/shared/gr-account-list/gr-account-list.ts
+++ b/polygerrit-ui/app/elements/shared/gr-account-list/gr-account-list.ts
@@ -167,9 +167,6 @@
@property({type: Array})
removableValues?: AccountInput[];
- @property({type: Number})
- maxCount = 0;
-
/**
* Returns suggestion items
*/
@@ -203,7 +200,7 @@
.group {
--account-label-suffix: ' (group)';
}
- .pending-add {
+ .pendingAdd {
font-style: italic;
}
.list {
@@ -234,8 +231,7 @@
</div>
<gr-account-entry
borderless=""
- ?hidden=${(this.maxCount && this.maxCount <= this.accounts.length) ||
- this.readonly}
+ ?hidden=${this.readonly}
id="entry"
.placeholder=${this.placeholder}
@add=${this.handleAdd}
diff --git a/polygerrit-ui/app/elements/shared/gr-account-list/gr-account-list_test.ts b/polygerrit-ui/app/elements/shared/gr-account-list/gr-account-list_test.ts
index 7b3a93d..26566a3 100644
--- a/polygerrit-ui/app/elements/shared/gr-account-list/gr-account-list_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-account-list/gr-account-list_test.ts
@@ -400,16 +400,6 @@
assert.equal(element.accounts.length, 1);
});
- test('max-count', async () => {
- element.maxCount = 1;
- const acct = makeAccount();
- handleAdd({account: acct, count: 1});
- await element.updateComplete;
- assert.isTrue(
- queryAndAssert<GrAccountEntry>(element, '#entry').hasAttribute('hidden')
- );
- });
-
test('enter text calls suggestions provider', async () => {
const suggestions: Suggestion[] = [
{
diff --git a/polygerrit-ui/app/models/bulk-actions/bulk-actions-model.ts b/polygerrit-ui/app/models/bulk-actions/bulk-actions-model.ts
index c276f79..c80a1cf 100644
--- a/polygerrit-ui/app/models/bulk-actions/bulk-actions-model.ts
+++ b/polygerrit-ui/app/models/bulk-actions/bulk-actions-model.ts
@@ -10,13 +10,18 @@
ChangeStatus,
ReviewerState,
AccountInfo,
+ AccountId,
} from '../../api/rest-api';
import {Model} from '../model';
import {Finalizable} from '../../services/registry';
import {RestApiService} from '../../services/gr-rest-api/gr-rest-api';
import {define} from '../dependency';
import {select} from '../../utils/observable-util';
-import {ReviewInput, ReviewerInput} from '../../types/common';
+import {
+ ReviewInput,
+ ReviewerInput,
+ AttentionSetInput,
+} from '../../types/common';
export const bulkActionsModelToken =
define<BulkActionsModel>('bulk-actions-model');
@@ -154,14 +159,15 @@
}
addReviewers(
- changedReviewers: Map<ReviewerState, AccountInfo[]>
+ changedReviewers: Map<ReviewerState, AccountInfo[]>,
+ reason: string
): Promise<Response>[] {
const current = this.subject$.getValue();
const changes = current.selectedChangeNums.map(
changeNum => current.allChanges.get(changeNum)!
);
return changes.map(change => {
- const reviewersNewToChange = [
+ const reviewersNewToChange: ReviewerInput[] = [
ReviewerState.REVIEWER,
ReviewerState.CC,
].flatMap(state =>
@@ -170,8 +176,20 @@
if (reviewersNewToChange.length === 0) {
return Promise.resolve(new Response());
}
+ const attentionSetUpdates: AttentionSetInput[] = reviewersNewToChange
+ .filter(reviewerInput => reviewerInput.state === ReviewerState.REVIEWER)
+ .map(reviewerInput => {
+ return {
+ // TODO: Once Groups are supported, filter them out and only add
+ // Accounts to the attention set, just like gr-reply-dialog.
+ user: reviewerInput.reviewer as AccountId,
+ reason,
+ };
+ });
const reviewInput: ReviewInput = {
reviewers: reviewersNewToChange,
+ ignore_automatic_attention_set_rules: true,
+ add_to_attention_set: attentionSetUpdates,
};
return this.restApiService.saveChangeReview(
change._number,
diff --git a/polygerrit-ui/app/models/bulk-actions/bulk-actions-model_test.ts b/polygerrit-ui/app/models/bulk-actions/bulk-actions-model_test.ts
index 5347b41..aaf7123 100644
--- a/polygerrit-ui/app/models/bulk-actions/bulk-actions-model_test.ts
+++ b/polygerrit-ui/app/models/bulk-actions/bulk-actions-model_test.ts
@@ -236,7 +236,8 @@
new Map([
[ReviewerState.REVIEWER, [accounts[0]]],
[ReviewerState.CC, [accounts[1]]],
- ])
+ ]),
+ '<GERRIT_ACCOUNT_12345> replied on the change'
);
// changes[0] is not updated since it already has the reviewer & CC
@@ -249,6 +250,13 @@
{reviewer: accounts[0]._account_id, state: ReviewerState.REVIEWER},
{reviewer: accounts[1]._account_id, state: ReviewerState.CC},
],
+ ignore_automatic_attention_set_rules: true,
+ add_to_attention_set: [
+ {
+ reason: '<GERRIT_ACCOUNT_12345> replied on the change',
+ user: accounts[0]._account_id,
+ },
+ ],
},
]);
});
diff --git a/polygerrit-ui/app/services/gr-auth/gr-auth_impl.ts b/polygerrit-ui/app/services/gr-auth/gr-auth_impl.ts
index 5f77e8a..028b2af 100644
--- a/polygerrit-ui/app/services/gr-auth/gr-auth_impl.ts
+++ b/polygerrit-ui/app/services/gr-auth/gr-auth_impl.ts
@@ -62,7 +62,7 @@
static CREDS_EXPIRED_MSG = 'Credentials expired.';
- private authCheckPromise?: Promise<Response>;
+ private authCheckPromise?: Promise<boolean>;
private _last_auth_check_time: number = Date.now();
@@ -100,37 +100,37 @@
Date.now() - this._last_auth_check_time > MAX_AUTH_CHECK_WAIT_TIME_MS
) {
// Refetch after last check expired
- this.authCheckPromise = fetch(`${this.baseUrl}/auth-check`);
+ this.authCheckPromise = fetch(`${this.baseUrl}/auth-check`)
+ .then(res => {
+ // Make a call that requires loading the body of the request. This makes it so that the browser
+ // can close the request even though callers of this method might only ever read headers.
+ // See https://stackoverflow.com/questions/45816743/how-to-solve-this-caution-request-is-not-finished-yet-in-chrome
+ try {
+ res.clone().text();
+ } catch {
+ // Ignore error
+ }
+
+ // auth-check will return 204 if authed
+ // treat the rest as unauthed
+ if (res.status === 204) {
+ this._setStatus(Auth.STATUS.AUTHED);
+ return true;
+ } else {
+ this._setStatus(Auth.STATUS.NOT_AUTHED);
+ return false;
+ }
+ })
+ .catch(() => {
+ this._setStatus(AuthStatus.ERROR);
+ // Reset authCheckPromise to avoid caching the failed promise
+ this.authCheckPromise = undefined;
+ return false;
+ });
this._last_auth_check_time = Date.now();
}
- return this.authCheckPromise
- .then(res => {
- // Make a call that requires loading the body of the request. This makes it so that the browser
- // can close the request even though callers of this method might only ever read headers.
- // See https://stackoverflow.com/questions/45816743/how-to-solve-this-caution-request-is-not-finished-yet-in-chrome
- try {
- res.clone().text();
- } catch {
- // Ignore error
- }
-
- // auth-check will return 204 if authed
- // treat the rest as unauthed
- if (res.status === 204) {
- this._setStatus(Auth.STATUS.AUTHED);
- return true;
- } else {
- this._setStatus(Auth.STATUS.NOT_AUTHED);
- return false;
- }
- })
- .catch(() => {
- this._setStatus(AuthStatus.ERROR);
- // Reset authCheckPromise to avoid caching the failed promise
- this.authCheckPromise = undefined;
- return false;
- });
+ return this.authCheckPromise;
}
clearCache() {
diff --git a/polygerrit-ui/app/test/mocks/comment-api.js b/polygerrit-ui/app/test/mocks/comment-api.js
deleted file mode 100644
index fc4599d..0000000
--- a/polygerrit-ui/app/test/mocks/comment-api.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * @license
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import {PolymerElement} from '@polymer/polymer/polymer-element.js';
-import {LegacyElementMixin} from '@polymer/polymer/lib/legacy/legacy-element-mixin.js';
-
-/**
- * This is an "abstract" class for tests. The descendant must define a template
- * for this element and a tagName - see createCommentApiMockWithTemplateElement below
- */
-class CommentApiMock extends LegacyElementMixin(PolymerElement) {
- static get properties() {
- return {
- _changeComments: Object,
- };
- }
-}
-
-/**
- * Creates a new element which is descendant of CommentApiMock with specified
- * template. Additionally, the method registers a tagName for this element.
- *
- * Each tagName must be a unique accross all tests.
- */
-export function createCommentApiMockWithTemplateElement(tagName, template) {
- const elementClass = class extends CommentApiMock {
- static get is() { return tagName; }
-
- static get template() { return template; }
- };
- customElements.define(tagName, elementClass);
- return elementClass;
-}
diff --git a/polygerrit-ui/app/utils/common-util.ts b/polygerrit-ui/app/utils/common-util.ts
index 6ccf770..95b753c 100644
--- a/polygerrit-ui/app/utils/common-util.ts
+++ b/polygerrit-ui/app/utils/common-util.ts
@@ -159,7 +159,8 @@
/**
* Returns the elements that are present in every sub-array. If a compareBy
- * predicate is passed in, it will be used instead of strict equality.
+ * predicate is passed in, it will be used instead of strict equality. A new
+ * array is always returned even if there is already just a single array.
*/
export function intersection<T>(
arrays: T[][],
@@ -171,6 +172,9 @@
if (arrays.length === 0) {
return [];
}
+ if (arrays.length === 1) {
+ return [...arrays[0]];
+ }
return arrays.reduce((result, array) =>
result.filter(t => array.find(u => compareBy(t, u)))
);
diff --git a/polygerrit-ui/app/utils/common-util_test.ts b/polygerrit-ui/app/utils/common-util_test.ts
index 8cc523a..0adfaa6 100644
--- a/polygerrit-ui/app/utils/common-util_test.ts
+++ b/polygerrit-ui/app/utils/common-util_test.ts
@@ -75,8 +75,11 @@
});
test('intersections', () => {
+ const arrayWithValues = [1, 2, 3];
assert.sameDeepMembers(intersection([]), []);
- assert.sameDeepMembers(intersection([[1, 2, 3]]), [1, 2, 3]);
+ assert.sameDeepMembers(intersection([arrayWithValues]), arrayWithValues);
+ // a new array is returned even if a single array is provided.
+ assert.notStrictEqual(intersection([arrayWithValues]), arrayWithValues);
assert.sameDeepMembers(
intersection([
[1, 2, 3],