sharded-gotify/ui/src/tests/plugin.test.ts

189 lines
7.1 KiB
TypeScript

import * as os from 'os';
import {Page} from 'puppeteer';
import axios from 'axios';
import * as auth from './authentication';
import * as selector from './selector';
import {GotifyTest, newTest, newPluginDir} from './setup';
import {innerText, waitForCount, waitForExists} from './utils';
const pluginSupported = ['linux', 'darwin'].indexOf(os.platform()) !== -1;
let page: Page;
let gotify: GotifyTest;
beforeAll(async () => {
const gotifyPluginDir = pluginSupported
? await newPluginDir(['github.com/gotify/server/v2/plugin/example/echo'])
: '';
gotify = await newTest(gotifyPluginDir);
page = gotify.page;
});
afterAll(async () => await gotify.close());
enum Col {
ID = 1,
SetEnabled = 2,
Name = 3,
Token = 4,
Details = 5,
}
const hiddenToken = '•••••••••••••••';
const $table = selector.table('#plugin-table');
const switchSelctor = (id: number) => $table.cell(id, Col.SetEnabled, '[data-enabled]');
const enabledState = async (id: number) =>
(await page.$eval(switchSelctor(id), (el) => el.getAttribute('data-enabled'))) === 'true';
const toggleEnabled = async (id: number) => {
const origEnabled = (await enabledState(id)).toString();
await page.click(switchSelctor(id));
await page.waitForFunction(
`document.querySelector("${switchSelctor(
id
)}").getAttribute("data-enabled") !== "${origEnabled}"`
);
};
const pluginInfo = async (className: string) => {
return await innerText(page, `.plugin-info .${className} > span`);
};
const getDisplayer = async () => {
return await innerText(page, '.displayer');
};
const hasReceivedMessage = async (title: RegExp, content: RegExp) => {
await page.click('#message-navigation a');
await waitForExists(page, selector.heading(), 'All Messages');
expect(await innerText(page, '.title')).toMatch(title);
expect(await innerText(page, '.content')).toMatch(content);
await page.click('#navigate-plugins');
await waitForExists(page, selector.heading(), 'Plugins');
};
const inDetailPage = async (id: number, callback: () => Promise<void>) => {
const name = await innerText(page, $table.cell(id, Col.Name));
await page.click($table.cell(id, Col.Details, 'button'));
await waitForExists(page, '.plugin-info .name > span', name);
await callback();
await page.click('#navigate-plugins');
await waitForExists(page, selector.heading(), 'Plugins');
await page.waitForSelector($table.selector());
};
describe('plugin', () => {
describe('navigation', () => {
it('does login', async () => await auth.login(page));
it('navigates to plugins', async () => {
await page.click('#navigate-plugins');
await waitForExists(page, selector.heading(), 'Plugins');
});
});
if (!pluginSupported) {
return;
}
describe('functionality test', () => {
describe('initial status', () => {
it('has echo plugin', async () => {
await waitForCount(page, $table.rows(), 1);
expect(await innerText(page, $table.cell(1, Col.Name))).toEqual('test plugin');
expect(await innerText(page, $table.cell(1, Col.Token))).toBe(hiddenToken);
expect(parseInt(await innerText(page, $table.cell(1, Col.ID)), 10)).toBeGreaterThan(
0
);
});
it('is disabled by default', async () => {
expect(await enabledState(1)).toBe(false);
});
});
describe('enable and disable plugin', () => {
it('enable', async () => {
await toggleEnabled(1);
expect(await enabledState(1)).toBe(true);
});
it('disable', async () => {
await toggleEnabled(1);
expect(await enabledState(1)).toBe(false);
});
});
describe('details page', () => {
it('has plugin info', async () => {
await inDetailPage(1, async () => {
expect(await pluginInfo('module-path')).toBe(
'github.com/gotify/server/v2/plugin/example/echo'
);
});
});
it('has displayer', async () => {
await inDetailPage(1, async () => {
expect(await getDisplayer()).toBeTruthy();
});
});
it('has configurer', async () => {
await inDetailPage(1, async () => {
expect(await page.$('.configurer')).toBeTruthy();
});
});
it('updates configurer', async () => {
await inDetailPage(1, async () => {
expect(
await (
await (await page.$('.config-save'))!.getProperty('disabled')
).jsonValue()
).toBe(true);
await page.waitForSelector('.CodeMirror .CodeMirror-code');
await page.waitForFunction(
'document.querySelector(".CodeMirror .CodeMirror-code").innerText.toLowerCase().indexOf("loading")<0'
);
await page.click('.CodeMirror .CodeMirror-code > div');
await page.keyboard.press('x');
await page.waitForFunction(
'document.querySelector(".config-save") && !document.querySelector(".config-save").disabled'
);
await page.click('.config-save');
await page.waitForFunction('document.querySelector(".config-save").disabled');
});
});
it('configurer updated', async () => {
await inDetailPage(1, async () => {
expect(
await (
await (await page.$('.config-save'))!.getProperty('disabled')
).jsonValue()
).toBe(true);
await page.waitForSelector('.CodeMirror .CodeMirror-code > div');
await page.waitForFunction(
'document.querySelector(".CodeMirror .CodeMirror-code > div").innerText.toLowerCase().indexOf("loading")<0'
);
expect(await innerText(page, '.CodeMirror .CodeMirror-code > div')).toMatch(
/x$/
);
});
});
it('sends messages', async () => {
if (!(await enabledState(1))) {
await toggleEnabled(1);
}
await inDetailPage(1, async () => {
const hook = await page.$eval('.displayer a', (el) => el.getAttribute('href'));
await axios.get(hook!);
});
});
it('has received message', async () => {
await hasReceivedMessage(
/^.+received$/,
/^echo server received a hello message \d+ times$/
);
});
});
});
});