43 lines
2.2 KiB
JavaScript
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'] }))
|
|
})
|