mon-entreprise/test/mecanisms.test.js

68 lines
2.2 KiB
JavaScript

/*
Les mécanismes sont testés dans mécanismes/ comme le sont les variables
directement dans la base Publicode. On construit dans chaque fichier une base
Publicode autonome, dans laquelle intervient le mécanisme à tester, puis on
teste idéalement tous ses comportements sans en faire intervenir d'autres.
*/
import { expect } from 'chai'
import { collectMissingVariables } from '../source/engine/generateQuestions'
import { enrichRule } from '../source/engine/rules'
import { analyse, parseAll } from '../source/engine/traverse'
import { parseUnit } from '../source/engine/units'
import testSuites from './load-mecanism-tests'
describe('Mécanismes', () =>
testSuites.map(([suiteName, suite]) =>
Object.keys(suite)
.map(key => [key, suite[key] ?? undefined])
.map(
([name, { exemples, titre, 'unité attendue': unit } = {}]) =>
exemples &&
describe(`Suite ${suiteName}, test : ${titre ?? name}`, () =>
exemples.map(
({
nom: testTexte,
situation,
'unités par défaut': defaultUnits,
'valeur attendue': valeur,
'variables manquantes': expectedMissing
}) =>
it(testTexte == null ? '' : testTexte + '', () => {
let rules = parseAll(
Object.entries(suite)
.map(([dottedName, rule]) => ({
dottedName,
...rule
}))
.map(enrichRule)
),
state = situation || {},
stateSelector = name => state[name],
analysis = analyse(
rules,
name,
defaultUnits
)(stateSelector),
missing = collectMissingVariables(analysis.targets),
target = analysis.targets[0]
if (typeof valeur === 'number') {
expect(target.nodeValue).to.be.closeTo(valeur, 0.001)
} else if (valeur !== undefined) {
expect(target).to.have.property('nodeValue', valeur)
}
if (expectedMissing) {
expect(missing).to.eql(expectedMissing)
}
if (unit) {
expect(target.unit).not.to.be.equal(undefined)
expect(target.unit).to.deep.equal(parseUnit(unit))
}
})
))
)
))