Files
thu-maic--openmaic/tests/export/export-classroom-inline.test.ts
wehub-resource-sync c48612c494
CI / E2E Tests (push) Has been cancelled
CI / Lint, Typecheck & Unit Tests (push) Has been cancelled
Docs Build / Build docs site (push) Has been cancelled
Publish @openmaic packages / Build, validate & publish (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:03:23 +08:00

54 lines
2.3 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { inlineSceneContent } from '@/lib/export/use-export-classroom';
const fetchImpl = (async (_url: string) => {
if (_url === 'https://cdn.tailwindcss.com')
return new Response('/*tw*/', { status: 200, headers: { 'content-type': 'text/javascript' } });
return new Response('', { status: 404 });
}) as unknown as typeof fetch;
type AnyContent = Record<string, unknown>;
describe('inlineSceneContent', () => {
it('inlines external assets in an interactive scene content.html', async () => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const content: any = {
type: 'interactive',
html: '<script src="https://cdn.tailwindcss.com"></script>',
url: 'https://x',
};
const { content: out, report } = await inlineSceneContent(content, { fetchImpl });
expect((out as unknown as AnyContent).html).toContain('data:text/javascript;base64,');
expect((out as unknown as AnyContent).html).not.toContain('cdn.tailwindcss.com');
expect(report.inlined).toContain('https://cdn.tailwindcss.com');
});
it('passes through non-interactive scenes untouched (same reference)', async () => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const content: any = { type: 'slide', elements: [] };
const { content: out, report } = await inlineSceneContent(content, { fetchImpl });
expect(out).toBe(content);
expect(report.inlined).toEqual([]);
});
it('passes through interactive scenes with no html (url-only) untouched', async () => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const content: any = { type: 'interactive', url: 'https://x' };
const { content: out } = await inlineSceneContent(content, { fetchImpl });
expect(out).toBe(content);
});
it('preserves other content fields while replacing html', async () => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const content: any = {
type: 'interactive',
html: '<img src="https://cdn.tailwindcss.com">',
widgetType: 'game',
url: 'u',
};
const { content: out } = await inlineSceneContent(content, { fetchImpl });
expect((out as unknown as AnyContent).widgetType).toBe('game');
expect((out as unknown as AnyContent).url).toBe('u');
});
});