1
0
Fork 0
mirror of https://github.com/betagouv/mon-entreprise synced 2025-02-10 15:05:01 +00:00
mon-entreprise/mon-entreprise/test/useSearchParamsSimulationSharing.test.js
Alexandre Hajjar 40fbb99026
Partage de la situation via URL (#1241)
*  Simplifie la lecture de l’action SET_SIMULATION - “return early”

*  Make automatic translation more fail-safe

* 🎨 Fix visuals for Overlay component

*  Make Banner component more versatile

* Share simulation banner

* Ajout des identifiants courts pour les objectifs
* Dé/sérialisation search params <-> situation & targetUnit, basée sur
  une logique générique (typeof)
* Suppression dans l'URL des search params correspondant à des
  noms de règles ou identifiant courts
* Banner de partage, avec modale ou Navigator.share si disponible.

Co-authored-by: Alexandre Hajjar <alexandre.hajjar@gmail.com>

* URL with state: remove targetUnit

* serializeEvaluation for url sharing

* serializeEvaluation for number, boolean, string
* use this serialization in url search params
* for now, no support for Objects (like localisation)

Co-authored-by: Johan Girod <dev@johangirod.com>

* 🖋️ Quelques légères modifications de nom pour les identifiants courts

Co-authored-by: Paul Chavard <github@paul.chavard.net>
Co-authored-by: Johan Girod <dev@johangirod.com>

close #552
2021-01-07 18:08:19 +01:00

141 lines
3.6 KiB
JavaScript

import { expect } from 'chai'
var sinon = require('sinon')
import Engine, { parsePublicodes } from 'publicodes'
import rules from 'modele-social'
import {
getSearchParamsFromSituation,
getSituationFromSearchParams,
getRulesParamNames,
cleanSearchParams,
} from '../source/components/utils/useSearchParamsSimulationSharing'
describe('identifiant court', () => {
const questions = Object.entries(parsePublicodes(rules))
.filter(([, ruleNode]) => ruleNode.rawNode['identifiant court'])
.map(([dottedName, ruleNode]) => [
dottedName,
ruleNode.rawNode['identifiant court'],
])
it('should be unique amongst rules', () => {
expect(questions.length).to.greaterThan(0)
expect(questions.length).to.eq(
new Set(questions.map(([, name]) => name)).size
)
})
})
describe('useSearchParamsSimulationSharing', () => {
const someRules = parsePublicodes(`
rule with:
identifiant court: panta
formule: 0
rule without:
formule: 0
`)
const engine = new Engine(someRules)
const dottedNameParamName = getRulesParamNames(engine.getParsedRules())
describe('getSearchParamsFromSituation', () => {
it('builds search params with and without identifiant court', () => {
expect(
getSearchParamsFromSituation(
engine,
{ 'rule with': '2000€/mois', 'rule without': '1000€/mois' },
dottedNameParamName
).toString()
).to.equal(
new URLSearchParams(
'panta=2000€/mois&rule without=1000€/mois'
).toString()
)
})
it.skip('builds search params with object', () => {
expect(
getSearchParamsFromSituation(
engine,
{ 'rule without': { 1: 2, 3: { 4: '5' } } },
dottedNameParamName
).toString()
).to.equal(
new URLSearchParams('rule without={"1":2,"3":{"4":"5"}}').toString()
)
})
it('handles empty situation with proper defaults', () => {
expect(
getSearchParamsFromSituation(engine, {}, dottedNameParamName).toString()
).to.equal('')
})
})
describe('getSituationFromSearchParams', () => {
it('reads search params with and without identifiant court', () => {
expect(
getSituationFromSearchParams(
new URLSearchParams('panta=2000€/mois&rule without=1000€/mois'),
dottedNameParamName
)
).to.deep.equal({
'rule with': '2000€/mois',
'rule without': '1000€/mois',
})
})
it('handles empty search params with proper defaults', () => {
expect(
getSituationFromSearchParams(
new URLSearchParams(''),
dottedNameParamName
)
).to.deep.equal({})
})
})
})
describe('useSearchParamsSimulationSharing hook', () => {
const someRules = parsePublicodes(`
rule with:
identifiant court: panta
formule: 0
rule without:
formule: 0
`)
const dottedNameParamName = getRulesParamNames(
new Engine(someRules).getParsedRules()
)
let setSearchParams
beforeEach(() => {
setSearchParams = sinon.spy(() => {})
})
it('removes searchParams that are in situation', () => {
const searchParams = new URLSearchParams('panta=123&rule without=333')
const newSituation = getSituationFromSearchParams(
searchParams,
dottedNameParamName
)
cleanSearchParams(
searchParams,
setSearchParams,
dottedNameParamName,
Object.keys(newSituation)
)
expect(setSearchParams.calledWith('')).to.be.true
})
it("doesn't remove other search params", () => {
const searchParams = new URLSearchParams(
'rule without=123&utm_campaign=marketing'
)
const newSituation = getSituationFromSearchParams(
searchParams,
dottedNameParamName
)
cleanSearchParams(
searchParams,
setSearchParams,
dottedNameParamName,
Object.keys(newSituation)
)
expect(setSearchParams.calledWith('utm_campaign=marketing')).to.be.true
})
})