164 lines
4.3 KiB
JavaScript
164 lines
4.3 KiB
JavaScript
import { expect } from 'chai';
|
|
import { enrichRule, rulesFr as rules } from 'Engine/rules';
|
|
import { assocPath, merge } from 'ramda';
|
|
import reducers from 'Reducers/rootReducer';
|
|
import salariéConfig from '../source/components/simulationConfigs/salarié.yaml';
|
|
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, {
|
|
simulation: { config: { objectifs: ['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, {
|
|
simulation: { config: { objectifs: ['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 = [
|
|
{ nom: 'net',
|
|
formule: 'brut - cotisation'
|
|
},
|
|
{
|
|
nom: 'brut',
|
|
question: 'Quel est le salaire brut ?',
|
|
format: 'euro'
|
|
},
|
|
{
|
|
nom: 'cotisation',
|
|
formule: {
|
|
multiplication: {
|
|
assiette: 'brut',
|
|
variations: [
|
|
{
|
|
si: 'cadre',
|
|
alors: {
|
|
taux: '77%'
|
|
}
|
|
}, {
|
|
sinon: {
|
|
taux: '80%'
|
|
}
|
|
|
|
}
|
|
]
|
|
|
|
}
|
|
}
|
|
},
|
|
{
|
|
nom: 'cadre',
|
|
question: 'Est-ce un cadre ?',
|
|
'par défaut': 'non'
|
|
}
|
|
]
|
|
,
|
|
rules = rawRules.map(enrichRule)
|
|
|
|
let step1 = merge(baseState, {
|
|
simulation: { config: { objectifs: ['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, {
|
|
simulation: { config: salariéConfig }
|
|
}),
|
|
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)
|
|
})
|
|
})
|