Files
pdf_oralia_vibe/frontend/tests/retour.test.js
Bertrand Benjamin faab7173bd feat: ramène à la vue d'où l'on vient une fois le document enregistré
Éditer une ligne depuis Dépenses ou Recettes ouvrait le document, puis
relâchait sur la liste des documents : il fallait revenir à la page
d'analyse et refaire ses filtres à la main pour corriger la ligne suivante.

Les deux tables passent maintenant à l'éditeur la vue d'où l'on part,
filtres compris, et il y ramène à ses trois sorties : enregistrement
terminé, abandon, et document introuvable. Sans cette destination — depuis
la liste des documents, ou un lien direct — le repli reste la liste.

La destination arrive par l'URL, donc fabricable par n'importe qui : seule
une page de l'application est suivie (utils/retour.js). Une URL absolue, un
chemin protocol-relatif que le navigateur lirait comme un domaine, ou des
contre-slashs retombent sur le repli.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 18:29:40 +02:00

37 lines
1.4 KiB
JavaScript

// La destination de retour arrive par l'URL : elle est fabricable par
// n'importe qui, et un lien pieges ne doit pas pouvoir renvoyer l'utilisateur
// hors du site apres un enregistrement.
import { describe, expect, it } from 'vitest'
import { cheminRetour } from '../src/utils/retour.js'
describe('cheminRetour', () => {
it('rend la page d analyse avec ses filtres', () => {
const vue = '/analytics?immeuble_id=3&fournisseur=PPR&tag_id=0'
expect(cheminRetour(vue)).toBe(vue)
})
it('retombe sur la liste des documents quand rien n est demande', () => {
expect(cheminRetour(undefined)).toBe('/documents')
expect(cheminRetour('')).toBe('/documents')
})
it('refuse ce qui sortirait du site', () => {
// `//ailleurs.example` est un chemin protocol-relatif : le navigateur y lit
// un domaine, pas une page de l'application.
expect(cheminRetour('https://ailleurs.example')).toBe('/documents')
expect(cheminRetour('//ailleurs.example')).toBe('/documents')
expect(cheminRetour('/\\ailleurs.example')).toBe('/documents')
expect(cheminRetour('analytics')).toBe('/documents')
})
it('accepte le repli que l appelant lui donne', () => {
expect(cheminRetour(null, '/revenus')).toBe('/revenus')
})
it('ne retient que la premiere valeur quand le parametre est repete', () => {
expect(cheminRetour(['/analytics', 'https://ailleurs.example'])).toBe('/analytics')
})
})