astro/packages/integrations/mdx/test/mdx-get-headings.test.js

61 lines
2 KiB
JavaScript
Raw Permalink Normal View History

import mdx from '@astrojs/mdx';
import { expect } from 'chai';
import { parseHTML } from 'linkedom';
import { loadFixture } from '../../../astro/test/test-utils.js';
describe('MDX getHeadings', () => {
let fixture;
before(async () => {
fixture = await loadFixture({
root: new URL('./fixtures/mdx-get-headings/', import.meta.url),
integrations: [mdx()],
});
await fixture.build();
});
it('adds anchor IDs to headings', async () => {
const html = await fixture.readFile('/test/index.html');
const { document } = parseHTML(html);
2022-08-01 21:25:50 +00:00
const h2Ids = document.querySelectorAll('h2').map((el) => el?.id);
const h3Ids = document.querySelectorAll('h3').map((el) => el?.id);
expect(document.querySelector('h1').id).to.equal('heading-test');
expect(h2Ids).to.contain('section-1');
expect(h2Ids).to.contain('section-2');
expect(h3Ids).to.contain('subsection-1');
expect(h3Ids).to.contain('subsection-2');
});
it('generates correct getHeadings() export', async () => {
const { headingsByPage } = JSON.parse(await fixture.readFile('/pages.json'));
// TODO: make this a snapshot test :)
2022-08-01 21:25:50 +00:00
expect(JSON.stringify(headingsByPage['./test.mdx'])).to.equal(
JSON.stringify([
{ depth: 1, slug: 'heading-test', text: 'Heading test' },
{ depth: 2, slug: 'section-1', text: 'Section 1' },
{ depth: 3, slug: 'subsection-1', text: 'Subsection 1' },
{ depth: 3, slug: 'subsection-2', text: 'Subsection 2' },
{ depth: 2, slug: 'section-2', text: 'Section 2' },
])
);
});
2022-08-01 21:25:50 +00:00
it('generates correct getHeadings() export for JSX expressions', async () => {
const { headingsByPage } = JSON.parse(await fixture.readFile('/pages.json'));
2022-08-01 21:25:50 +00:00
expect(JSON.stringify(headingsByPage['./test-with-jsx-expressions.mdx'])).to.equal(
JSON.stringify([
{
depth: 1,
slug: 'heading-test-with-jsx-expressions',
text: 'Heading test with JSX expressions',
},
{ depth: 2, slug: 'h2title', text: 'h2Title' },
{ depth: 3, slug: 'h3title', text: 'h3Title' },
])
);
});
});