UNPKG

@mintlify/previewing

Version:

Preview Mintlify docs locally

99 lines (98 loc) 4.15 kB
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); }); });