Skip to content

Commit 3370638

Browse files
committed
docs(docs-infra): Add tests for marked rendering
On top of #57338, to make sure we prevent similar regressions on marked rendering.
1 parent 5537bf8 commit 3370638

File tree

6 files changed

+659
-44
lines changed

6 files changed

+659
-44
lines changed

adev/shared-docs/pipeline/api-gen/rendering/test/BUILD.bazel

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,18 @@ ts_library(
1919
),
2020
deps = [
2121
"//adev/shared-docs/pipeline/api-gen/rendering:render_api_to_html_lib",
22+
"@npm//@bazel/runfiles",
23+
"@npm//@types/jsdom",
24+
"@npm//jsdom",
2225
],
2326
)
2427

2528
jasmine_node_test(
2629
name = "unit_tests",
30+
data = [
31+
"@npm//jsdom",
32+
] + glob([
33+
"**/*.json",
34+
]),
2735
deps = [":unit_test_lib"],
2836
)

adev/shared-docs/pipeline/api-gen/rendering/test/fake-entries.json

Lines changed: 584 additions & 41 deletions
Large diffs are not rendered by default.
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import {runfiles} from '@bazel/runfiles';
2+
import {readFile} from 'fs/promises';
3+
import {JSDOM} from 'jsdom';
4+
import {renderEntry} from '../rendering';
5+
import {getRenderable} from '../processing';
6+
import {initHighlighter} from '../shiki/shiki';
7+
import {configureMarkedGlobally} from '../marked/configuration';
8+
9+
describe('markdown to html', () => {
10+
const entries = new Map<string, DocumentFragment>();
11+
const entries2 = new Map<string, string>();
12+
13+
beforeAll(async () => {
14+
await initHighlighter();
15+
await configureMarkedGlobally();
16+
17+
const entryContent = await readFile(runfiles.resolvePackageRelative('fake-entries.json'), {
18+
encoding: 'utf-8',
19+
});
20+
const entryJson = JSON.parse(entryContent) as any;
21+
for (const entry of entryJson.entries) {
22+
const renderableJson = getRenderable(entry, '@angular/fakeentry');
23+
const fragment = JSDOM.fragment(await renderEntry(renderableJson));
24+
entries.set(entry['name'], fragment);
25+
entries2.set(entry['name'], await renderEntry(renderableJson));
26+
}
27+
});
28+
29+
it('should render description correctly', () => {
30+
const afterNextRenderEntry = entries.get('afterNextRender')!;
31+
const header = afterNextRenderEntry.querySelector('.docs-reference-header')!;
32+
expect(header).toBeDefined();
33+
expect(header.outerHTML).not.toContain('```');
34+
35+
console.log(entries2.get('afterNextRender'));
36+
const list = afterNextRenderEntry.querySelector('ul')!;
37+
expect(list).toBeDefined();
38+
39+
// List are rendered
40+
expect(list.outerHTML).toContain('<li>');
41+
42+
// Code blocks are rendered
43+
expect(list.outerHTML).toContain('<code>mixedReadWrite</code>');
44+
});
45+
46+
it('should render multiple {@link} blocks', () => {
47+
const provideClientHydrationEntry = entries.get('provideClientHydration')!;
48+
expect(provideClientHydrationEntry).toBeDefined();
49+
const cardItem = provideClientHydrationEntry.querySelector('.docs-reference-card-item ')!;
50+
expect(cardItem.innerHTML).not.toContain('@link');
51+
});
52+
});

adev/shared-docs/pipeline/api-gen/rendering/transforms/jsdoc-transforms.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export const JS_DOC_DESCRIPTION_TAG = 'description';
3737

3838
// Some links are written in the following format: {@link Route}
3939
const jsDoclinkRegex = /\{\s*@link\s+([^}]+)\s*\}/;
40+
const jsDoclinkRegexGlobal = /\{\s*@link\s+([^}]+)\s*\}/g;
4041

4142
/** Given an entity with a description, gets the entity augmented with an `htmlDescription`. */
4243
export function addHtmlDescription<T extends HasDescription & HasModuleName>(
@@ -196,7 +197,7 @@ function convertJsDocExampleToHtmlExample(text: string): string {
196197
}
197198

198199
function convertLinks(text: string, entry: HasModuleName) {
199-
return text.replace(jsDoclinkRegex, (_, link) => {
200+
return text.replace(jsDoclinkRegexGlobal, (_, link) => {
200201
const [symbol, description] = link.split(/\s(.+)/);
201202
if (symbol && description) {
202203
// {@link Route Some route with description}

adev/shared-docs/pipeline/guides/testing/list/list.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@
77
- Order
88
- here
99
- matter
10-
- doesn't
10+
- doesn't
11+
- [some link](https://angular.dev)
12+
- Code block `SomeClass`

adev/shared-docs/pipeline/guides/testing/list/list.spec.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,16 @@ describe('markdown to html', () => {
2121

2222
const unorderedList = markdownDocument.querySelector('ul');
2323
expect(unorderedList?.className).toBe('docs-list');
24-
expect(unorderedList?.childElementCount).toBe(4);
24+
expect(unorderedList?.childElementCount).toBe(6);
2525
expect(unorderedList?.textContent).toContain('matter');
2626
});
27+
28+
it('should render list items', () => {
29+
const unorderedList = markdownDocument.querySelector('ul');
30+
const linkItem = unorderedList!.children[4];
31+
expect(linkItem.outerHTML).toContain('href="https://angular.dev"');
32+
33+
const codeItem = unorderedList!.children[5];
34+
expect(codeItem.outerHTML).toContain('<code>SomeClass</code>');
35+
});
2736
});

0 commit comments

Comments
 (0)