177 lines
3.9 KiB
TypeScript
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"
|
|
});
|
|
});
|
|
});
|