@mintlify/previewing
Version:
Preview Mintlify docs locally
99 lines (98 loc) • 4.15 kB
JavaScript
import { beforeEach, describe, expect, it } from 'vitest';
import { clearPageMetadataCache, ensurePageMetadataCacheForDocsConfig, generateDocsNavFromPageMetadataCache, hydratePageMetadataCacheFromGeneratedNav, upsertPageMetadataCacheEntryForFile, } from '../local-preview/listener/page-metadata-cache.js';
const createDocsConfig = (pages) => ({
$schema: 'https://mintlify.com/docs.json',
name: 'Mintlify',
theme: 'mint',
colors: {
primary: '#16A34A',
},
navigation: {
pages,
},
});
describe('pageMetadataCache', () => {
beforeEach(() => {
clearPageMetadataCache();
});
it('regenerates docs nav with updated frontmatter metadata from the cache', () => {
upsertPageMetadataCacheEntryForFile('intro.mdx', '---\ntitle: Updated Intro\ndescription: Updated description\n---\n# Intro');
const generatedNav = generateDocsNavFromPageMetadataCache(createDocsConfig(['intro']));
expect(generatedNav).toMatchObject({
pages: [
{
href: '/intro',
title: 'Updated Intro',
description: 'Updated description',
},
],
});
});
it('reports when a page references an OpenAPI spec via frontmatter', () => {
expect(upsertPageMetadataCacheEntryForFile('plain.mdx', '---\ntitle: Plain\n---\n# Plain')).toBe(false);
expect(upsertPageMetadataCacheEntryForFile('endpoint.mdx', '---\nopenapi: GET /pets\n---')).toBe(true);
});
it('reports when a page references an AsyncAPI spec via frontmatter', () => {
expect(upsertPageMetadataCacheEntryForFile('channel.mdx', '---\nasyncapi: subscribe /events\n---')).toBe(true);
});
it('regenerates docs nav without pages removed from docs config navigation', () => {
upsertPageMetadataCacheEntryForFile('intro.mdx', '---\ntitle: Intro\n---\n# Intro');
upsertPageMetadataCacheEntryForFile('removed.mdx', '---\ntitle: Removed\n---\n# Removed');
const generatedNav = generateDocsNavFromPageMetadataCache(createDocsConfig(['intro']));
expect(generatedNav).toMatchObject({
pages: [
{
href: '/intro',
title: 'Intro',
},
],
});
});
it('reuses generated metadata for API pages during navigation updates', async () => {
hydratePageMetadataCacheFromGeneratedNav({
pages: [
{
href: '/endpoint',
title: 'List pets',
openapi: 'GET /pets',
},
],
});
const docsConfig = createDocsConfig(['endpoint']);
expect(await ensurePageMetadataCacheForDocsConfig(docsConfig)).toBe(false);
expect(generateDocsNavFromPageMetadataCache(docsConfig)).toMatchObject({
pages: [
{
href: '/endpoint',
title: 'List pets',
},
],
});
});
it('invalidates generated metadata when API frontmatter changes', async () => {
hydratePageMetadataCacheFromGeneratedNav({
pages: [
{
href: '/endpoint',
title: 'List pets',
openapi: 'GET /pets',
},
],
});
upsertPageMetadataCacheEntryForFile('endpoint.mdx', '---\nopenapi: GET /animals\n---');
expect(await ensurePageMetadataCacheForDocsConfig(createDocsConfig(['endpoint']))).toBe(true);
});
it('removes generated metadata missing from the latest navigation', async () => {
hydratePageMetadataCacheFromGeneratedNav({
pages: [
{
href: '/removed',
title: 'Removed title',
openapi: 'GET /removed',
},
],
});
hydratePageMetadataCacheFromGeneratedNav({ pages: [] });
expect(await ensurePageMetadataCacheForDocsConfig(createDocsConfig(['removed']))).toBe(false);
});
});