From abeae8dccc8f2ac6b16783c41aa6c4f34515a4ae Mon Sep 17 00:00:00 2001 From: Jalil Arfaoui Date: Mon, 3 Feb 2025 16:09:10 +0100 Subject: [PATCH] test: ajoute le matcher vitest `toEvaluate` --- .../modele-social/helpers/PublicodesTypes.ts | 5 ++ site/test/modele-social/helpers/logValue.ts | 28 ++++++++ .../test/modele-social/matchers/toEvaluate.ts | 67 +++++++++++++++++++ site/test/vitest.d.ts | 20 ++++++ site/vitest-setup.ts | 1 + 5 files changed, 121 insertions(+) create mode 100644 site/test/modele-social/helpers/PublicodesTypes.ts create mode 100644 site/test/modele-social/helpers/logValue.ts create mode 100644 site/test/modele-social/matchers/toEvaluate.ts create mode 100644 site/test/vitest.d.ts diff --git a/site/test/modele-social/helpers/PublicodesTypes.ts b/site/test/modele-social/helpers/PublicodesTypes.ts new file mode 100644 index 000000000..2b2d89f57 --- /dev/null +++ b/site/test/modele-social/helpers/PublicodesTypes.ts @@ -0,0 +1,5 @@ +export type PublicodesTypes = + | number + | boolean + | string + | Record diff --git a/site/test/modele-social/helpers/logValue.ts b/site/test/modele-social/helpers/logValue.ts new file mode 100644 index 000000000..2e9d929ec --- /dev/null +++ b/site/test/modele-social/helpers/logValue.ts @@ -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'}` + ) +} diff --git a/site/test/modele-social/matchers/toEvaluate.ts b/site/test/modele-social/matchers/toEvaluate.ts new file mode 100644 index 000000000..61dc3f014 --- /dev/null +++ b/site/test/modele-social/matchers/toEvaluate.ts @@ -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 ( + engine: Engine, + rule: PublicodesExpression, + value: Evaluation +) { + 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, +}) diff --git a/site/test/vitest.d.ts b/site/test/vitest.d.ts new file mode 100644 index 000000000..e25a197e5 --- /dev/null +++ b/site/test/vitest.d.ts @@ -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 { + toEvaluate: ( + rule: PublicodesExpression, + value: Evaluation + ) => R + toBeApplicable: (rule: DottedName) => R +} + +declare module 'vitest' { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + interface Assertion extends CustomMatchers {} + interface AsymmetricMatchersContaining extends CustomMatchers {} +} diff --git a/site/vitest-setup.ts b/site/vitest-setup.ts index a9d0dd31a..a383b4d70 100644 --- a/site/vitest-setup.ts +++ b/site/vitest-setup.ts @@ -1 +1,2 @@ import '@testing-library/jest-dom/vitest' +import './test/modele-social/matchers/toEvaluate'