batchCooking/apps/web/cypress/e2e/sidebar.cy.ts
Nicolas 8bcea74b56
All checks were successful
CI / lint (push) Successful in 4m25s
CI / build (push) Successful in 2m18s
CI / intent-service-test (push) Successful in 5m41s
CI / e2e (push) Successful in 8m25s
CI / test (push) Successful in 30m0s
CI / build-android (push) Has been skipped
fix(layout): masque l'onglet « Paramètres d'application » hors de l'app native (#107)
Ses sections n'ont pas de sens sur le web (pas de « version installée », la
vérif de mise à jour y est un no-op) et son seul réglage web-pertinent — la
case « toujours rester sur le site web » — vit mieux dans le flux qu'il
pilote.

- `AppLayout.tsx` : `SETTINGS_ITEMS` gagne un `nativeOnly`, filtré une fois
  au chargement du module (`settingsNavItems`) via `Capacitor.isNativePlatform()`
  — l'entrée disparaît du menu Paramètres (sidebar + feuille « Plus »).
- `App.tsx` : la route `/parametres/application` redirige vers
  `/parametres/compte` sur le web, comme le précédent `/foyer`, pour qu'un
  bookmark ne tombe pas sur une page orpheline.
- `AppSettingsPage.tsx` : devient natif-only — la branche `webHint` et la
  section « rester sur le site web » sont retirées.
- La case « toujours rester sur le site web » déménage sur `/telecharger`
  (`DownloadPage`) : page publique qu'un visiteur non connecté sur
  navigateur téléphone peut atteindre, et c'est exactement le flux que la
  préférence concerne. `localStorage` sur l'origine web publique, là où
  `attemptOpenNativeApp` la lit. i18n `appSettings.redirect.*` →
  `download.stayOnWeb.*` ; `appSettings.version.webHint` supprimée.

Tests : `sidebar.cy.ts` / `app-settings-page.cy.ts` — l'entrée et la page
sont absentes sur le web, la route redirige. `download-page.cy.ts` — la
case « rester sur le site web » par défaut décochée, persistée au reload.
Local OK (sidebar 5/5, app-settings 2/2, download 3/3).

Closes #107

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 05:23:06 +02:00

88 lines
3.2 KiB
TypeScript

// Mocks the API via cy.intercept — this job doesn't run a live backend (see
// .github/workflows/ci.yml); apps/api's own Mocha suite covers real API
// behavior against a real database.
const authenticatedProfile = {
id: 1,
firstName: "Alice",
lastName: "Martin",
email: "alice@example.com",
tokenVersion: 0,
houseId: null,
dietId: null,
};
describe("Sidebar — settings menu and account menu", () => {
beforeEach(() => {
cy.intercept("GET", "**/auth/me", { statusCode: 200, body: authenticatedProfile });
// Not "**/planning*" — that glob also matches the Vite dev request for
// planning-page.scss (see planning-page.cy.ts for the same gotcha).
cy.intercept("GET", /\/planning\?/, { statusCode: 200, body: null });
});
it("no longer lists Foyer in the main nav", () => {
cy.visit("/");
cy.get(".app-sidebar__nav a").should("not.contain", "Foyer");
});
it("reveals the settings pages behind the Paramètres toggle", () => {
cy.visit("/");
cy.contains("a", "Compte").should("not.exist");
cy.contains("button", "Paramètres").click();
cy.contains("a", "Compte").should("have.attr", "href", "/parametres/compte");
cy.contains("a", "Préférences alimentaires").should(
"have.attr",
"href",
"/parametres/preferences",
);
cy.contains("a", "Foyer").should("have.attr", "href", "/parametres/foyer");
cy.contains("a", "Préférences utilisateur").should(
"have.attr",
"href",
"/parametres/preferences-utilisateur",
);
// "Paramètres d'application" is packaged-app only (issue #107) — Cypress
// runs as a plain web browser, so it's filtered out here.
cy.contains("a", "Paramètres d'application").should("not.exist");
});
it("opens the account menu from the greeting and links to Mon compte", () => {
cy.visit("/");
cy.contains("a", "Mon compte").should("not.exist");
cy.contains("button", "Bonjour Alice").click();
cy.contains("a", "Mon compte").click();
cy.url().should("include", "/parametres/compte");
});
it("redirects the old /foyer path to /parametres/foyer", () => {
cy.intercept("GET", "**/house/current", { statusCode: 200, body: null });
cy.visit("/foyer");
cy.url().should("include", "/parametres/foyer");
});
it("collapses to an icon-only rail and back, persisting the choice across reloads", () => {
cy.visit("/");
cy.get(".app-sidebar").should("not.have.class", "collapsed");
cy.contains("nav a", "Planning").should("be.visible");
cy.get(".app-sidebar__collapse-toggle").click();
cy.get(".app-sidebar").should("have.class", "collapsed");
// The label text hides (not removed from the DOM — still there for the
// `title` tooltip/accessibility), while the link itself stays visible,
// icon-only.
cy.contains("span.label", "Planning").should("exist").and("not.be.visible");
cy.get("nav a[title='Planning']").should("be.visible");
cy.reload();
cy.get(".app-sidebar").should("have.class", "collapsed");
cy.get(".app-sidebar__collapse-toggle").click();
cy.get(".app-sidebar").should("not.have.class", "collapsed");
cy.contains("nav a", "Planning").should("be.visible");
});
});