summaryrefslogtreecommitdiffstats
path: root/polygerrit-ui/app/elements/change-list/gr-change-list-section/gr-change-list-section_test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'polygerrit-ui/app/elements/change-list/gr-change-list-section/gr-change-list-section_test.ts')
-rw-r--r--polygerrit-ui/app/elements/change-list/gr-change-list-section/gr-change-list-section_test.ts294
1 files changed, 294 insertions, 0 deletions
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-section/gr-change-list-section_test.ts b/polygerrit-ui/app/elements/change-list/gr-change-list-section/gr-change-list-section_test.ts
new file mode 100644
index 0000000000..6a09c45cb5
--- /dev/null
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-section/gr-change-list-section_test.ts
@@ -0,0 +1,294 @@
+/**
+ * @license
+ * Copyright 2022 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import {
+ GrChangeListSection,
+ computeLabelShortcut,
+} from './gr-change-list-section';
+import '../../../test/common-test-setup-karma';
+import './gr-change-list-section';
+import {
+ createChange,
+ createAccountDetailWithId,
+ createServerInfo,
+} from '../../../test/test-data-generators';
+import {NumericChangeId, ChangeInfoId} from '../../../api/rest-api';
+import {
+ queryAll,
+ query,
+ queryAndAssert,
+ stubFlags,
+ waitUntilObserved,
+} from '../../../test/test-utils';
+import {GrChangeListItem} from '../gr-change-list-item/gr-change-list-item';
+import {columnNames, ChangeListSection} from '../gr-change-list/gr-change-list';
+import {fixture, html} from '@open-wc/testing-helpers';
+
+suite('gr-change-list section', () => {
+ let element: GrChangeListSection;
+
+ setup(async () => {
+ const changeSection: ChangeListSection = {
+ name: 'test',
+ query: 'test',
+ results: [
+ {
+ ...createChange(),
+ _number: 0 as NumericChangeId,
+ id: '0' as ChangeInfoId,
+ },
+ {
+ ...createChange(),
+ _number: 1 as NumericChangeId,
+ id: '1' as ChangeInfoId,
+ },
+ ],
+ emptyStateSlotName: 'test',
+ };
+ element = await fixture<GrChangeListSection>(
+ html`<gr-change-list-section
+ .account=${createAccountDetailWithId(1)}
+ .config=${createServerInfo()}
+ .visibleChangeTableColumns=${columnNames}
+ .changeSection=${changeSection}
+ ></gr-change-list-section> `
+ );
+ });
+
+ test('selection checkbox is only shown if experiment is enabled', async () => {
+ assert.isNotOk(query(element, '.selection'));
+
+ stubFlags('isEnabled').returns(true);
+ element.requestUpdate();
+ await element.updateComplete;
+
+ assert.isOk(query(element, '.selection'));
+ });
+
+ test('selection header is only shown if experiment is enabled', async () => {
+ element.bulkActionsModel.setState({
+ ...element.bulkActionsModel.getState(),
+ selectedChangeNums: [1 as NumericChangeId],
+ });
+ await waitUntilObserved(
+ element.bulkActionsModel.selectedChangeNums$,
+ s => s.length === 1
+ );
+
+ assert.isNotOk(query(element, 'gr-change-list-action-bar'));
+ stubFlags('isEnabled').returns(true);
+ element.requestUpdate();
+ await element.updateComplete;
+ queryAndAssert(element, 'gr-change-list-action-bar');
+ });
+
+ suite('bulk actions selection', () => {
+ let isEnabled: sinon.SinonStub;
+ setup(async () => {
+ isEnabled = stubFlags('isEnabled');
+ isEnabled.returns(true);
+ element.requestUpdate();
+ await element.updateComplete;
+ });
+
+ test('changing section triggers model sync', async () => {
+ const syncStub = sinon.stub(element.bulkActionsModel, 'sync');
+ assert.isFalse(syncStub.called);
+ element.changeSection = {
+ name: 'test',
+ query: 'test',
+ results: [
+ {
+ ...createChange(),
+ _number: 1 as NumericChangeId,
+ id: '1' as ChangeInfoId,
+ },
+ ],
+ emptyStateSlotName: 'test',
+ };
+ await element.updateComplete;
+
+ assert.isTrue(syncStub.called);
+ });
+
+ test('changing section does on trigger model sync when flag is disabled', async () => {
+ isEnabled.returns(false);
+ const syncStub = sinon.stub(element.bulkActionsModel, 'sync');
+ assert.isFalse(syncStub.called);
+ element.changeSection = {
+ name: 'test',
+ query: 'test',
+ results: [
+ {
+ ...createChange(),
+ _number: 1 as NumericChangeId,
+ id: '1' as ChangeInfoId,
+ },
+ ],
+ emptyStateSlotName: 'test',
+ };
+ await element.updateComplete;
+
+ assert.isFalse(syncStub.called);
+ });
+
+ test('actions header is enabled/disabled based on selected changes', async () => {
+ element.bulkActionsModel.setState({
+ ...element.bulkActionsModel.getState(),
+ selectedChangeNums: [],
+ });
+ await waitUntilObserved(
+ element.bulkActionsModel.selectedChangeNums$,
+ s => s.length === 0
+ );
+ assert.isFalse(element.showBulkActionsHeader);
+
+ element.bulkActionsModel.setState({
+ ...element.bulkActionsModel.getState(),
+ selectedChangeNums: [1 as NumericChangeId],
+ });
+ await waitUntilObserved(
+ element.bulkActionsModel.selectedChangeNums$,
+ s => s.length === 1
+ );
+ assert.isTrue(element.showBulkActionsHeader);
+ });
+ });
+
+ test('colspans', async () => {
+ element.visibleChangeTableColumns = [];
+ element.changeSection = {results: [{...createChange()}]};
+ await element.updateComplete;
+ const tdItemCount = queryAll<HTMLTableElement>(element, 'td').length;
+
+ element.labelNames = [];
+ assert.equal(tdItemCount, element.computeColspan(element.computeColumns()));
+ });
+
+ test('computeItemSelected', () => {
+ element.selectedIndex = 1;
+ assert.isTrue(element.computeItemSelected(1));
+ assert.isFalse(element.computeItemSelected(2));
+ });
+
+ test('computed fields', () => {
+ assert.equal(computeLabelShortcut('Code-Review'), 'CR');
+ assert.equal(computeLabelShortcut('Verified'), 'V');
+ assert.equal(computeLabelShortcut('Library-Compliance'), 'LC');
+ assert.equal(computeLabelShortcut('PolyGerrit-Review'), 'PR');
+ assert.equal(computeLabelShortcut('polygerrit-review'), 'PR');
+ assert.equal(
+ computeLabelShortcut('Invalid-Prolog-Rules-Label-Name--Verified'),
+ 'V'
+ );
+ assert.equal(computeLabelShortcut('Some-Special-Label-7'), 'SSL7');
+ assert.equal(computeLabelShortcut('--Too----many----dashes---'), 'TMD');
+ assert.equal(
+ computeLabelShortcut('Really-rather-entirely-too-long-of-a-label-name'),
+ 'RRETL'
+ );
+ });
+
+ suite('empty section slots', () => {
+ test('empty section', async () => {
+ element.changeSection = {results: []};
+ await element.updateComplete;
+ const listItems = queryAll<GrChangeListItem>(
+ element,
+ 'gr-change-list-item'
+ );
+ assert.equal(listItems.length, 0);
+ const noChangesMsg = queryAll<HTMLTableRowElement>(element, '.noChanges');
+ assert.equal(noChangesMsg.length, 1);
+ });
+
+ test('are shown on empty sections with slot name', async () => {
+ const section = {
+ name: 'test',
+ query: 'test',
+ results: [],
+ emptyStateSlotName: 'test',
+ };
+ element.changeSection = section;
+ await element.updateComplete;
+
+ assert.isEmpty(queryAll(element, 'gr-change-list-item'));
+ queryAndAssert(element, 'slot[name="test"]');
+ });
+
+ test('are not shown on empty sections without slot name', async () => {
+ const section = {name: 'test', query: 'test', results: []};
+ element.changeSection = section;
+ await element.updateComplete;
+
+ assert.isEmpty(queryAll(element, 'gr-change-list-item'));
+ assert.notExists(query(element, 'slot[name="test"]'));
+ });
+
+ test('are not shown on non-empty sections with slot name', async () => {
+ const section = {
+ name: 'test',
+ query: 'test',
+ emptyStateSlotName: 'test',
+ results: [
+ {
+ ...createChange(),
+ _number: 0 as NumericChangeId,
+ labels: {Verified: {approved: {}}},
+ },
+ ],
+ };
+ element.changeSection = section;
+ await element.updateComplete;
+
+ assert.isNotEmpty(queryAll(element, 'gr-change-list-item'));
+ assert.notExists(query(element, 'slot[name="test"]'));
+ });
+ });
+
+ suite('dashboard queries', () => {
+ test('query without age and limit unchanged', () => {
+ const query = 'status:closed owner:me';
+ assert.deepEqual(element.processQuery(query), query);
+ });
+
+ test('query with age and limit', () => {
+ const query = 'status:closed age:1week limit:10 owner:me';
+ const expectedQuery = 'status:closed owner:me';
+ assert.deepEqual(element.processQuery(query), expectedQuery);
+ });
+
+ test('query with age', () => {
+ const query = 'status:closed age:1week owner:me';
+ const expectedQuery = 'status:closed owner:me';
+ assert.deepEqual(element.processQuery(query), expectedQuery);
+ });
+
+ test('query with limit', () => {
+ const query = 'status:closed limit:10 owner:me';
+ const expectedQuery = 'status:closed owner:me';
+ assert.deepEqual(element.processQuery(query), expectedQuery);
+ });
+
+ test('query with age as value and not key', () => {
+ const query = 'status:closed random:age';
+ const expectedQuery = 'status:closed random:age';
+ assert.deepEqual(element.processQuery(query), expectedQuery);
+ });
+
+ test('query with limit as value and not key', () => {
+ const query = 'status:closed random:limit';
+ const expectedQuery = 'status:closed random:limit';
+ assert.deepEqual(element.processQuery(query), expectedQuery);
+ });
+
+ test('query with -age key', () => {
+ const query = 'status:closed -age:1week';
+ const expectedQuery = 'status:closed';
+ assert.deepEqual(element.processQuery(query), expectedQuery);
+ });
+ });
+});