Rework documentation URLs as inline markdown. Redesign documentations with markdown text. Redesign way to document scripts/categories and present the documentation. Documentation is showed in an expandable box instead of tooltip. This is to allow writing longer documentation (tooltips are meant to be used for short text) and have better experience on mobile. If a node (script/category) has documentation it's now shown with single information icon (ℹ) aligned to right. Add support for rendering documentation as markdown. It automatically converts plain URLs to URLs with display names (e.g. https://docs.microsoft.com/..) will be rendered automatically like "docs.microsoft.com - Windows 11 Privacy...".
82 lines
2.7 KiB
TypeScript
82 lines
2.7 KiB
TypeScript
import 'mocha';
|
|
import { expect } from 'chai';
|
|
import type { DocumentableData } from '@/application/collections/';
|
|
import { parseDocs } from '@/application/Parser/DocumentationParser';
|
|
import { itEachAbsentObjectValue, itEachAbsentStringValue } from '@tests/unit/shared/TestCases/AbsentTests';
|
|
|
|
describe('DocumentationParser', () => {
|
|
describe('parseDocs', () => {
|
|
describe('throws when node is missing', () => {
|
|
itEachAbsentObjectValue((absentValue) => {
|
|
// arrange
|
|
const expectedError = 'missing documentable';
|
|
// act
|
|
const act = () => parseDocs(absentValue);
|
|
// assert
|
|
expect(act).to.throw(expectedError);
|
|
});
|
|
});
|
|
describe('throws when single documentation is missing', () => {
|
|
itEachAbsentStringValue((absentValue) => {
|
|
// arrange
|
|
const expectedError = 'missing documentation';
|
|
const node: DocumentableData = { docs: ['non empty doc 1', absentValue] };
|
|
// act
|
|
const act = () => parseDocs(node);
|
|
// assert
|
|
expect(act).to.throw(expectedError);
|
|
});
|
|
});
|
|
describe('throws when type is unexpected', () => {
|
|
// arrange
|
|
const expectedTypeError = 'docs field (documentation) must be an array of strings';
|
|
const wrongTypedValue = 22 as never;
|
|
const testCases: ReadonlyArray<{ name: string, node: DocumentableData }> = [
|
|
{
|
|
name: 'given docs',
|
|
node: { docs: wrongTypedValue },
|
|
},
|
|
{
|
|
name: 'single doc',
|
|
node: { docs: ['non empty doc 1', wrongTypedValue] },
|
|
},
|
|
];
|
|
for (const testCase of testCases) {
|
|
it(testCase.name, () => {
|
|
// act
|
|
const act = () => parseDocs(testCase.node);
|
|
// assert
|
|
expect(act).to.throw(expectedTypeError);
|
|
});
|
|
}
|
|
});
|
|
it('returns empty when empty', () => {
|
|
// arrange
|
|
const empty: DocumentableData = { };
|
|
// act
|
|
const actual = parseDocs(empty);
|
|
// assert
|
|
expect(actual).to.have.lengthOf(0);
|
|
});
|
|
it('returns single item when string', () => {
|
|
// arrange
|
|
const url = 'https://privacy.sexy';
|
|
const expected = [url];
|
|
const sut: DocumentableData = { docs: url };
|
|
// act
|
|
const actual = parseDocs(sut);
|
|
// assert
|
|
expect(actual).to.deep.equal(expected);
|
|
});
|
|
it('returns all when array', () => {
|
|
// arrange
|
|
const expected = ['https://privacy.sexy', 'https://github.com/undergroundwires/privacy.sexy'];
|
|
const sut: DocumentableData = { docs: expected };
|
|
// act
|
|
const actual = parseDocs(sut);
|
|
// assert
|
|
expect(actual).to.deep.equal(expected);
|
|
});
|
|
});
|
|
});
|