File size: 5,636 Bytes
a0ebf39 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | import { describe, expect, test } from 'vitest';
import { buildPrompt, PROMPT_IDS, processConditionalBlocks } from '@/lib/prompts';
function buildOutlinePrompt(flags: {
hasSourceImages?: boolean;
imageEnabled?: boolean;
videoEnabled?: boolean;
}) {
const imageEnabled = flags.imageEnabled ?? false;
const videoEnabled = flags.videoEnabled ?? false;
return buildPrompt(PROMPT_IDS.REQUIREMENTS_TO_OUTLINES, {
requirement: 'Teach water cycle basics',
pdfContent: 'None',
availableImages: flags.hasSourceImages ? '- img_1: water cycle diagram' : 'No images available',
userProfile: '',
researchContext: 'None',
teacherContext: '',
hasSourceImages: flags.hasSourceImages ?? false,
imageEnabled,
videoEnabled,
mediaEnabled: imageEnabled || videoEnabled,
});
}
function buildSlidePrompt(flags: {
imageElementEnabled?: boolean;
generatedImageEnabled?: boolean;
generatedVideoEnabled?: boolean;
}) {
const generatedImageEnabled = flags.generatedImageEnabled ?? false;
const generatedVideoEnabled = flags.generatedVideoEnabled ?? false;
return buildPrompt(PROMPT_IDS.SLIDE_CONTENT, {
title: 'Water Cycle',
description: 'Explain evaporation and condensation',
keyPoints: '1. Evaporation\\n2. Condensation',
assignedImages: flags.imageElementEnabled ? '- img_1: source image' : 'No images available',
canvas_width: 1000,
canvas_height: 562.5,
teacherContext: '',
languageDirective: 'Teach in English.',
imageElementEnabled: flags.imageElementEnabled ?? false,
generatedImageEnabled,
generatedVideoEnabled,
mediaElementEnabled: generatedImageEnabled || generatedVideoEnabled,
});
}
function combined(prompt: { system: string; user: string } | null) {
expect(prompt).not.toBeNull();
return `${prompt!.system}\n${prompt!.user}`;
}
describe('conditional blocks', () => {
test('processConditionalBlocks includes content only when flag is truthy', () => {
expect(processConditionalBlocks('A {{#if enabled}}INCLUDED{{/if}} B', { enabled: true })).toBe(
'A INCLUDED B',
);
expect(processConditionalBlocks('A {{#if enabled}}INCLUDED{{/if}} B', { enabled: false })).toBe(
'A B',
);
});
});
describe('requirements-to-outlines media prompt conditions', () => {
test('omits media generation instructions when image and video generation are disabled', () => {
const text = combined(buildOutlinePrompt({ hasSourceImages: false }));
expect(text).not.toContain('mediaGenerations');
expect(text).not.toContain('suggestedImageIds');
expect(text).not.toContain('gen_img_');
expect(text).not.toContain('gen_vid_');
expect(text).not.toContain('{{');
});
test('includes image generation instructions without video instructions when only images are enabled', () => {
const text = combined(buildOutlinePrompt({ hasSourceImages: true, imageEnabled: true }));
expect(text).toContain('suggestedImageIds');
expect(text).toContain('mediaGenerations');
expect(text).toContain('gen_img_1');
expect(text).not.toContain('gen_vid_');
expect(text).not.toContain('{{');
});
test('includes video generation instructions without image generation placeholders when only video is enabled', () => {
const text = combined(buildOutlinePrompt({ videoEnabled: true }));
expect(text).toContain('mediaGenerations');
expect(text).toContain('gen_vid_1');
expect(text).not.toContain('gen_img_');
expect(text).not.toContain('suggestedImageIds');
expect(text).not.toContain('{{');
});
test('includes both image and video generation instructions when both are enabled', () => {
const text = combined(
buildOutlinePrompt({ hasSourceImages: true, imageEnabled: true, videoEnabled: true }),
);
expect(text).toContain('suggestedImageIds');
expect(text).toContain('mediaGenerations');
expect(text).toContain('gen_img_1');
expect(text).toContain('gen_vid_1');
expect(text).toContain('Content Safety Guidelines');
expect(text).not.toContain('{{');
});
});
describe('slide-content media prompt conditions', () => {
test('omits image and video element rules when no media resources are available', () => {
const text = combined(buildSlidePrompt({}));
expect(text).not.toContain('ImageElement');
expect(text).not.toContain('VideoElement');
expect(text).not.toContain('gen_img_');
expect(text).not.toContain('gen_vid_');
expect(text).not.toContain('{{');
});
test('allows source images without exposing generated image placeholders', () => {
const text = combined(buildSlidePrompt({ imageElementEnabled: true }));
expect(text).toContain('ImageElement');
expect(text).toContain('img_1');
expect(text).not.toContain('gen_img_');
expect(text).not.toContain('VideoElement');
expect(text).not.toContain('{{');
});
test('allows generated videos without exposing image element rules', () => {
const text = combined(buildSlidePrompt({ generatedVideoEnabled: true }));
expect(text).toContain('VideoElement');
expect(text).toContain('gen_vid_1');
expect(text).not.toContain('ImageElement');
expect(text).not.toContain('gen_img_');
expect(text).not.toContain('{{');
});
test('is shorter when all media rules are omitted', () => {
const noMedia = combined(buildSlidePrompt({}));
const allMedia = combined(
buildSlidePrompt({
imageElementEnabled: true,
generatedImageEnabled: true,
generatedVideoEnabled: true,
}),
);
expect(noMedia.length).toBeLessThan(allMedia.length - 1000);
});
});
|