batchCooking/apps/web/cypress/e2e/landing.feature
Nicolas da7b077098
All checks were successful
CI / lint (push) Successful in 2m1s
CI / build (push) Successful in 2m16s
CI / intent-service-test (push) Successful in 3m47s
CI / e2e (push) Successful in 7m45s
CI / test (push) Successful in 14m48s
feat(web): page vitrine publique à la racine (#41)
Un visiteur déconnecté sur `/` voit désormais une vraie page de
présentation avant qu'on lui demande de se connecter, au lieu d'être
renvoyé directement vers `/login`.

- `RequireAuth.tsx` devient sensible au chemin : dans sa branche `!user`,
  `pathname === "/"` rend `<LandingPage />` ; toutes les autres routes
  protégées redirigent vers `/login` exactement comme avant. Aucun
  changement de la table de routes — `/` reste `<PlanningPage>` niché sous
  `RequireAuth`+`AppLayout`, et `AppLayout` (donc la sidebar) ne monte
  jamais pour la vitrine.
- `pages/landing/LandingPage.tsx` + `landing-page.scss` : hero (accroche +
  illustration SVG dessinée à la main dans le langage de `lucide-react`,
  zéro dépendance ni asset externe) + deux CTA, grille de 4
  fonctionnalités (icônes lucide), section « aperçu », CTA final. Copie
  entièrement sous le namespace i18n `landing.*`.
- `index.html` : favicon SVG (monogramme « bC ») + `<meta description>` —
  `/` est maintenant une page publique partageable.
- Les 3 captures d'écran réelles de la section « aperçu » sont servies
  statiquement depuis `public/landing/` (un fichier manquant retombe sur
  son `alt`, ne casse pas le build) ; elles restent à produire par un
  humain avec l'app lancée sur des données réelles — cf.
  `public/landing/README.md`.
- Tests Cypress `landing.feature` : vitrine visible déconnecté sur `/`,
  CTA vers `/login` et `/signup`, autre route protégée toujours redirigée,
  visiteur connecté voit bien le planning. `smoke.cy.ts` mis à jour pour
  tester la redirection depuis `/recettes` (puisque `/` ne redirige plus).

Closes #41
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-06 04:33:41 +02:00

35 lines
1.3 KiB
Gherkin

Feature: Public landing page at the root
A logged-out visitor on "/" should see a real presentation of the app
before being asked to sign in — but every other guarded route, and a
logged-in visitor, must behave exactly as before.
Scenario: A logged-out visitor lands on the presentation page
Given I am not signed in
When I visit "/"
Then I should see the heading "Cuisinez une fois, mangez toute la semaine"
And I should see the landing call to action
Scenario: The landing page sends visitors to sign in
Given I am not signed in
And I visit "/"
When I click the link "Se connecter"
Then the URL should include "/login"
Scenario: The landing page sends visitors to create an account
Given I am not signed in
And I visit "/"
When I click the link "Créer un compte"
Then the URL should include "/signup"
Scenario: Another guarded route still redirects a logged-out visitor to sign in
Given I am not signed in
When I visit "/recettes"
Then the URL should include "/login"
Scenario: A signed-in visitor on "/" still gets the planning, not the landing
Given I am signed in as "Alice" "Martin"
And the planning request returns nothing
When I visit "/"
Then I should see the heading "Planning de la semaine"
And I should not see "Cuisinez une fois, mangez toute la semaine"