Test de la conversation

pull/256/head
Mael 2018-06-18 12:12:08 +02:00
parent da702ea75c
commit c110cdee9d
6 changed files with 170 additions and 21 deletions

View File

@ -8,10 +8,7 @@
"engines": {
"node": ">=8.10.0 <10.0.0"
},
"browserslist": [
"> 1% in FR",
"not ie < 11"
],
"browserslist": ["> 1% in FR", "not ie < 11"],
"dependencies": {
"@babel/core": "=7.0.0-beta.51",
"@babel/plugin-proposal-decorators": "=7.0.0-beta.51",
@ -92,20 +89,29 @@
"yaml-loader": "^0.5.0"
},
"scripts": {
"pretest": "LIST=`git diff --name-only HEAD..HEAD^ | grep .*\\.js | grep -v json`; if [ \"$LIST\" ]; then eslint $LIST; fi && flow check",
"pretest":
"LIST=`git diff --name-only HEAD..HEAD^ | grep .*\\.js | grep -v json`; if [ \"$LIST\" ]; then eslint $LIST; fi && flow check",
"start": "node source/server.js",
"externalize": "node source/externalize.js",
"prepare": "flow-typed install",
"compile": "webpack --config source/webpack.prod.js",
"test": "mocha-webpack --webpack-config source/webpack.test.js --require source-map-support/register --include componentTestSetup.js --require test/helpers/browser.js \"./{,!(node_modules)/**/}!(webpack).test.js\"",
"test-watch": "mocha-webpack --webpack-config source/webpack.test.js --require source-map-support/register --require test/helpers/browser.js \"test/**/*.test.js\" --watch",
"test-meca": "mocha-webpack --webpack-config source/webpack.test.js --require source-map-support/register --require test/helpers/browser.js test/mecanisms.test.js --watch",
"test-rules": "mocha-webpack --webpack-config source/webpack.test.js --require source-map-support/register --require test/helpers/browser.js test/real-rules.test.js --watch",
"test-inversions": "mocha-webpack --webpack-config source/webpack.test.js --require source-map-support/register --require test/helpers/browser.js \"test/inversion.test.js\" --watch",
"test-components": "mocha-webpack --webpack-config source/webpack.test.js --require source-map-support/register --include componentTestSetup.js --require test/helpers/browser.js \"source/components/**/*.test.js\" --watch",
"test":
"mocha-webpack --webpack-config source/webpack.test.js --require source-map-support/register --include componentTestSetup.js --require test/helpers/browser.js \"./{,!(node_modules)/**/}!(webpack).test.js\"",
"test-watch":
"mocha-webpack --webpack-config source/webpack.test.js --require source-map-support/register --require test/helpers/browser.js \"test/**/*.test.js\" --watch",
"test-meca":
"mocha-webpack --webpack-config source/webpack.test.js --require source-map-support/register --require test/helpers/browser.js test/mecanisms.test.js --watch",
"test-rules":
"mocha-webpack --webpack-config source/webpack.test.js --require source-map-support/register --require test/helpers/browser.js test/real-rules.test.js --watch",
"test-inversions":
"mocha-webpack --webpack-config source/webpack.test.js --require source-map-support/register --require test/helpers/browser.js \"test/inversion.test.js\" --watch",
"test-components":
"mocha-webpack --webpack-config source/webpack.test.js --require source-map-support/register --include componentTestSetup.js --require test/helpers/browser.js \"source/components/**/*.test.js\" --watch",
"heroku-postbuild": "yarn install --production=false && yarn compile",
"eslint": "LIST=`git diff --cached --name-only HEAD | grep .*\\.js | grep -v json`; if [ \"$LIST\" ]; then eslint $LIST; fi",
"eslint-check": "eslint --print-config .eslintrc | eslint-config-prettier-check"
"eslint":
"LIST=`git diff --cached --name-only HEAD | grep .*\\.js | grep -v json`; if [ \"$LIST\" ]; then eslint $LIST; fi",
"eslint-check":
"eslint --print-config .eslintrc | eslint-config-prettier-check"
},
"devDependencies": {
"@babel/preset-flow": "^7.0.0-beta.51",

View File

@ -187,9 +187,7 @@ export let nestedSituationToPathMap = situation => {
let rec = (o, currentPath) =>
typeof o === 'object'
? chain(([k, v]) => rec(v, [...currentPath, trim(k)]), toPairs(o))
: typeof o === 'string'
? [[currentPath.join(' . '), o]]
: new Error('oups, all leaf values were expected to be strings')
: [[currentPath.join(' . '), o + '']]
return fromPairs(rec(situation, []))
}

View File

@ -4,14 +4,22 @@ import queryString from 'query-string'
import { getIframeOption, parseDataAttributes } from './utils'
import enTranslations from './locales/en.yaml'
let getFromSessionStorage = where =>
typeof sessionStorage !== 'undefined' ? sessionStorage[where] : null
let setToSessionStorage = (where, what) =>
typeof sessionStorage !== 'undefined' &&
do {
sessionStorage[where] = what
}
let lang =
getIframeOption('lang') ||
queryString.parse(location.search)['lang'] ||
parseDataAttributes(sessionStorage['lang']) ||
parseDataAttributes(getFromSessionStorage('lang')) ||
'fr'
sessionStorage['lang'] = lang
setToSessionStorage('lang', lang)
i18next.init(
{
debug: false,

View File

@ -67,7 +67,8 @@ function conversationSteps(
if (type === 'RESET_SIMULATION') return { foldedSteps: [], unfolded: null }
if (type !== 'STEP_ACTION') return state
if (name === 'fold') return { foldedSteps: [...state.foldedSteps, step] }
if (name === 'fold')
return { foldedSteps: [...state.foldedSteps, step], unfoldedStep: null }
if (name === 'unfold') {
// if a step had already been unfolded, bring it back !
return {

View File

@ -28,7 +28,7 @@ import {
export let flatRulesSelector = createSelector(
state => state.lang,
state => state.rules,
(state, props) => props && props.rules,
(lang, rules) => rules || (lang === 'en' ? baseRulesEn : baseRulesFr)
)

136
test/conversation.test.js Normal file
View File

@ -0,0 +1,136 @@
import { expect } from 'chai'
import dedent from 'dedent-js'
import yaml from 'js-yaml'
import { enrichRule } from '../source/engine/rules'
import reducers from '../source/reducers/reducers'
import { currentQuestionSelector } from '../source/selectors/analyseSelectors'
import { merge, assocPath } from 'ramda'
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
taux: 77%
- si: cadre
taux: 80%
- nom: cadre
par défaut: non
`,
rules = yaml.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')
})
})