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.