Files
openmaic/OpenMAIC/packages/@openmaic/generation/test/support-primitives.test.ts
2026-08-16 14:58:47 +08:00

39 lines
1.4 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { parseActionsFromStructuredOutput, postProcessInteractiveHtml } from '@openmaic/generation';
describe('action parser', () => {
it('repairs malformed structured output and preserves interleaving', () => {
const actions = parseActionsFromStructuredOutput(
'[{"type":"text","content":"Start"},{"type":"action","name":"widget_setState","params":{}}',
'interactive',
['widget_setState'],
);
expect(actions).toEqual([
expect.objectContaining({ type: 'speech', text: 'Start' }),
expect.objectContaining({ type: 'widget_setState', state: {} }),
]);
});
it('filters slide-only actions from non-slide scenes', () => {
expect(
parseActionsFromStructuredOutput(
'[{"type":"action","name":"spotlight","params":{"elementId":"x"}}]',
'quiz',
),
).toEqual([]);
});
});
describe('interactive HTML post-processing', () => {
it('converts math, protects scripts, and injects KaTeX once', () => {
const source =
'<html><head></head><body>$x+1$<script>const price = "$5";</script></body></html>';
const once = postProcessInteractiveHtml(source);
const twice = postProcessInteractiveHtml(once);
expect(once).toContain('\\(x+1\\)');
expect(once).toContain('const price = "$5";');
expect(once).toContain('katex.min.css');
expect(twice.match(/katex\.min\.css/g) ?? []).toHaveLength(1);
});
});