first commit
This commit is contained in:
@@ -0,0 +1,176 @@
|
||||
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"
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user