Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unable to run unittest that contain ValidationRules #94

Open
JordyThien opened this issue Oct 8, 2019 · 2 comments
Open

Unable to run unittest that contain ValidationRules #94

JordyThien opened this issue Oct 8, 2019 · 2 comments

Comments

@JordyThien
Copy link

JordyThien commented Oct 8, 2019

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.

@dymen1
Copy link

dymen1 commented Oct 15, 2019

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*\}$/

@saqibn
Copy link

saqibn commented Feb 9, 2020

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants