diff --git a/packages/app/src/__tests__/seed-conversations.test.ts b/packages/app/src/__tests__/seed-conversations.test.ts new file mode 100644 index 00000000..dfac64ea --- /dev/null +++ b/packages/app/src/__tests__/seed-conversations.test.ts @@ -0,0 +1,59 @@ +/** + * Seed Conversation Regression Tests + * + * Ensures each seed conversation produces at least the expected content types + * when run through the content extraction pipeline. This is a quick smoke test + * that verifies the extraction pipeline hasn't regressed. + */ +import { describe, it, expect } from 'vitest' +import { seedPrompts } from './fixtures/seedPrompts' +import { + extractAllFilms, + extractAllSongs, + extractAllPodcasts, + extractAllBooks, + extractAllTVSeries, + extractAllPlaces, + extractAllImages, + extractCodeBlocks, + extractRecipes, + extractEvents, + stripContentTags, +} from '@/composables/contentExtraction' + +describe('Seed conversation regression', () => { + for (const seed of seedPrompts) { + it(`[${seed.id}] produces expected content types for "${seed.userQuery.slice(0, 50)}"`, () => { + const text = seed.assistantResponse + const query = seed.userQuery + + // Run all extractors + const films = extractAllFilms(text) + const songs = extractAllSongs(text, query) + const podcasts = extractAllPodcasts(text) + const books = extractAllBooks(text, query) + const tvSeries = extractAllTVSeries(text, query) + const places = extractAllPlaces(text, query) + const images = extractAllImages(text, query) + const codeBlocks = extractCodeBlocks(text) + const recipes = extractRecipes(text) + const events = extractEvents(text) + + // Validate expected counts match + if (seed.expected.films !== undefined) expect(films.length).toBe(seed.expected.films) + if (seed.expected.songs !== undefined) expect(songs.length).toBe(seed.expected.songs) + if (seed.expected.podcasts !== undefined) expect(podcasts.length).toBe(seed.expected.podcasts) + if (seed.expected.books !== undefined) expect(books.length).toBe(seed.expected.books) + if (seed.expected.tvSeries !== undefined) expect(tvSeries.length).toBe(seed.expected.tvSeries) + if (seed.expected.places !== undefined) expect(places.length).toBe(seed.expected.places) + if (seed.expected.images !== undefined) expect(images.length).toBe(seed.expected.images) + if (seed.expected.codeBlocks !== undefined) expect(codeBlocks.length).toBe(seed.expected.codeBlocks) + if (seed.expected.recipes !== undefined) expect(recipes.length).toBe(seed.expected.recipes) + if (seed.expected.events !== undefined) expect(events.length).toBe(seed.expected.events) + + // Verify stripping leaves no tags + const stripped = stripContentTags(text) + expect(stripped).not.toMatch(/\[\[[^\]]+\]\]/) + }) + } +})