summaryrefslogtreecommitdiffstats
path: root/polygerrit-ui/app/elements/change-list/gr-change-list-action-bar/gr-change-list-action-bar_test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'polygerrit-ui/app/elements/change-list/gr-change-list-action-bar/gr-change-list-action-bar_test.ts')
-rw-r--r--polygerrit-ui/app/elements/change-list/gr-change-list-action-bar/gr-change-list-action-bar_test.ts140
1 files changed, 140 insertions, 0 deletions
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-action-bar/gr-change-list-action-bar_test.ts b/polygerrit-ui/app/elements/change-list/gr-change-list-action-bar/gr-change-list-action-bar_test.ts
new file mode 100644
index 0000000000..5804b99c3e
--- /dev/null
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-action-bar/gr-change-list-action-bar_test.ts
@@ -0,0 +1,140 @@
+/**
+ * @license
+ * Copyright 2022 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+import {fixture, html} from '@open-wc/testing-helpers';
+import {
+ BulkActionsModel,
+ bulkActionsModelToken,
+} from '../../../models/bulk-actions/bulk-actions-model';
+import {wrapInProvider} from '../../../models/di-provider-element';
+import {getAppContext} from '../../../services/app-context';
+import '../../../test/common-test-setup-karma';
+import {createChange} from '../../../test/test-data-generators';
+import {
+ query,
+ queryAndAssert,
+ waitUntilObserved,
+} from '../../../test/test-utils';
+import {ChangeInfo, NumericChangeId} from '../../../types/common';
+import './gr-change-list-action-bar';
+import type {GrChangeListActionBar} from './gr-change-list-action-bar';
+
+const change1 = {...createChange(), _number: 1 as NumericChangeId, actions: {}};
+const change2 = {...createChange(), _number: 2 as NumericChangeId, actions: {}};
+
+suite('gr-change-list-action-bar tests', () => {
+ let element: GrChangeListActionBar;
+ let model: BulkActionsModel;
+
+ async function selectChange(change: ChangeInfo) {
+ model.addSelectedChangeNum(change._number);
+ await waitUntilObserved(model.selectedChangeNums$, selectedChangeNums =>
+ selectedChangeNums.includes(change._number)
+ );
+ await element.updateComplete;
+ }
+
+ setup(async () => {
+ model = new BulkActionsModel(getAppContext().restApiService);
+ model.sync([change1, change2]);
+
+ element = (
+ await fixture(
+ wrapInProvider(
+ html`<gr-change-list-action-bar></gr-change-list-action-bar>`,
+ bulkActionsModelToken,
+ model
+ )
+ )
+ ).querySelector('gr-change-list-action-bar')!;
+ await element.updateComplete;
+ });
+
+ test('renders action bar', async () => {
+ await selectChange(change1);
+
+ expect(element).shadowDom.to.equal(/* HTML */ `
+ <td></td>
+ <td><input type="checkbox" /></td>
+ <td>
+ <div class="container">
+ <div class="selectionInfo">
+ <span>1 change selected</span>
+ </div>
+ <div class="actionButtons">
+ <gr-change-list-bulk-vote-flow></gr-change-list-bulk-vote-flow>
+ <gr-change-list-reviewer-flow></gr-change-list-reviewer-flow>
+ <gr-change-list-bulk-abandon-flow>
+ </gr-change-list-bulk-abandon-flow>
+ </div>
+ </div>
+ </td>
+ `);
+ });
+
+ test('label reflects number of selected changes', async () => {
+ // zero case
+ let numSelectedLabel = query<HTMLSpanElement>(
+ element,
+ '.selectionInfo span'
+ );
+ assert.isUndefined(numSelectedLabel);
+
+ // single case
+ await selectChange(change1);
+ numSelectedLabel = queryAndAssert<HTMLSpanElement>(
+ element,
+ '.selectionInfo span'
+ );
+ assert.equal(numSelectedLabel.innerText, '1 change selected');
+
+ // plural case
+ await selectChange(change2);
+
+ numSelectedLabel = queryAndAssert<HTMLSpanElement>(
+ element,
+ '.selectionInfo span'
+ );
+ assert.equal(numSelectedLabel.innerText, '2 changes selected');
+ });
+
+ test('checkbox matches partial and fully selected state', async () => {
+ // zero case
+ let checkbox = queryAndAssert<HTMLInputElement>(element, 'input');
+ assert.isFalse(checkbox.checked);
+ assert.isFalse(checkbox.indeterminate);
+
+ // partial case
+ await selectChange(change1);
+ checkbox = queryAndAssert<HTMLInputElement>(element, 'input');
+ assert.isTrue(checkbox.indeterminate);
+
+ // plural case
+ await selectChange(change2);
+
+ checkbox = queryAndAssert<HTMLInputElement>(element, 'input');
+ assert.isFalse(checkbox.indeterminate);
+ assert.isTrue(checkbox.checked);
+ });
+
+ test('clicking checkbox clears selection', async () => {
+ await selectChange(change1);
+ await selectChange(change2);
+ let selectedChangeNums = await waitUntilObserved(
+ model.selectedChangeNums$,
+ s => s.length === 2
+ );
+ assert.sameMembers(selectedChangeNums, [change1._number, change2._number]);
+
+ const checkbox = queryAndAssert<HTMLInputElement>(element, 'input');
+ checkbox.click();
+
+ selectedChangeNums = await waitUntilObserved(
+ model.selectedChangeNums$,
+ s => s.length === 0
+ );
+ assert.isEmpty(selectedChangeNums);
+ });
+});