1
0
Fork 0
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:
Jalil Arfaoui 2025-02-03 16:09:10 +01:00
parent 23c5af6331
commit abeae8dccc
5 changed files with 121 additions and 0 deletions

View file

@ -0,0 +1,5 @@
export type PublicodesTypes =
| number
| boolean
| string
| Record<string, unknown>

View 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' : 'nest pas applicable'}`
)
}

View 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
View 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 {}
}

View file

@ -1 +1,2 @@
import '@testing-library/jest-dom/vitest'
import './test/modele-social/matchers/toEvaluate'