Tofu/scripts/import-recipes/tests/buildExtractionPrompt.test.js
2026-09-18 01:41:02 +02:00

43 lines
2.2 KiB
JavaScript

import { test } from 'node:test'
import assert from 'node:assert/strict'
import { buildExtractionPrompt } from '#import-recipes/extraction/buildExtractionPrompt.js'
const PARAGRAPHS = ['Gratin de courgettes', 'Pour 4 personnes', 'une poignée de pois chiches']
test('puts the document between markers, with its file name', () => {
const prompt = buildExtractionPrompt({ fileName: 'Gratin.odt', paragraphs: PARAGRAPHS })
assert.ok(prompt.includes('--- BEGIN DOCUMENT (file: Gratin.odt) ---'))
assert.ok(prompt.includes('--- END DOCUMENT ---'))
for (const paragraph of PARAGRAPHS) assert.ok(prompt.includes(paragraph))
})
test('keeps one line per paragraph, in order', () => {
const prompt = buildExtractionPrompt({ fileName: 'Gratin.odt', paragraphs: PARAGRAPHS })
const body = prompt.split('--- BEGIN DOCUMENT (file: Gratin.odt) ---\n')[1].split('\n--- END DOCUMENT ---')[0]
assert.deepEqual(body.split('\n'), PARAGRAPHS)
})
// The rules are what keep the model from turning « une poignée » into grams;
// losing them from the prompt would break the import silently.
test('states the raw-line rule and the imprecision rule', () => {
const prompt = buildExtractionPrompt({ fileName: 'Gratin.odt', paragraphs: PARAGRAPHS })
assert.ok(prompt.includes('EXACTLY as written'))
assert.ok(prompt.includes('character for character identical'))
assert.ok(prompt.includes('NEVER convert an imprecise amount into grams'))
assert.ok(prompt.includes('NEVER invent a number'))
})
test('shows imprecise examples, kept imprecise', () => {
const prompt = buildExtractionPrompt({ fileName: 'Gratin.odt', paragraphs: PARAGRAPHS })
assert.ok(prompt.includes('"une poignée de pois chiches"'))
assert.ok(prompt.includes('unit "poignée", imprecise true'))
assert.ok(prompt.includes('"un filet d\'huile d\'olive"'))
assert.ok(prompt.includes('"sel au goût"'))
})
test('is pure: same input, same prompt', () => {
const first = buildExtractionPrompt({ fileName: 'a.odt', paragraphs: ['x'] })
const second = buildExtractionPrompt({ fileName: 'a.odt', paragraphs: ['x'] })
assert.equal(first, second)
assert.notEqual(first, buildExtractionPrompt({ fileName: 'b.odt', paragraphs: ['x'] }))
})