blob: acd55d3d0b4c845e73116fe08827d6fdf9797ac9 [file] [log] [blame]
import './index';
import { setUpElementUnderTest, eventPromise, noEventPromise } from '../../../infra-sk/modules/test_util';
import { QueryDialogSk } from './query-dialog-sk';
import { QueryDialogSkPO } from './query-dialog-sk_po';
import { ParamSet, fromParamSet } from 'common-sk/modules/query';
import { $, $$ } from 'common-sk/modules/dom';
const expect = chai.expect;
describe('query-dialog-sk', () => {
const newInstance = setUpElementUnderTest<QueryDialogSk>('query-dialog-sk');
let queryDialogSk: QueryDialogSk;
let queryDialogSkPO: QueryDialogSkPO;
beforeEach(() => {
queryDialogSk = newInstance();
queryDialogSkPO = new QueryDialogSkPO(queryDialogSk);
});
describe('open/close/edit events', () => {
it('should emit "query-dialog-open" when opened', async () => {
const event = eventPromise('query-dialog-open');
queryDialogSk.open({}, '');
await event;
});
it('should emit "query-dialog-close" but not "edit" when closed via the "Cancel" button',
async () => {
queryDialogSk.open({}, '');
const events = Promise.all([eventPromise('query-dialog-close'), noEventPromise('edit')]);
await queryDialogSkPO.clickCancelBtn();
await events;
});
it('should emit "query-dialog-close" and "edit" when closed via the "Show Matches" button',
async () => {
queryDialogSk.open({}, '');
const events = Promise.all([eventPromise('query-dialog-close'), eventPromise('edit')]);
await queryDialogSkPO.clickShowMatchesBtn();
await events;
});
})
describe('opened with an empty selection', () => {
const paramSet: ParamSet = {'a': ['1', '2', '3'], 'b': ['4', '5'], 'c': ['6']};
beforeEach(() => {
queryDialogSk.open(paramSet, /* selection= */ '');
});
it('should have an empty selection', async() => {
// The query-sk component correctly shows the ParamSet.
expect(await queryDialogSkPO.getParamSet()).to.deep.equal(paramSet);
// But none of the ParamSet items are selected.
expect(await queryDialogSkPO.getSelection()).to.deep.equal({});
// The "empty selection" placeholder text is visible instead of the paramset-sk component.
expect(await queryDialogSkPO.isEmptySelectionMessageVisible()).to.be.true;
expect(await queryDialogSkPO.isParamSetSkVisible()).to.be.false;
});
it('should update paramset-sk when selection changes', async () => {
await queryDialogSkPO.setSelection({'a': ['1']});
expect(await queryDialogSkPO.getParamSetSkContents()).to.deep.equal({'a': ['1']});
// The placeholder text should not be visible. It suffices to assert this just once.
expect(await queryDialogSkPO.isEmptySelectionMessageVisible()).to.be.false;
await queryDialogSkPO.setSelection({'a': ['1', '2']});
expect(await queryDialogSkPO.getParamSetSkContents()).to.deep.equal({'a': ['1', '2']});
await queryDialogSkPO.setSelection({'a': ['1', '2'], 'b': ['4']});
expect(await queryDialogSkPO.getParamSetSkContents())
.to.deep.equal({'a': ['1', '2'], 'b': ['4']});
});
it('should emit event "edit" containing the current selection when "Show Matches" is clicked',
async () => {
await queryDialogSkPO.setSelection({'a': ['1', '2'], 'b': ['4']});
// Click "Show Matches" button and catch the "edit" event.
const event = eventPromise<CustomEvent<string>>('edit');
await queryDialogSkPO.clickShowMatchesBtn();
const eventSelection = (await event).detail;
// The event contents should match the selection.
expect(eventSelection).to.equal('a=1&a=2&b=4');
});
it('should clear the previous selection when reopened with an empty selection', async () => {
// Select a=1
await queryDialogSkPO.setSelection({'a': ['1']});
// It should have selected a=1.
expect(await queryDialogSkPO.getParamSetSkContents()).to.deep.equal({'a': ['1']});
// Close dialog.
await queryDialogSkPO.clickCancelBtn();
// Reopen with same ParamSet and empty selection.
queryDialogSk.open(paramSet, /* selection= */ '');
// Selection should be empty.
expect(await queryDialogSkPO.getSelection()).to.deep.equal({});
expect(await queryDialogSkPO.isEmptySelectionMessageVisible()).to.be.true;
expect(await queryDialogSkPO.isParamSetSkVisible()).to.be.false;
});
})
describe('opened with a non-empty selection', () => {
const paramSet: ParamSet = {'a': ['1', '2', '3'], 'b': ['4', '5'], 'c': ['6']};
const selection: ParamSet = {'a': ['1', '2'], 'b': ['4']};
beforeEach(() => {
queryDialogSk.open(paramSet, fromParamSet(selection));
});
it('shows the passed in selection', async () => {
// Both query-sk and paramset-sk show the passed in selection.
expect(await queryDialogSkPO.getSelection()).to.deep.equal(selection);
expect(await queryDialogSkPO.getParamSetSkContents()).to.deep.equal(selection);
// The "empty selection" placeholder text is not visible.
expect(await queryDialogSkPO.isEmptySelectionMessageVisible()).to.be.false;
});
it('can be reopened with a different selection', async () => {
const differentSelection: ParamSet = {'a': ['2', '3'], 'c': ['6']};
// Close dialog and reopen it with a different selection.
await queryDialogSkPO.clickCancelBtn();
queryDialogSk.open(paramSet, fromParamSet(differentSelection));
// Both query-sk and paramset-sk show the passed in selection.
expect(await queryDialogSkPO.getSelection()).to.deep.equal(differentSelection);
expect(await queryDialogSkPO.getParamSetSkContents()).to.deep.equal(differentSelection);
});
});
describe('reopened with a different ParamSet', async () => {
const paramSet: ParamSet = {'a': ['1', '2', '3'], 'b': ['4', '5'], 'c': ['6']};
const selection: ParamSet = {'a': ['3'], 'b': ['4']};
const differentParamSet: ParamSet = {'a': ['3', '4', '5'], 'b': ['6'], 'z': ['7']};
const differentSelection: ParamSet = {'a': ['3', '4'], 'b': ['6']};
beforeEach(() => {
queryDialogSk.open(paramSet, fromParamSet(selection));
})
it('can be reopened with a different ParamSet and an empty selection', async () => {
// Close dialog and reopen it with a different ParamSet.
await queryDialogSkPO.clickCancelBtn();
queryDialogSk.open(differentParamSet, /* selection= */ '');
// The query-sk component shows the new ParamSet, and the selection is empty.
expect(await queryDialogSkPO.getParamSet()).to.deep.equal(differentParamSet);
expect(await queryDialogSkPO.getSelection()).to.deep.equal({});
// The "empty selection" placeholder text is visible instead of the paramset-sk component.
expect(await queryDialogSkPO.isEmptySelectionMessageVisible()).to.be.true;
expect(await queryDialogSkPO.isParamSetSkVisible()).to.be.false;
});
it('can be reopened with a different ParamSet and a non-empty selection', async () => {
// Close dialog and reopen it with a different ParamSet and a non-empty selection.
await queryDialogSkPO.clickCancelBtn();
queryDialogSk.open(differentParamSet, fromParamSet(differentSelection));
// Both query-sk and paramset-sk show the passed in selection.
expect(await queryDialogSkPO.getSelection()).to.deep.equal(differentSelection);
expect(await queryDialogSkPO.getParamSetSkContents()).to.deep.equal(differentSelection);
// The placeholder text should not be visible.
expect(await queryDialogSkPO.isEmptySelectionMessageVisible()).to.be.false;
});
});
it('rationalizes an invalid selection', async () => {
const paramSet: ParamSet = {'a': ['1', '2', '3'], 'b': ['4', '5'], 'c': ['6']};
// This contains the invalid value "a=4" and a value for the invalid key "d".
const invalidSelection: ParamSet = {'a': ['2', '3', '4'], 'b': ['5'], 'd': ['7']};
// This is the invalidSelection with the invalid key/value pairs removed.
const rationalizedSelection: ParamSet = {'a': ['2', '3'], 'b': ['5']};
// Open dialog with invalid selection.
queryDialogSk.open(paramSet, fromParamSet(invalidSelection));
// The dialog should rationalize the invalid selection.
expect(await queryDialogSkPO.getSelection()).to.deep.equal(rationalizedSelection);
expect(await queryDialogSkPO.getParamSetSkContents()).to.deep.equal(rationalizedSelection);
});
it('can customize the submit button label', () => {
// Dialog contents do not matter.
queryDialogSk.open({'a': ['1']}, '');
const showMatchesBtn = $$<HTMLButtonElement>('button.show-matches', queryDialogSk)!;
// Shows "Show Matches" by default.
expect(showMatchesBtn.innerText).to.equal('Show Matches');
// Button label can be changed.
queryDialogSk.submitButtonLabel = 'Submit';
expect(showMatchesBtn.innerText).to.equal('Submit');
});
});