blob: 21d6c9e6d38d6a6eab12fa14df2cd089f1fbb685 [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {assert} from 'chai';
import sinon from 'sinon';
import {MrReactAutocomplete} from './mr-react-autocomplete.tsx';
let element: MrReactAutocomplete;
describe('mr-react-autocomplete', () => {
beforeEach(() => {
element = document.createElement('mr-react-autocomplete');
element.vocabularyName = 'member';
document.body.appendChild(element);
sinon.stub(element, 'stateChanged');
});
afterEach(() => {
document.body.removeChild(element);
});
it('initializes', () => {
assert.instanceOf(element, MrReactAutocomplete);
});
it('ReactDOM renders on update', async () => {
element.value = 'Penguin Island';
await element.updateComplete;
const input = element.querySelector('input');
assert.equal(input?.value, 'Penguin Island');
});
it('does not update on new copies of the same values', async () => {
element.fixedValues = ['test'];
element.value = ['hah'];
sinon.spy(element, 'updated');
await element.updateComplete;
sinon.assert.calledOnce(element.updated);
element.fixedValues = ['test'];
element.value = ['hah'];
await element.updateComplete;
sinon.assert.calledOnce(element.updated);
});
it('_getOptionDescription with component vocabulary gets docstring', () => {
element.vocabularyName = 'component';
element._components = new Map([['Infra>UI', {docstring: 'Test docs'}]]);
element._labels = new Map([['M-84', {docstring: 'Test label docs'}]]);
assert.equal(element._getOptionDescription('Infra>UI'), 'Test docs');
assert.equal(element._getOptionDescription('M-84'), '');
assert.equal(element._getOptionDescription('NoMatch'), '');
});
it('_getOptionDescription with label vocabulary gets docstring', () => {
element.vocabularyName = 'label';
element._components = new Map([['Infra>UI', {docstring: 'Test docs'}]]);
element._labels = new Map([['m-84', {docstring: 'Test label docs'}]]);
assert.equal(element._getOptionDescription('Infra>UI'), '');
assert.equal(element._getOptionDescription('M-84'), 'Test label docs');
assert.equal(element._getOptionDescription('NoMatch'), '');
});
it('_getOptionDescription with other vocabulary gets empty docstring', () => {
element.vocabularyName = 'owner';
element._components = new Map([['Infra>UI', {docstring: 'Test docs'}]]);
element._labels = new Map([['M-84', {docstring: 'Test label docs'}]]);
assert.equal(element._getOptionDescription('Infra>UI'), '');
assert.equal(element._getOptionDescription('M-84'), '');
assert.equal(element._getOptionDescription('NoMatch'), '');
});
it('_options gets component names', () => {
element.vocabularyName = 'component';
element._components = new Map([
['Infra>UI', {path: 'Infra>UI', docstring: 'Test docs'}],
['Bird>Penguin', {path: 'Bird>Penguin', docstring: 'Test docs'}],
]);
assert.deepEqual(element._options(), ['Infra>UI', 'Bird>Penguin']);
});
it('_options does not get deprecated components', () => {
element.vocabularyName = 'component';
element._components = new Map([
['Infra>UI>Deprecated', {path: 'Infra>UI>Deprecated', deprecated: true, docstring: 'Test docs'}],
['Infra>UI>NotDeprecated', {path: 'Infra>UI>NotDeprecated', docstring: 'Test docs'}],
]);
assert.deepEqual(element._options(), ['Infra>UI>NotDeprecated']);
});
it('_options gets label names', () => {
element.vocabularyName = 'label';
element._labels = new Map([
['M-84', {label: 'm-84', docstring: 'Test docs'}],
['Restrict-View-Bagel', {label: 'restrict-VieW-bAgEl', docstring: 'T'}],
]);
assert.deepEqual(element._options(), ['m-84', 'restrict-VieW-bAgEl']);
});
it('_options gets member names with groups', () => {
element.vocabularyName = 'member';
element._members = {
userRefs: [
{displayName: 'penguin@island.com'},
{displayName: 'google@monorail.com'},
{displayName: 'group@birds.com'},
],
groupRefs: [{displayName: 'group@birds.com'}],
};
assert.deepEqual(element._options(),
['penguin@island.com', 'google@monorail.com', 'group@birds.com']);
});
it('_options gets owner names without groups', () => {
element.vocabularyName = 'owner';
element._members = {
userRefs: [
{displayName: 'penguin@island.com'},
{displayName: 'google@monorail.com'},
{displayName: 'group@birds.com'},
],
groupRefs: [{displayName: 'group@birds.com'}],
};
assert.deepEqual(element._options(),
['penguin@island.com', 'google@monorail.com']);
});
it('_options gets owner names without groups', () => {
element.vocabularyName = 'project';
element._projects = {
ownerOf: ['penguins'],
memberOf: ['birds'],
contributorTo: ['canary', 'owl-island'],
};
assert.deepEqual(element._options(),
['penguins', 'birds', 'canary', 'owl-island']);
});
it('_options gives empty array for empty vocabulary name', () => {
element.vocabularyName = '';
assert.deepEqual(element._options(), []);
});
it('_options throws error on unknown vocabulary', () => {
element.vocabularyName = 'whatever';
assert.throws(element._options.bind(element),
'Unknown vocabulary name: whatever');
});
});