blob: 7c41120618957bd4238c6178aced0a8b2c536b2b [file] [log] [blame]
/**
* @license
* Copyright 2017 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import '../../../test/common-test-setup';
import './gr-plugin-list';
import {GrPluginList, PluginInfoWithName} from './gr-plugin-list';
import {
addListenerForTest,
mockPromise,
query,
queryAll,
queryAndAssert,
stubRestApi,
} from '../../../test/test-utils';
import {PluginInfo} from '../../../types/common';
import {GerritView} from '../../../services/router/router-model';
import {PageErrorEvent} from '../../../types/events';
import {fixture, html, assert} from '@open-wc/testing';
import {AdminChildView, AdminViewState} from '../../../models/views/admin';
function pluginGenerator(counter: number) {
const plugin: PluginInfo = {
id: `test${counter}`,
version: `version-${counter}`,
disabled: false,
};
if (counter !== 2) {
plugin.index_url = `plugins/test${counter}/`;
}
if (counter !== 4) {
plugin.api_version = `api-version-${counter}`;
}
return plugin;
}
function createPluginList(n: number) {
const plugins = [];
for (let i = 0; i < n; ++i) {
const plugin = pluginGenerator(i) as PluginInfoWithName;
plugin.name = `test${i}`;
plugins.push(plugin);
}
return plugins;
}
function createPluginObjectList(n: number) {
const plugins: {[pluginName: string]: PluginInfo} | undefined = {};
for (let i = 0; i < n; ++i) {
plugins[`test${i}`] = pluginGenerator(i);
}
return plugins;
}
suite('gr-plugin-list tests', () => {
let element: GrPluginList;
let plugins: {[pluginName: string]: PluginInfo} | undefined;
const value: AdminViewState = {
view: GerritView.ADMIN,
adminView: AdminChildView.PLUGINS,
};
setup(async () => {
element = await fixture(html`<gr-plugin-list></gr-plugin-list>`);
});
suite('list with plugins', async () => {
setup(async () => {
plugins = createPluginObjectList(26);
stubRestApi('getPlugins').returns(Promise.resolve(plugins));
element.params = value;
await element.paramsChanged();
await element.updateComplete;
});
test('render', () => {
assert.shadowDom.equal(
element,
/* HTML */ `
<gr-list-view>
<table class="genericList" id="list">
<tbody>
<tr class="headerRow">
<th class="name topHeader">Plugin Name</th>
<th class="topHeader version">Version</th>
<th class="apiVersion topHeader">API Version</th>
<th class="status topHeader">Status</th>
</tr>
</tbody>
<tbody>
<tr class="table">
<td class="name">
<a href="/plugins/test0/"> test0 </a>
</td>
<td class="version">version-0</td>
<td class="apiVersion">api-version-0</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test1/"> test1 </a>
</td>
<td class="version">version-1</td>
<td class="apiVersion">api-version-1</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">test2</td>
<td class="version">version-2</td>
<td class="apiVersion">api-version-2</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test3/"> test3 </a>
</td>
<td class="version">version-3</td>
<td class="apiVersion">api-version-3</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test4/"> test4 </a>
</td>
<td class="version">version-4</td>
<td class="apiVersion">
<span class="placeholder"> -- </span>
</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test5/"> test5 </a>
</td>
<td class="version">version-5</td>
<td class="apiVersion">api-version-5</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test6/"> test6 </a>
</td>
<td class="version">version-6</td>
<td class="apiVersion">api-version-6</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test7/"> test7 </a>
</td>
<td class="version">version-7</td>
<td class="apiVersion">api-version-7</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test8/"> test8 </a>
</td>
<td class="version">version-8</td>
<td class="apiVersion">api-version-8</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test9/"> test9 </a>
</td>
<td class="version">version-9</td>
<td class="apiVersion">api-version-9</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test10/"> test10 </a>
</td>
<td class="version">version-10</td>
<td class="apiVersion">api-version-10</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test11/"> test11 </a>
</td>
<td class="version">version-11</td>
<td class="apiVersion">api-version-11</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test12/"> test12 </a>
</td>
<td class="version">version-12</td>
<td class="apiVersion">api-version-12</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test13/"> test13 </a>
</td>
<td class="version">version-13</td>
<td class="apiVersion">api-version-13</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test14/"> test14 </a>
</td>
<td class="version">version-14</td>
<td class="apiVersion">api-version-14</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test15/"> test15 </a>
</td>
<td class="version">version-15</td>
<td class="apiVersion">api-version-15</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test16/"> test16 </a>
</td>
<td class="version">version-16</td>
<td class="apiVersion">api-version-16</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test17/"> test17 </a>
</td>
<td class="version">version-17</td>
<td class="apiVersion">api-version-17</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test18/"> test18 </a>
</td>
<td class="version">version-18</td>
<td class="apiVersion">api-version-18</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test19/"> test19 </a>
</td>
<td class="version">version-19</td>
<td class="apiVersion">api-version-19</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test20/"> test20 </a>
</td>
<td class="version">version-20</td>
<td class="apiVersion">api-version-20</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test21/"> test21 </a>
</td>
<td class="version">version-21</td>
<td class="apiVersion">api-version-21</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test22/"> test22 </a>
</td>
<td class="version">version-22</td>
<td class="apiVersion">api-version-22</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test23/"> test23 </a>
</td>
<td class="version">version-23</td>
<td class="apiVersion">api-version-23</td>
<td class="status">Enabled</td>
</tr>
<tr class="table">
<td class="name">
<a href="/plugins/test24/"> test24 </a>
</td>
<td class="version">version-24</td>
<td class="apiVersion">api-version-24</td>
<td class="status">Enabled</td>
</tr>
</tbody>
</table>
</gr-list-view>
`
);
});
test('plugin in the list is formatted correctly', async () => {
await element.updateComplete;
assert.equal(element.plugins![5].id, 'test5');
assert.equal(element.plugins![5].index_url, 'plugins/test5/');
assert.equal(element.plugins![5].version, 'version-5');
assert.equal(element.plugins![5].api_version, 'api-version-5');
assert.equal(element.plugins![5].disabled, false);
});
test('with and without urls', async () => {
await element.updateComplete;
const names = queryAll<HTMLTableElement>(element, '.name');
assert.isOk(queryAndAssert<HTMLAnchorElement>(names[2], 'a'));
assert.equal(
queryAndAssert<HTMLAnchorElement>(names[2], 'a').innerText,
'test1'
);
assert.isNotOk(query(names[3], 'a'));
assert.equal(names[3].innerText, 'test2');
});
test('versions', async () => {
await element.updateComplete;
const versions = queryAll<HTMLTableElement>(element, '.version');
assert.equal(versions[3].innerText, 'version-2');
});
test('api versions', async () => {
await element.updateComplete;
const apiVersions = queryAll<HTMLTableElement>(element, '.apiVersion');
assert.equal(apiVersions[4].innerText, 'api-version-3');
assert.equal(apiVersions[5].innerText, '--');
});
test('plugins', () => {
const table = queryAndAssert(element, 'table');
const rows = table.querySelectorAll('tr.table');
assert.equal(rows.length, element.pluginsPerPage);
});
});
suite('list with less than 26 plugins', () => {
setup(async () => {
plugins = createPluginObjectList(25);
stubRestApi('getPlugins').returns(Promise.resolve(plugins));
element.params = value;
await element.paramsChanged();
await element.updateComplete;
});
test('plugins', () => {
const table = queryAndAssert(element, 'table');
const rows = table.querySelectorAll('tr.table');
assert.equal(rows.length, element.pluginsPerPage);
});
});
suite('filter', () => {
test('paramsChanged', async () => {
const getPluginsStub = stubRestApi('getPlugins');
getPluginsStub.returns(Promise.resolve(plugins));
value.filter = 'test';
value.offset = 25;
element.params = value;
await element.paramsChanged();
assert.equal(getPluginsStub.lastCall.args[0], 'test');
assert.equal(getPluginsStub.lastCall.args[1], 25);
assert.equal(getPluginsStub.lastCall.args[2], 25);
});
});
suite('loading', () => {
test('correct contents are displayed', async () => {
assert.isTrue(element.loading);
assert.equal(
getComputedStyle(queryAndAssert<HTMLTableElement>(element, '#loading'))
.display,
'block'
);
element.loading = false;
element.plugins = createPluginList(25);
await element.updateComplete;
assert.isNotOk(query<HTMLTableElement>(element, '#loading'));
});
});
suite('404', () => {
test('fires page-error', async () => {
const response = {status: 404} as Response;
stubRestApi('getPlugins').callsFake(
(_filter, _pluginsPerPage, _offset, errFn) => {
if (errFn !== undefined) {
errFn(response);
}
return Promise.resolve(undefined);
}
);
const promise = mockPromise();
addListenerForTest(document, 'page-error', e => {
assert.deepEqual((e as PageErrorEvent).detail.response, response);
promise.resolve();
});
value.filter = 'test';
value.offset = 25;
element.params = value;
await element.paramsChanged();
await promise;
});
});
});