mon-entreprise/test/conversation.test.js

153 lines
4.2 KiB
JavaScript

import { expect } from 'chai'
import dedent from 'dedent-js'
import { enrichRule, rulesFr as rules } from 'Engine/rules'
import { safeLoad } from 'js-yaml'
import { assocPath, merge } from 'ramda'
import reducers from 'Reducers/rootReducer'
import { simulationTargetNames } from '../source/config'
import {
currentQuestionSelector,
nextStepsSelector
} from '../source/selectors/analyseSelectors'
let baseState = {
conversationSteps: { foldedSteps: [] },
form: { conversation: { values: {} } }
}
describe('conversation', function() {
it('should start with the first missing variable', function() {
let rawRules = [
// TODO - this won't work without the indirection, figure out why
{ nom: 'startHere', formule: { somme: ['a', 'b'] }, espace: 'top' },
{ nom: 'a', espace: 'top', formule: 'aa' },
{ nom: 'b', espace: 'top', formule: 'bb' },
{ nom: 'aa', question: '?', titre: 'a', espace: 'top' },
{ nom: 'bb', question: '?', titre: 'b', espace: 'top' }
],
rules = rawRules.map(enrichRule),
state = merge(baseState, {
targetNames: ['startHere']
}),
currentQuestion = currentQuestionSelector(state, { rules })
expect(currentQuestion).to.equal('top . aa')
})
it('should deal with double unfold', function() {
let rawRules = [
// TODO - this won't work without the indirection, figure out why
{
nom: 'startHere',
formule: { somme: ['a', 'b', 'c'] },
espace: 'top'
},
{ nom: 'a', espace: 'top', formule: 'aa' },
{ nom: 'b', espace: 'top', formule: 'bb' },
{ nom: 'c', espace: 'top', formule: 'cc' },
{ nom: 'aa', question: '?', titre: 'a', espace: 'top' },
{ nom: 'bb', question: '?', titre: 'b', espace: 'top' },
{ nom: 'cc', question: '?', titre: 'c', espace: 'top' }
],
rules = rawRules.map(enrichRule)
let step1 = merge(baseState, {
targetNames: ['startHere']
})
let step2 = reducers(
assocPath(
['form', 'conversation', 'values'],
{ top: { aa: '1' } },
step1
),
{
type: 'STEP_ACTION',
name: 'fold',
step: 'top . aa'
}
)
let step3 = reducers(
assocPath(
['form', 'conversation', 'values'],
{ top: { bb: '1', aa: '1' } },
step2
),
{
type: 'STEP_ACTION',
name: 'fold',
step: 'top . bb'
}
)
let step4 = reducers(step3, {
type: 'STEP_ACTION',
name: 'unfold',
step: 'top . aa'
})
let lastStep = reducers(step4, {
type: 'STEP_ACTION',
name: 'unfold',
step: 'top . bb'
})
expect(currentQuestionSelector(lastStep, { rules })).to.equal('top . bb')
expect(lastStep.conversationSteps).to.have.property('foldedSteps')
expect(lastStep.conversationSteps.foldedSteps).to.have.lengthOf(1)
expect(lastStep.conversationSteps.foldedSteps[0]).to.equal('top . aa')
})
it('should first ask for questions without defaults, then those with defaults', function() {
let rawRules = dedent`
- nom: net
formule: brut - cotisation
- nom: brut
format: euro
- nom: cotisation
formule:
multiplication:
assiette: brut
variations:
- si: cadre
alors:
taux: 77%
- sinon:
taux: 80%
- nom: cadre
par défaut: non
`,
rules = safeLoad(rawRules).map(enrichRule)
let step1 = merge(baseState, {
targetNames: ['net']
})
expect(currentQuestionSelector(step1, { rules })).to.equal('brut')
let step2 = reducers(
assocPath(['form', 'conversation', 'values', 'brut'], '2300', step1),
{
type: 'STEP_ACTION',
name: 'fold',
step: 'brut'
}
)
expect(step2.conversationSteps).to.have.property('foldedSteps')
expect(step2.conversationSteps.foldedSteps).to.have.lengthOf(1)
expect(step2.conversationSteps.foldedSteps[0]).to.equal('brut')
expect(currentQuestionSelector(step2, { rules })).to.equal('cadre')
})
})
describe('real conversation', function() {
it('should not have more than X questions', function() {
let state = merge(baseState, {
targetNames: simulationTargetNames
}),
nextSteps = nextStepsSelector(state, { rules })
expect(nextSteps.length).to.be.below(30) // If this breaks, that's good news
expect(nextSteps.length).to.be.above(10)
})
})