1
0
Fork 0
mirror of https://github.com/betagouv/mon-entreprise synced 2025-02-09 01:45:03 +00:00
mon-entreprise/test/real-rules.test.js
Johan Girod 00b122fa97 ⚙️ ajoute la conversion d'unité
Gros changements en perspective :
- Supprime la notion de période, au bénéfice de celle d'unité
  (`période : mensuelle` devient `unité: €/mois`)
- Améliore les rapports d'erreur avec des messages plus clair
- Ajoute un avertissement lorsque des types ne sont pas compatible
- Ajoute la conversion automatique d'unité dans le moteur
- Ajoute une notion d'unité par défaut de la simulation,
  c'est l'unité vers laquelle les règles qui ne spécifient pas
  d'unité seront converties
- Ajoute une notion d'unité par défaut des règles, qui spécifie
  l'unité de la règle qui prévaut lorsque qu'il n'y a pas
  d'unité par défaut de la simulation (utile pour les question ou
  pour s'assurer du bon type d'une règle)
2019-12-16 11:34:04 +01:00

59 lines
1.6 KiB
JavaScript

import { AssertionError } from 'chai'
import { merge } from 'ramda'
import { exampleAnalysisSelector } from 'Selectors/analyseSelectors'
import { rules } from '../source/engine/rules'
import { parseAll } from '../source/engine/traverse'
// les variables dans les tests peuvent être exprimées relativement à l'espace de nom de la règle,
// comme dans sa formule
let runExamples = (examples, rule) =>
examples.map(ex => {
let runExample = exampleAnalysisSelector(
{
rules,
currentExample: {
situation: ex.situation,
dottedName: rule.dottedName,
defaultUnits: ex['unités par défaut']
}
},
{ dottedName: rule.dottedName }
),
exampleValue = runExample.nodeValue,
goal = ex['valeur attendue'],
ok =
exampleValue === goal
? true
: typeof goal === 'number'
? Math.abs((exampleValue - goal) / goal) < 0.001
: goal === null && exampleValue === 0
return merge(ex, {
ok,
rule: runExample
})
})
let parsedRules = parseAll(rules)
describe('Tests des règles de notre base de règles', () =>
Object.values(parsedRules).map(rule => {
if (!rule.exemples) return null
describe(rule.dottedName, () => {
let examples = runExamples(rule.exemples, rule)
examples.map(example =>
it(example.nom + '', () => {
if (!example.ok)
throw new AssertionError(`
Valeur attendue : ${example['valeur attendue']}
Valeur obtenue : ${example.rule.nodeValue}
${
example.rule.nodeValue === null
? 'Variables manquantes : ' +
JSON.stringify(example.rule.missingVariables, null, 4)
: ''
}
`)
})
)
})
}))