mirror of
https://github.com/betagouv/mon-entreprise
synced 2025-03-12 13:55:11 +00:00
test: ajoute le matcher vitest toEvaluate
This commit is contained in:
parent
23c5af6331
commit
abeae8dccc
5 changed files with 121 additions and 0 deletions
5
site/test/modele-social/helpers/PublicodesTypes.ts
Normal file
5
site/test/modele-social/helpers/PublicodesTypes.ts
Normal file
|
@ -0,0 +1,5 @@
|
|||
export type PublicodesTypes =
|
||||
| number
|
||||
| boolean
|
||||
| string
|
||||
| Record<string, unknown>
|
28
site/test/modele-social/helpers/logValue.ts
Normal file
28
site/test/modele-social/helpers/logValue.ts
Normal file
|
@ -0,0 +1,28 @@
|
|||
import { DottedName } from 'modele-social'
|
||||
import Engine from 'publicodes'
|
||||
|
||||
export const logValue = (e: Engine, rule: DottedName) => {
|
||||
const result = e.evaluate(rule)
|
||||
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
||||
|
||||
const unit = result.unit?.denominators
|
||||
? // eslint-disable-next-line @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-base-to-string
|
||||
`${result.unit?.numerators}/-${result.unit?.denominators}`
|
||||
: result.unit?.numerators
|
||||
? // eslint-disable-next-line @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-base-to-string
|
||||
`${result.unit?.numerators}`
|
||||
: ''
|
||||
|
||||
// eslint-disable-next-line no-console,@typescript-eslint/restrict-template-expressions
|
||||
console.log(`${rule} = ${result.nodeValue} ${unit}`)
|
||||
}
|
||||
|
||||
export const logApplicability = (e: Engine, rule: DottedName) => {
|
||||
const result = e.evaluate({ 'est applicable': rule })
|
||||
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
||||
|
||||
// eslint-disable-next-line no-console,@typescript-eslint/restrict-template-expressions
|
||||
console.log(
|
||||
`${rule} ${result.nodeValue ? 'est applicable' : 'n’est pas applicable'}`
|
||||
)
|
||||
}
|
67
site/test/modele-social/matchers/toEvaluate.ts
Normal file
67
site/test/modele-social/matchers/toEvaluate.ts
Normal file
|
@ -0,0 +1,67 @@
|
|||
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||
import { DottedName } from 'modele-social'
|
||||
import Engine, { Evaluation, PublicodesExpression } from 'publicodes'
|
||||
import { expect } from 'vitest'
|
||||
|
||||
import { PublicodesTypes } from '../helpers/PublicodesTypes'
|
||||
|
||||
const toEvaluate = function <T extends PublicodesTypes>(
|
||||
engine: Engine,
|
||||
rule: PublicodesExpression,
|
||||
value: Evaluation<T>
|
||||
) {
|
||||
const evaluated = engine.evaluate(rule).nodeValue
|
||||
const pass = evaluated === value
|
||||
|
||||
if (pass) {
|
||||
return {
|
||||
message: () =>
|
||||
// `this` context will have correct typings
|
||||
// @ts-ignore
|
||||
`expected ${this.utils.printReceived(
|
||||
evaluated
|
||||
// @ts-ignore
|
||||
)} not to equal ${this.utils.printExpected(
|
||||
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-base-to-string
|
||||
`${value}`
|
||||
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-base-to-string
|
||||
)} for rule ${rule}`,
|
||||
pass: true,
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
message: () =>
|
||||
// @ts-ignore
|
||||
`expected ${this.utils.printReceived(
|
||||
evaluated
|
||||
// @ts-ignore
|
||||
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-base-to-string
|
||||
)} to equal ${this.utils.printExpected(`${value}`)} for rule ${rule}`,
|
||||
pass: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const toBeApplicable = function (engine: Engine, rule: DottedName) {
|
||||
const pass = engine.evaluate({
|
||||
'est applicable': rule,
|
||||
}).nodeValue
|
||||
|
||||
if (pass) {
|
||||
return {
|
||||
message: () => `La règle ${rule} ne devrait pas être applicable`,
|
||||
pass: true,
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
message: () => `La règle ${rule} devrait être applicable`,
|
||||
pass: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
expect.extend({
|
||||
toEvaluate,
|
||||
toBeApplicable,
|
||||
})
|
20
site/test/vitest.d.ts
vendored
Normal file
20
site/test/vitest.d.ts
vendored
Normal file
|
@ -0,0 +1,20 @@
|
|||
import 'vitest'
|
||||
|
||||
import { DottedName } from 'modele-social'
|
||||
import { Evaluation, PublicodesExpression } from 'publicodes'
|
||||
|
||||
import { PublicodesTypes } from './modele-social/helpers/PublicodesTypes'
|
||||
|
||||
interface CustomMatchers<R = unknown> {
|
||||
toEvaluate: <T extends PublicodesTypes>(
|
||||
rule: PublicodesExpression,
|
||||
value: Evaluation<T>
|
||||
) => R
|
||||
toBeApplicable: (rule: DottedName) => R
|
||||
}
|
||||
|
||||
declare module 'vitest' {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
interface Assertion<T = any> extends CustomMatchers<T> {}
|
||||
interface AsymmetricMatchersContaining extends CustomMatchers {}
|
||||
}
|
|
@ -1 +1,2 @@
|
|||
import '@testing-library/jest-dom/vitest'
|
||||
import './test/modele-social/matchers/toEvaluate'
|
||||
|
|
Loading…
Add table
Reference in a new issue