a46764fb1b
ci / Validate workspace (push) Has been cancelled
landing-page-ci / Validate landing page (push) Has been cancelled
landing-page-deploy / Deploy landing page (push) Has been cancelled
github-metrics / Generate repository metrics SVG (push) Has been cancelled
refresh-contributors-wall / Refresh contributors wall cache bust (push) Waiting to run
73 lines
2.2 KiB
TypeScript
73 lines
2.2 KiB
TypeScript
// @ts-nocheck
|
|
import { describe, expect, it, beforeAll, afterAll } from 'vitest';
|
|
import { mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
import { tmpdir } from 'node:os';
|
|
import path from 'node:path';
|
|
|
|
import { loadCraftSections } from '../src/craft.js';
|
|
|
|
let craftDir;
|
|
|
|
beforeAll(async () => {
|
|
craftDir = await mkdtemp(path.join(tmpdir(), 'od-craft-test-'));
|
|
await writeFile(
|
|
path.join(craftDir, 'typography.md'),
|
|
'# typography\n\nALL CAPS ≥ 0.06em.\n',
|
|
'utf8',
|
|
);
|
|
await writeFile(
|
|
path.join(craftDir, 'color.md'),
|
|
'# color\n\nAccent ≤ 2 per screen.\n',
|
|
'utf8',
|
|
);
|
|
await writeFile(path.join(craftDir, 'empty.md'), ' \n\n', 'utf8');
|
|
});
|
|
|
|
afterAll(async () => {
|
|
if (craftDir) await rm(craftDir, { recursive: true, force: true });
|
|
});
|
|
|
|
describe('loadCraftSections', () => {
|
|
it('returns empty when nothing requested', async () => {
|
|
const r = await loadCraftSections(craftDir, []);
|
|
expect(r.body).toBe('');
|
|
expect(r.sections).toEqual([]);
|
|
});
|
|
|
|
it('concatenates requested sections in order with section headers', async () => {
|
|
const r = await loadCraftSections(craftDir, ['typography', 'color']);
|
|
expect(r.sections).toEqual(['typography', 'color']);
|
|
expect(r.body.startsWith('### typography')).toBe(true);
|
|
expect(r.body.includes('### color')).toBe(true);
|
|
expect(r.body.indexOf('### typography')).toBeLessThan(r.body.indexOf('### color'));
|
|
});
|
|
|
|
it('drops missing files silently (forward-compatible)', async () => {
|
|
const r = await loadCraftSections(craftDir, ['typography', 'motion', 'color']);
|
|
expect(r.sections).toEqual(['typography', 'color']);
|
|
});
|
|
|
|
it('drops empty files silently', async () => {
|
|
const r = await loadCraftSections(craftDir, ['empty', 'typography']);
|
|
expect(r.sections).toEqual(['typography']);
|
|
});
|
|
|
|
it('rejects bogus slugs (path traversal, special chars)', async () => {
|
|
const r = await loadCraftSections(craftDir, [
|
|
'../etc/passwd',
|
|
'typo/graphy',
|
|
'typography',
|
|
]);
|
|
expect(r.sections).toEqual(['typography']);
|
|
});
|
|
|
|
it('dedupes repeated requests', async () => {
|
|
const r = await loadCraftSections(craftDir, [
|
|
'typography',
|
|
'TYPOGRAPHY',
|
|
'typography',
|
|
]);
|
|
expect(r.sections).toEqual(['typography']);
|
|
});
|
|
});
|