Files
wehub-resource-sync 070959e133
landing-page-staging / Deploy landing page to staging (push) Has been skipped
landing-page-ci / Validate landing page (push) Failing after 4s
visual-baseline / Capture visual baselines (push) Has been cancelled
bake-plugin-previews / Bake plugin previews (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:00:47 +08:00

104 lines
3.4 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import {
collectDesignSystemSourceContext,
mergeSourceContextIntoInput,
type FetchLike,
} from '../../src/design-systems/source-context.js';
describe('design system source context', () => {
it('reads GitHub metadata, README, and package context', async () => {
const fetchFn: FetchLike = async (url) => {
if (url === 'https://api.github.com/repos/acme/product') {
return jsonResponse({
description: 'Acme product UI repository.',
homepage: 'https://acme.example',
default_branch: 'trunk',
language: 'TypeScript',
stargazers_count: 42,
topics: ['design-system', 'dashboard'],
});
}
if (url === 'https://raw.githubusercontent.com/acme/product/trunk/README.md') {
return textResponse('# Acme Product\n\nDesign tokens and dense workflow components for Acme.');
}
if (url === 'https://raw.githubusercontent.com/acme/product/trunk/package.json') {
return textResponse(JSON.stringify({
name: '@acme/product',
description: 'Workspace UI package.',
}));
}
return textResponse('not found', 404);
};
const context = await collectDesignSystemSourceContext({
provenance: {
githubUrls: ['https://github.com/acme/product/tree/trunk'],
},
}, {
fetch: fetchFn,
maxReadmeChars: 160,
});
expect(context.github[0]).toMatchObject({
owner: 'acme',
repo: 'product',
description: 'Acme product UI repository.',
defaultBranch: 'trunk',
language: 'TypeScript',
stars: 42,
packageName: '@acme/product',
});
expect(context.notes).toContain('Fetched GitHub context');
expect(context.notes).toContain('Design tokens and dense workflow components');
const merged = mergeSourceContextIntoInput({
sourceNotes: 'GitHub/code: https://github.com/acme/product',
provenance: {
githubUrls: ['https://github.com/acme/product'],
sourceNotes: 'GitHub/code: https://github.com/acme/product',
},
}, context);
expect(merged.sourceNotes).toContain('GitHub/code: https://github.com/acme/product');
expect(merged.sourceNotes).toContain('Fetched GitHub context');
expect(merged.provenance?.sourceNotes).toContain('README excerpt');
expect(merged.provenance?.sourceNotes).not.toContain('GitHub/code:');
});
it('keeps generation usable when GitHub metadata is unavailable', async () => {
const context = await collectDesignSystemSourceContext({
provenance: {
githubUrls: ['git@github.com:acme/missing.git'],
},
}, {
fetch: async () => textResponse('not found', 404),
});
expect(context.github[0]).toMatchObject({
owner: 'acme',
repo: 'missing',
error: 'GitHub repository metadata unavailable (HTTP 404)',
});
expect(context.notes).toContain('GitHub repository metadata unavailable');
});
});
function jsonResponse(value: unknown, status = 200): ReturnType<FetchLike> {
return Promise.resolve({
ok: status >= 200 && status < 300,
status,
json: async () => value,
text: async () => JSON.stringify(value),
});
}
function textResponse(value: string, status = 200): ReturnType<FetchLike> {
return Promise.resolve({
ok: status >= 200 && status < 300,
status,
json: async () => JSON.parse(value),
text: async () => value,
});
}