É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>
37 lines
1.4 KiB
JavaScript
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')
|
|
})
|
|
})
|