aurelia / testing

Simplifies the testing of UI components by providing an elegant, fluent interface for arranging test setups along with a number of runtime debug/test helpers.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Unable to run unittest that contain ValidationRules

JordyThien opened this issue · comments

I'm submitting a bug report

  • Library Version:
    1.0.0

Please tell us about your environment:

  • Operating System:
    Windows 10

  • Node Version:
    V10.16.0

  • NPM Version:
    6.9.0
  • JSPM OR Webpack AND Version
    webpack 4.34.0
  • Browser:
    n/a

  • Language:
    TypeScript 3.1.2

Current behavior:
When running a test that tests a component which uses ValidationRules, the following error pops up:

    ------------------------------------------------
    Inner Error:
    Message: Unable to parse accessor function:
    function (a) {
          /* istanbul ignore next */
          cov_q8rv1u7dl.f[2]++;
          cov_q8rv1u7dl.s[5]++;
          return a.message;
        }
    Inner Error Stack:
    Error: Unable to parse accessor function:
    function (a) {
          /* istanbul ignore next */
          cov_q8rv1u7dl.f[2]++;
          cov_q8rv1u7dl.s[5]++;
          return a.message;
        }

      at getAccessorExpression (node_modules/aurelia-validation/dist/commonjs/aurelia-validation.js:113:15)
      at PropertyAccessorParser.Object.<anonymous>.PropertyAccessorParser.parse (node_modules/aurelia-validation/dist/commonjs/aurelia-validation.js:95:28)
      at FluentEnsure.Object.<anonymous>.FluentEnsure.ensure (node_modules/aurelia-validation/dist/commonjs/aurelia-validation.js:1703:42)
      at Function.Object.<anonymous>.ValidationRules.ensure (node_modules/aurelia-validation/dist/commonjs/aurelia-validation.js:1770:58)
      at new App (src/app.ts:219:42)
      at Object.invoke (node_modules/aurelia-dependency-injection/dist/commonjs/aurelia-dependency-injection.js:379:24)
      at InvocationHandler.Object.<anonymous>.InvocationHandler.invoke (node_modules/aurelia-dependency-injection/dist/commonjs/aurelia-dependency-injection.js:352:28)
      at Container.Object.<anonymous>.Container.invoke (node_modules/aurelia-dependency-injection/dist/commonjs/aurelia-dependency-injection.js:538:28)
      at ProviderResolver.get (node_modules/aurelia-templating/dist/commonjs/aurelia-templating.js:2305:72)
      at Container.Object.<anonymous>.Container.get (node_modules/aurelia-dependency-injection/dist/commonjs/aurelia-dependency-injection.js:493:28)
      End Inner Error Stack
      ------------------------------------------------
      at new AggregateError (node_modules/aurelia-pal/dist/commonjs/aurelia-pal.js:37:11)
      at Container.Object.<anonymous>.Container.invoke (node_modules/aurelia-dependency-injection/dist/commonjs/aurelia-dependency-injection.js:541:19)
      at ProviderResolver.get (node_modules/aurelia-templating/dist/commonjs/aurelia-templating.js:2305:72)
      at Container.Object.<anonymous>.Container.get (node_modules/aurelia-dependency-injection/dist/commonjs/aurelia-dependency-injection.js:493:28)
      at Container.elementContainerGet [as get] (node_modules/aurelia-templating/dist/commonjs/aurelia-templating.js:2360:15)
      at HtmlBehaviorResource.create (node_modules/aurelia-templating/dist/commonjs/aurelia-templating.js:4379:56)
      at applyInstructions (node_modules/aurelia-templating/dist/commonjs/aurelia-templating.js:2470:31)
      at ViewFactory.create (node_modules/aurelia-templating/dist/commonjs/aurelia-templating.js:2691:7)
      at TemplatingEngine.enhance (node_modules/aurelia-templating/dist/commonjs/aurelia-templating.js:5227:24)
      at node_modules/aurelia-framework/dist/commonjs/aurelia-framework.js:176:28

I have searched for a proper way to unittest this, but I'm unable to find a solution. Hopefully the community can help me out.

What is the expected behavior?
A possibility to run unittest that contains ValidationRules without it throwing an exception.

I have created a public repo where you can find all the files necessary: https://github.com/JordyThien/aurelia-unittest-validation-rules
Basically I created a new aurelia project using the aurelia CLI: au new aurelia-testing --unattended --select typescript,jest,vscode --here

I've updated the https://github.com/JordyThien/aurelia-unittest-validation-rules/blob/master/src/app.ts to contain ValidationRules
And I updated the spec to add aurelia-validation
Where running the tests using au test the exception will be thrown.

This is caused by a parser in aurelia-validation/src/property-accessor-parser.ts, this parser filters the property name from the accessor function passed to the ensure method: .ensure((a: App) => a.message) which is then used to merge validation rules based on the returned property's name.
The parser only accepts the following "classic" function formats:

function (a) {
    return a.message;
}

function (a) {
    "use strict";
    return a.message;
}

function (a) {
    "use strict";
    cov_2n0ovlwwxg.f[2]++;
    return a.message;
}

function (a) {
    cov_2n0ovlwwxg.f[2]++;
    return a.message;
}

And fails on the following:

function (a) {
    cov_2n0ovlwwxg.f[2]++;
    cov_2n0ovlwwxg.s[5]++;
    return a.message;
}

function (a) {
    /* istanbul ignore next */
    cov_2n0ovlwwxg.f[2]++;
    cov_2n0ovlwwxg.s[5]++;
    return a.message;
}

So it seems that the combination of the used code coverage tool (istanbul), transpiling and accessor-parser are causing this issue.
Whilst I don't now the reasoning behind the regex used in the getAccesorExpression, one possible solution for this issue is replacing the regex used in parsing the "classic" function with:
/^function\s*\([$_\w\d]+\)\s*\{(?:\s*"use strict";)?(?:[$_\s\w\d\/\*.['"\]+;]+)?\s*return\s+[$_\w\d]+\.([$_\w\d]+)\s*;?\s*\}$/

add
/* istanbul ignore next */
before validation rules to skip the coverage till they fix the regex problem.