- onboarding.cy.ts / preferences.cy.ts / recipes.cy.ts mockaient encore
GET /reference/diets|allergies avec l'ancienne forme {id, name}. Depuis
les deux derniers commits l'API renvoie {id, key} (uid anglais) et le
composant résout le libellé via i18n (t(`catalog.diets.${key}`)) — avec
key manquant, ça affichait littéralement "catalog.diets.undefined" au
lieu de "Végétarien"/"Omnivore"/etc., faisant échouer cy.select()/
cy.contains() dans ces 3 specs. Corrigé pour mocker {key: "vegetarian"},
{key: "peanuts"}, etc.
- recipes.cy.ts : le test "shows a not-found message" utilisait le
mauvais code d'erreur (4041 au lieu de ErrorCode.RECIPE_NOT_FOUND =
4045), donc RecipeDetailPanel tombait dans son état d'erreur générique
au lieu du message "Cette recette n'existe pas." — bug dans mon propre
test, sans rapport avec le refactor.
- pnpm lint (biome) : les fichiers touchés par le refactor précédent
avaient quelques soucis de formatage/tri d'imports (des sed multi-
fichiers, pas d'édition via l'outil habituel) — corrigés par
`biome check --write`.
Vérifié : ces 3 specs + recipe-form.cy.ts passent maintenant dans le job
CI GitHub Actions (Linux, Cypress s'y exécute réellement — contrairement
à cet environnement Windows sandboxé, voir les commits précédents) ; 102
tests Mocha + 32 scénarios Cucumber toujours au vert en local.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
81 lines
3 KiB
TypeScript
81 lines
3 KiB
TypeScript
// Mocks the API via cy.intercept — see auth.cy.ts for the rationale.
|
|
|
|
const authenticatedProfile = {
|
|
id: 1,
|
|
firstName: "Alice",
|
|
lastName: "Martin",
|
|
email: "alice@example.com",
|
|
tokenVersion: 0,
|
|
houseId: 1,
|
|
dietId: 2,
|
|
};
|
|
|
|
describe("Dietary preferences (/parametres/preferences) — hot saving", () => {
|
|
beforeEach(() => {
|
|
cy.intercept("GET", "**/auth/me", { statusCode: 200, body: authenticatedProfile });
|
|
cy.intercept("GET", "**/reference/diets", {
|
|
statusCode: 200,
|
|
body: [
|
|
{ id: 1, key: "omnivore" },
|
|
{ id: 2, key: "vegetarian" },
|
|
],
|
|
});
|
|
cy.intercept("GET", "**/reference/allergies", {
|
|
statusCode: 200,
|
|
body: [
|
|
{ id: 1, key: "peanuts", kind: "ALLERGY" },
|
|
{ id: 2, key: "gluten", kind: "INTOLERANCE" },
|
|
],
|
|
});
|
|
cy.intercept("GET", "**/profile/allergies", { statusCode: 200, body: [2] });
|
|
// The page also loads the reference ingredient list + the profile's
|
|
// disliked-ingredients selection for `DislikedIngredientsField` — added
|
|
// alongside `getDiets`/`getAllergies` in the same `Promise.all` (see
|
|
// PreferencesPage.tsx), so both need mocking here too or that `Promise.all`
|
|
// rejects and the whole page renders its error state instead of the form,
|
|
// taking `#diet`/the allergy checkboxes down with it.
|
|
cy.intercept("GET", "**/reference/ingredients", { statusCode: 200, body: [] });
|
|
cy.intercept("GET", "**/profile/disliked-ingredients", { statusCode: 200, body: [] });
|
|
});
|
|
|
|
it("loads the current regime, and shows allergies/intolerances as two groups", () => {
|
|
cy.visit("/parametres/preferences");
|
|
|
|
cy.get("#diet").should("have.value", "2");
|
|
cy.contains("legend", "Allergies").should("be.visible");
|
|
cy.contains("legend", "Intolérances").should("be.visible");
|
|
cy.contains("label", "Gluten").find("input[type=checkbox]").should("be.checked");
|
|
cy.contains("label", "Arachides").find("input[type=checkbox]").should("not.be.checked");
|
|
});
|
|
|
|
it("has no explicit save button anywhere on the page", () => {
|
|
cy.visit("/parametres/preferences");
|
|
cy.contains("button", "Enregistrer").should("not.exist");
|
|
});
|
|
|
|
it("autosaves the regime as soon as it's selected", () => {
|
|
cy.intercept("PATCH", "**/profile/diet", {
|
|
statusCode: 200,
|
|
body: { ...authenticatedProfile, dietId: 1 },
|
|
}).as("updateDiet");
|
|
|
|
cy.visit("/parametres/preferences");
|
|
cy.get("#diet").select("Omnivore");
|
|
|
|
cy.wait("@updateDiet").its("request.body").should("deep.equal", { dietId: 1 });
|
|
});
|
|
|
|
it("autosaves allergies and intolerances together after checking boxes", () => {
|
|
cy.intercept("PATCH", "**/profile/allergies", { statusCode: 200, body: [2, 1] }).as(
|
|
"updateAllergies",
|
|
);
|
|
|
|
cy.visit("/parametres/preferences");
|
|
cy.contains("label", "Arachides").find("input[type=checkbox]").check();
|
|
|
|
cy.wait("@updateAllergies")
|
|
.its("request.body")
|
|
.should("deep.equal", { allergyIds: [2, 1] });
|
|
cy.contains("Enregistré ✓").should("be.visible");
|
|
});
|
|
});
|