Files
wiki-print/test/selection.test.js
T
2026-11-13 11:50:48 +01:00

166 lines
4.5 KiB
JavaScript

import assert from 'node:assert/strict'
import test from 'node:test'
import { selectSubtree } from '../src/page-selection.js'
import { normalizeBaseUrl } from '../src/utils.js'
const base = normalizeBaseUrl('https://wiki.example.com')
const pages = [
{ id: 1, path: 'docs', locale: 'en', title: 'Docs', isPublished: true },
{ id: 2, path: 'docs/fallback', locale: 'en', title: 'Fallback', isPublished: true },
{ id: 3, path: 'docs/install', locale: 'en', title: 'Install', isPublished: true },
{ id: 4, path: 'docs/install/linux', locale: 'en', title: 'Linux', isPublished: true },
{ id: 5, path: 'docs/other', locale: 'en', title: 'Other', isPublished: true },
{ id: 6, path: 'docs/draft', locale: 'en', title: 'Draft', isPublished: false },
{ id: 7, path: 'docs-other', locale: 'en', title: 'Excluded sibling', isPublished: true },
{ id: 8, path: 'guide', locale: 'en', title: 'Guide', isPublished: true },
]
test('selects the starting page and path descendants, not similarly named siblings', () => {
const result = selectSubtree({
pages,
baseUrl: base,
startPage: 'docs',
locale: 'en',
})
assert.equal(result.locale, 'en')
assert.equal(result.startPath, 'docs')
assert.deepEqual(
result.pages.map((page) => page.path),
['docs', 'docs/fallback', 'docs/install', 'docs/install/linux', 'docs/other'],
)
assert.deepEqual(
result.pages.map((page) => page.depth),
[0, 1, 1, 2, 1],
)
assert.equal(result.omittedUnpublished, 1)
})
test('can include unpublished descendants explicitly', () => {
const result = selectSubtree({
pages,
baseUrl: base,
startPage: 'docs',
locale: 'en',
includeUnpublished: true,
})
assert.ok(result.pages.some((page) => page.path === 'docs/draft'))
assert.equal(result.omittedUnpublished, 0)
})
test('accepts a full Wiki.js page URL with a locale prefix', () => {
const result = selectSubtree({
pages,
baseUrl: base,
startPage: 'https://wiki.example.com/en/docs/install/',
})
assert.equal(result.startPath, 'docs/install')
assert.deepEqual(
result.pages.map((page) => page.path),
['docs/install', 'docs/install/linux'],
)
})
test('handles a wiki hosted below a URL subpath', () => {
const subpathBase = normalizeBaseUrl('https://example.com/wiki/')
const subpathPages = pages.map((page) => ({ ...page }))
const result = selectSubtree({
pages: subpathPages,
baseUrl: subpathBase,
startPage: 'https://example.com/wiki/en/docs/install',
})
assert.equal(result.startPath, 'docs/install')
assert.deepEqual(
result.pages.map((page) => page.path),
['docs/install', 'docs/install/linux'],
)
})
test('accepts a path with a locale prefix', () => {
const result = selectSubtree({
pages,
baseUrl: base,
startPage: '/en/docs',
})
assert.equal(result.startPath, 'docs')
assert.equal(result.pages.length, 5)
})
test('reports ambiguous locales and honors a default locale', () => {
const multilingual = [
...pages,
{ id: 20, path: 'docs', locale: 'de', title: 'Doku', isPublished: true },
]
assert.throws(
() =>
selectSubtree({
pages: multilingual,
baseUrl: base,
startPage: 'docs',
}),
/multiple locales/,
)
const result = selectSubtree({
pages: multilingual,
baseUrl: base,
startPage: 'docs',
defaultLocale: 'de',
})
assert.equal(result.locale, 'de')
assert.deepEqual(
result.pages.map((page) => page.path),
['docs'],
)
})
test('reports a missing starting page and unknown locales', () => {
assert.throws(
() => selectSubtree({ pages, baseUrl: base, startPage: 'missing', locale: 'en' }),
/was not found/,
)
assert.throws(
() => selectSubtree({ pages, baseUrl: base, startPage: 'docs', locale: 'fr' }),
/Locale "fr" does not exist/,
)
})
test('enforces the page limit', () => {
assert.throws(
() =>
selectSubtree({
pages,
baseUrl: base,
startPage: 'docs',
locale: 'en',
maxPages: 2,
}),
/above the configured limit/,
)
})
test('maps the root URL to Wiki.js home', () => {
const homePages = [
{ id: 1, path: 'home', locale: 'en', title: 'Home', isPublished: true },
{ id: 2, path: 'home/child', locale: 'en', title: 'Child', isPublished: true },
]
const result = selectSubtree({
pages: homePages,
baseUrl: base,
startPage: 'https://wiki.example.com/en/',
})
assert.equal(result.startPath, 'home')
assert.deepEqual(
result.pages.map((page) => page.path),
['home', 'home/child'],
)
})