Files
ben-to/scripts/recipes/parse-bentext.unit.test.ts
2026-07-21 16:50:58 +02:00

177 lines
3.9 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { readBentext, splitIngredientLine } from "./parse-bentext.mjs";
describe("readBentext", () => {
it("parse header, ingredients, steps (3 blocs)", () => {
const raw = `Blinis
4
Petites crêpes épaisses.
---
Farine|200|g
Œufs|2|pcs
---
Mélanger la farine.
Cuire dans une poêle.
`;
const result = readBentext(raw);
expect(result.title).toBe("Blinis");
expect(result.version).toBe("4");
expect(result.servings).toBe(4);
expect(result.description).toBe("Petites crêpes épaisses.");
expect(result.ingredients).toEqual([
{ name: "Farine", quantity: 200, unit: "g", note: "" },
{ name: "Œufs", quantity: 2, unit: "pcs", note: "" }
]);
expect(result.steps).toEqual([
{ id: "step-1", priority: 10, phase: "cook", dependsOn: [], text: "Mélanger la farine." },
{ id: "step-2", priority: 20, phase: "cook", dependsOn: ["step-1"], text: "Cuire dans une poêle." }
]);
expect(result.notes).toEqual([]);
expect(result.tags).toEqual([]);
expect(result.meta).toEqual([]);
});
it("lit les tags, notes et meta quand 6 blocs --- sont présents", () => {
const raw = `Title
1
Description.
---
Farine|100|g
---
Mélanger.
---
Note A
Note B
---
apéritif
blinis
sprite:blinis
---
Meta X
Meta Y
`;
const result = readBentext(raw);
expect(result.notes).toEqual(["Note A", "Note B"]);
expect(result.tags).toEqual(["apéritif", "blinis", "sprite:blinis"]);
expect(result.meta).toEqual(["Meta X", "Meta Y"]);
});
it("ne place les tags qu'à partir de 4 blocs (sans notes ni meta)", () => {
const raw = `Title
1
Description.
---
Farine|100|g
---
Mélanger.
---
apéritif
blinis
`;
const result = readBentext(raw);
expect(result.tags).toEqual(["apéritif", "blinis"]);
expect(result.notes).toEqual([]);
expect(result.meta).toEqual([]);
});
it("place tags + meta dès 5 blocs (sans notes)", () => {
const raw = `Title
1
Description.
---
Farine|100|g
---
Mélanger.
---
apéritif
---
Meta X
`;
const result = readBentext(raw);
expect(result.tags).toEqual(["apéritif"]);
expect(result.notes).toEqual([]);
expect(result.meta).toEqual(["Meta X"]);
});
it("convertit les tags en minuscules", () => {
const raw = `T
1
D
---
A|1|g
---
S1
---
Bento
CARNET
`;
const result = readBentext(raw);
expect(result.tags).toEqual(["bento", "carnet"]);
});
it("gère les notes et tags vides (blocs absents)", () => {
const raw = `T
D
---
---
S1
`;
const result = readBentext(raw);
expect(result.title).toBe("T");
expect(result.version).toBe("");
expect(result.servings).toBe(1);
expect(result.description).toBe("D");
expect(result.ingredients).toEqual([]);
expect(result.steps).toEqual([{ id: "step-1", priority: 10, phase: "cook", dependsOn: [], text: "S1" }]);
expect(result.notes).toEqual([]);
expect(result.tags).toEqual([]);
expect(result.meta).toEqual([]);
});
it("extrait la note ingrédient après position 3 (parties | supplémentaires)", () => {
const raw = `T
1
D
---
Farine|200|g|type 55
---
Mélanger.
---
---
---
`;
const result = readBentext(raw);
expect(result.ingredients).toEqual([
{ name: "Farine", quantity: 200, unit: "g", note: "type 55" }
]);
});
});
describe("splitIngredientLine", () => {
it("split name | quantity | unit", () => {
expect(splitIngredientLine("Farine|200|g")).toEqual({ name: "Farine", quantity: 200, unit: "g", note: "" });
});
it("renvoie quantity=NaN si non numérique (comportement préservé)", () => {
expect(splitIngredientLine("Sel|abc|c. à c.")).toEqual({
name: "Sel",
quantity: Number.NaN,
unit: "c. à c.",
note: ""
});
});
it("conserve la note avec | à l'intérieur", () => {
expect(splitIngredientLine("Sauce|2|c. à s.|soja | sucrée")).toEqual({
name: "Sauce",
quantity: 2,
unit: "c. à s.",
note: "soja | sucrée"
});
});
});