docsify/test/e2e/plugins.test.js
John Hildenbiddle dac8e59bb7
Feat: Improved error handling and response status availability (#2303)
* Add response data to route object
* Display error status and description on content fetch error
* Fix issue where initial site render was incomplete on content fetch error
* Fix issue where empty markdown pages/routes were handled as 404 errors
* Fix incorrect `notFoundPage` default value
2023-11-17 07:27:09 -06:00

228 lines
5.6 KiB
JavaScript

import docsifyInit from '../helpers/docsify-init.js';
import { waitForFunction } from '../helpers/wait-for.js';
import { test, expect } from './fixtures/docsify-init-fixture.js';
test.describe('Plugins', () => {
test('Hook order', async ({ page }) => {
const consoleMsgs = [];
const expectedMsgs = [
'init',
'mounted',
'beforeEach-async',
'beforeEach',
'afterEach-async',
'afterEach',
'doneEach',
'ready',
];
page.on('console', msg => consoleMsgs.push(msg.text()));
await docsifyInit({
config: {
plugins: [
function (hook, vm) {
hook.init(() => {
console.log('init');
});
hook.mounted(() => {
console.log('mounted');
});
hook.beforeEach((markdown, next) => {
setTimeout(() => {
console.log('beforeEach-async');
next(markdown);
}, 100);
});
hook.beforeEach(markdown => {
console.log('beforeEach');
return markdown;
});
hook.afterEach((html, next) => {
setTimeout(() => {
console.log('afterEach-async');
next(html);
}, 100);
});
hook.afterEach(html => {
console.log('afterEach');
return html;
});
hook.doneEach(() => {
console.log('doneEach');
});
hook.ready(() => {
console.log('ready');
});
},
],
},
markdown: {
homepage: '# Hello World',
},
// _logHTML: true,
});
expect(consoleMsgs).toEqual(expectedMsgs);
});
test.describe('beforeEach()', () => {
test('return value', async ({ page }) => {
await docsifyInit({
config: {
plugins: [
function (hook, vm) {
hook.beforeEach(markdown => {
return 'beforeEach';
});
},
],
},
// _logHTML: true,
});
await expect(page.locator('#main')).toContainText('beforeEach');
});
test('async return value', async ({ page }) => {
await docsifyInit({
config: {
plugins: [
function (hook, vm) {
hook.beforeEach((markdown, next) => {
setTimeout(() => {
next('beforeEach');
}, 100);
});
},
],
},
markdown: {
homepage: '# Hello World',
},
// _logHTML: true,
});
await expect(page.locator('#main')).toContainText('beforeEach');
});
});
test.describe('afterEach()', () => {
test('return value', async ({ page }) => {
await docsifyInit({
config: {
plugins: [
function (hook, vm) {
hook.afterEach(html => {
return '<p>afterEach</p>';
});
},
],
},
markdown: {
homepage: '# Hello World',
},
// _logHTML: true,
});
await expect(page.locator('#main')).toContainText('afterEach');
});
test('async return value', async ({ page }) => {
await docsifyInit({
config: {
plugins: [
function (hook, vm) {
hook.afterEach((html, next) => {
setTimeout(() => {
next('<p>afterEach</p>');
}, 100);
});
},
],
},
markdown: {
homepage: '# Hello World',
},
// _logHTML: true,
});
await expect(page.locator('#main')).toContainText('afterEach');
});
});
test.describe('route data accessible to plugins', () => {
let routeData = null;
test.beforeEach(async ({ page }) => {
// Store route data set via plugin hook (below)
page.on('console', async msg => {
for (const arg of msg.args()) {
const val = await arg.jsonValue();
const obj = JSON.parse(val);
obj.response && (routeData = obj);
}
});
});
test.afterEach(async ({ page }) => {
routeData = null;
});
test('success (200)', async ({ page }) => {
await docsifyInit({
config: {
plugins: [
function (hook, vm) {
hook.doneEach(html => {
console.log(JSON.stringify(vm.route));
});
},
],
},
});
expect(routeData).toHaveProperty('response');
expect(routeData.response).toHaveProperty('ok', true);
expect(routeData.response).toHaveProperty('status', 200);
expect(routeData.response).toHaveProperty('statusText', 'OK');
});
test('fail (404)', async ({ page }) => {
const link404Elm = page.locator('a[href*="404"]');
await docsifyInit({
markdown: {
sidebar: `
- [404](404.md)
`,
},
config: {
plugins: [
function (hook, vm) {
hook.doneEach(html => {
console.log(JSON.stringify(vm.route));
});
},
],
},
});
await link404Elm.click();
await waitForFunction(() => routeData?.response?.status === 404);
expect(routeData).toHaveProperty('response');
expect(routeData.response).toHaveProperty('ok', false);
expect(routeData.response).toHaveProperty('status', 404);
expect(routeData.response).toHaveProperty('statusText', 'Not Found');
});
});
});