From c9b154bee877f62ec5d23ef01fda789ffe03e9bf Mon Sep 17 00:00:00 2001 From: Lee Prosser Date: Fri, 1 Apr 2016 20:32:33 +0100 Subject: [PATCH] Added interface abstractions for most types, also renamed some of the methods to be more sensible, which are breaking changes. --- .../factories/validation-group-factory.d.ts | 5 +- dist/definitions/index.d.ts | 13 +- dist/definitions/ivalidation-group.d.ts | 9 + .../processors/field-error-processor.d.ts | 3 +- .../processors/ifield-error-processor.d.ts | 6 + dist/definitions/rulesets/irule-resolver.d.ts | 4 + dist/definitions/rulesets/rule-resolver.d.ts | 3 +- dist/definitions/validation-group.d.ts | 18 +- dist/treacherous.all.js | 63 +++++-- dist/treacherous.browser.js | 63 +++++-- dist/treacherous.js | 63 +++++-- dist/treacherous.minimal.js | 63 +++++-- package.json | 2 +- src/factories/validation-group-factory.ts | 5 +- src/index.ts | 13 +- src/ivalidation-group.ts | 12 ++ src/processors/field-error-processor.ts | 7 +- src/processors/ifield-error-processor.ts | 12 ++ src/rulesets/irule-resolver.ts | 6 + src/rulesets/rule-resolver.ts | 3 +- src/validation-group.ts | 37 ++-- tests/specs/treacherous-sanity-tests.js | 6 +- tests/specs/validation-group-tests.js | 173 ++++++++++++++++-- 23 files changed, 458 insertions(+), 131 deletions(-) create mode 100644 dist/definitions/ivalidation-group.d.ts create mode 100644 dist/definitions/processors/ifield-error-processor.d.ts create mode 100644 dist/definitions/rulesets/irule-resolver.d.ts create mode 100644 src/ivalidation-group.ts create mode 100644 src/processors/ifield-error-processor.ts create mode 100644 src/rulesets/irule-resolver.ts diff --git a/dist/definitions/factories/validation-group-factory.d.ts b/dist/definitions/factories/validation-group-factory.d.ts index c20c1ef..d8d3bdc 100644 --- a/dist/definitions/factories/validation-group-factory.d.ts +++ b/dist/definitions/factories/validation-group-factory.d.ts @@ -1,12 +1,13 @@ import { ValidationGroup } from "../validation-group"; -import { FieldErrorProcessor } from "../processors/field-error-processor"; import { Ruleset } from "../rulesets/ruleset"; import { IModelWatcher } from "../watcher/imodel-watcher"; +import { IRuleResolver } from "../rulesets/irule-resolver"; +import { IFieldErrorProcessor } from "../processors/ifield-error-processor"; export declare class ValidationGroupFactory { private fieldErrorProcessor; private modelWatcher; private propertyResolver; private ruleResolver; - constructor(fieldErrorProcessor: FieldErrorProcessor, modelWatcher: IModelWatcher, propertyResolver: any, ruleResolver: any); + constructor(fieldErrorProcessor: IFieldErrorProcessor, modelWatcher: IModelWatcher, propertyResolver: any, ruleResolver: IRuleResolver); createValidationGroup: (model: any, ruleset: Ruleset) => ValidationGroup; } diff --git a/dist/definitions/index.d.ts b/dist/definitions/index.d.ts index 6d3c62e..6f9debd 100644 --- a/dist/definitions/index.d.ts +++ b/dist/definitions/index.d.ts @@ -1,4 +1,5 @@ export * from "./exposer"; +export * from "./ivalidation-group"; export * from "./validation-group"; export * from "./events/property-validation-changed-event"; export * from "./events/validation-state-changed-event"; @@ -7,12 +8,8 @@ export * from "./helpers/comparer-helper"; export * from "./helpers/type-helper"; export * from "./processors/field-error-processor"; export * from "./processors/field-has-error"; +export * from "./processors/ifield-error-processor"; export * from "./processors/validation-error"; -export * from "./rulesets/for-each-rule"; -export * from "./rulesets/rule-link"; -export * from "./rulesets/rule-resolver"; -export * from "./rulesets/ruleset-builder"; -export * from "./rulesets/ruleset"; export * from "./rules/date-validation-rule"; export * from "./rules/decimal-validation-rule"; export * from "./rules/email-validation-rule"; @@ -33,3 +30,9 @@ export * from "./watcher/imodel-watcher"; export * from "./watcher/model-watcher"; export * from "./watcher/property-changed-event"; export * from "./watcher/property-watcher"; +export * from "./rulesets/for-each-rule"; +export * from "./rulesets/irule-resolver"; +export * from "./rulesets/rule-link"; +export * from "./rulesets/rule-resolver"; +export * from "./rulesets/ruleset-builder"; +export * from "./rulesets/ruleset"; diff --git a/dist/definitions/ivalidation-group.d.ts b/dist/definitions/ivalidation-group.d.ts new file mode 100644 index 0000000..e7c0745 --- /dev/null +++ b/dist/definitions/ivalidation-group.d.ts @@ -0,0 +1,9 @@ +import { EventHandler } from "eventjs"; +export interface IValidationGroup { + propertyStateChangedEvent: EventHandler; + modelStateChangedEvent: EventHandler; + isValid(): Promise; + getModelErrors(): Promise; + getPropertyError(propertyRoute: string): Promise; + release(): void; +} diff --git a/dist/definitions/processors/field-error-processor.d.ts b/dist/definitions/processors/field-error-processor.d.ts index a85a12e..96fdff9 100644 --- a/dist/definitions/processors/field-error-processor.d.ts +++ b/dist/definitions/processors/field-error-processor.d.ts @@ -1,7 +1,8 @@ import * as Promise from "bluebird"; import { RuleRegistry } from "../rules/rule-registry"; import { RuleLink } from "../rulesets/rule-link"; -export declare class FieldErrorProcessor { +import { IFieldErrorProcessor } from "./ifield-error-processor"; +export declare class FieldErrorProcessor implements IFieldErrorProcessor { ruleRegistry: RuleRegistry; constructor(ruleRegistry: RuleRegistry); processRuleLink(fieldValue: any, ruleLink: RuleLink): Promise; diff --git a/dist/definitions/processors/ifield-error-processor.d.ts b/dist/definitions/processors/ifield-error-processor.d.ts new file mode 100644 index 0000000..19ad130 --- /dev/null +++ b/dist/definitions/processors/ifield-error-processor.d.ts @@ -0,0 +1,6 @@ +import * as Promise from "bluebird"; +import { RuleLink } from "../rulesets/rule-link"; +export interface IFieldErrorProcessor { + processRuleLink(fieldValue: any, ruleLink: RuleLink): Promise; + checkFieldForErrors(fieldValue: any, rules: any): Promise; +} diff --git a/dist/definitions/rulesets/irule-resolver.d.ts b/dist/definitions/rulesets/irule-resolver.d.ts new file mode 100644 index 0000000..3263026 --- /dev/null +++ b/dist/definitions/rulesets/irule-resolver.d.ts @@ -0,0 +1,4 @@ +import { Ruleset } from "./ruleset"; +export interface IRuleResolver { + resolvePropertyRules(propertyRoute: string, ruleset: Ruleset): any; +} diff --git a/dist/definitions/rulesets/rule-resolver.d.ts b/dist/definitions/rulesets/rule-resolver.d.ts index 176e89c..ed794d1 100644 --- a/dist/definitions/rulesets/rule-resolver.d.ts +++ b/dist/definitions/rulesets/rule-resolver.d.ts @@ -1,6 +1,7 @@ +import { IRuleResolver } from "./irule-resolver"; import { PropertyResolver } from "property-resolver"; import { Ruleset } from "./ruleset"; -export declare class RuleResolver { +export declare class RuleResolver implements IRuleResolver { private propertyResolver; constructor(propertyResolver?: PropertyResolver); isPropertyRoute: (possiblePropertyRoute: string) => boolean; diff --git a/dist/definitions/validation-group.d.ts b/dist/definitions/validation-group.d.ts index e65e115..6926822 100644 --- a/dist/definitions/validation-group.d.ts +++ b/dist/definitions/validation-group.d.ts @@ -1,11 +1,12 @@ import * as Promise from "bluebird"; import { PropertyResolver } from "property-resolver"; import { EventHandler } from "eventjs"; -import { FieldErrorProcessor } from "./processors/field-error-processor"; import { Ruleset } from "./rulesets/ruleset"; -import { RuleResolver } from "./rulesets/rule-resolver"; import { IModelWatcher } from "./watcher/imodel-watcher"; -export declare class ValidationGroup { +import { IValidationGroup } from "./ivalidation-group"; +import { IFieldErrorProcessor } from "./processors/ifield-error-processor"; +import { IRuleResolver } from "./rulesets/irule-resolver"; +export declare class ValidationGroup implements IValidationGroup { private fieldErrorProcessor; private modelWatcher; private propertyResolver; @@ -13,12 +14,12 @@ export declare class ValidationGroup { private ruleset; private model; refreshRate: number; - propertyErrors: {}; - propertyChangedEvent: EventHandler; - validationStateChangedEvent: EventHandler; + private propertyErrors; private activePromiseChain; private activeValidators; - constructor(fieldErrorProcessor: FieldErrorProcessor, modelWatcher: IModelWatcher, propertyResolver: PropertyResolver, ruleResolver: RuleResolver, ruleset: Ruleset, model: any, refreshRate?: number); + propertyStateChangedEvent: EventHandler; + modelStateChangedEvent: EventHandler; + constructor(fieldErrorProcessor: IFieldErrorProcessor, modelWatcher: IModelWatcher, propertyResolver: PropertyResolver, ruleResolver: IRuleResolver, ruleset: Ruleset, model: any, refreshRate?: number); private isRuleset(possibleRuleset); private isForEach(possibleForEach); private onModelChanged; @@ -29,7 +30,8 @@ export declare class ValidationGroup { private validateModel; private hasErrors; isValid: () => Promise; - getErrors: () => Promise; + getModelErrors: () => Promise; + getPropertyError: (propertyRoute: string) => Promise; release: () => void; private waitForValidatorsToFinish; } diff --git a/dist/treacherous.all.js b/dist/treacherous.all.js index 5fdf6cc..525e602 100644 --- a/dist/treacherous.all.js +++ b/dist/treacherous.all.js @@ -59,6 +59,7 @@ return /******/ (function(modules) { // webpackBootstrap for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; } __export(__webpack_require__(1)); + __export(__webpack_require__(40)); __export(__webpack_require__(3)); __export(__webpack_require__(11)); __export(__webpack_require__(12)); @@ -67,18 +68,14 @@ return /******/ (function(modules) { // webpackBootstrap __export(__webpack_require__(14)); __export(__webpack_require__(15)); __export(__webpack_require__(16)); - __export(__webpack_require__(40)); - __export(__webpack_require__(36)); - __export(__webpack_require__(35)); - __export(__webpack_require__(13)); - __export(__webpack_require__(33)); - __export(__webpack_require__(34)); + __export(__webpack_require__(41)); + __export(__webpack_require__(42)); __export(__webpack_require__(18)); __export(__webpack_require__(19)); __export(__webpack_require__(20)); __export(__webpack_require__(21)); __export(__webpack_require__(23)); - __export(__webpack_require__(41)); + __export(__webpack_require__(43)); __export(__webpack_require__(24)); __export(__webpack_require__(25)); __export(__webpack_require__(26)); @@ -89,10 +86,16 @@ return /******/ (function(modules) { // webpackBootstrap __export(__webpack_require__(31)); __export(__webpack_require__(17)); __export(__webpack_require__(32)); - __export(__webpack_require__(42)); + __export(__webpack_require__(44)); __export(__webpack_require__(37)); __export(__webpack_require__(39)); __export(__webpack_require__(38)); + __export(__webpack_require__(36)); + __export(__webpack_require__(45)); + __export(__webpack_require__(35)); + __export(__webpack_require__(13)); + __export(__webpack_require__(33)); + __export(__webpack_require__(34)); /***/ }, @@ -189,6 +192,7 @@ return /******/ (function(modules) { // webpackBootstrap var validation_state_changed_event_1 = __webpack_require__(12); var rule_resolver_1 = __webpack_require__(13); var type_helper_1 = __webpack_require__(14); + // TODO: This class is WAY to long, needs refactoring var ValidationGroup = (function () { function ValidationGroup(fieldErrorProcessor, modelWatcher, propertyResolver, ruleResolver, ruleset, model, refreshRate) { var _this = this; @@ -214,9 +218,9 @@ return /******/ (function(modules) { // webpackBootstrap if (_this.propertyErrors[propertyName]) { delete _this.propertyErrors[propertyName]; var eventArgs = new property_validation_changed_event_1.PropertyValidationChangedEvent(propertyName, true); - _this.propertyChangedEvent.publish(eventArgs); + _this.propertyStateChangedEvent.publish(eventArgs); if (hadErrors) { - _this.validationStateChangedEvent.publish(new validation_state_changed_event_1.ValidationStateChangedEvent(true)); + _this.modelStateChangedEvent.publish(new validation_state_changed_event_1.ValidationStateChangedEvent(true)); } } return; @@ -225,9 +229,9 @@ return /******/ (function(modules) { // webpackBootstrap _this.propertyErrors[propertyName] = possibleError; if (possibleError != previousError) { var eventArgs = new property_validation_changed_event_1.PropertyValidationChangedEvent(propertyName, false, possibleError); - _this.propertyChangedEvent.publish(eventArgs); + _this.propertyStateChangedEvent.publish(eventArgs); if (!hadErrors) { - _this.validationStateChangedEvent.publish(new validation_state_changed_event_1.ValidationStateChangedEvent(false)); + _this.modelStateChangedEvent.publish(new validation_state_changed_event_1.ValidationStateChangedEvent(false)); } } }; @@ -319,10 +323,14 @@ return /******/ (function(modules) { // webpackBootstrap return _this.waitForValidatorsToFinish() .then(function () { return !_this.hasErrors(); }); }; - this.getErrors = function () { + this.getModelErrors = function () { return _this.waitForValidatorsToFinish() .then(function () { return _this.propertyErrors; }); }; + this.getPropertyError = function (propertyRoute) { + return _this.waitForValidatorsToFinish() + .then(function () { return _this.propertyErrors[propertyRoute]; }); + }; this.release = function () { _this.modelWatcher.stopWatching(); }; @@ -336,8 +344,8 @@ return /******/ (function(modules) { // webpackBootstrap }, 50); }); }; - this.propertyChangedEvent = new eventjs_1.EventHandler(this); - this.validationStateChangedEvent = new eventjs_1.EventHandler(this); + this.propertyStateChangedEvent = new eventjs_1.EventHandler(this); + this.modelStateChangedEvent = new eventjs_1.EventHandler(this); this.modelWatcher.setupWatcher(model, ruleset, refreshRate); this.modelWatcher.onPropertyChanged.subscribe(this.onModelChanged); this.validateModel(); @@ -7107,6 +7115,20 @@ return /******/ (function(modules) { // webpackBootstrap /* 40 */ /***/ function(module, exports) { + + + +/***/ }, +/* 41 */ +/***/ function(module, exports) { + + + + +/***/ }, +/* 42 */ +/***/ function(module, exports) { + var ValidationError = (function () { function ValidationError(propertyName, message) { this.propertyName = propertyName; @@ -7118,14 +7140,21 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }, -/* 41 */ +/* 43 */ /***/ function(module, exports) { /***/ }, -/* 42 */ +/* 44 */ +/***/ function(module, exports) { + + + + +/***/ }, +/* 45 */ /***/ function(module, exports) { diff --git a/dist/treacherous.browser.js b/dist/treacherous.browser.js index 9276dcd..9fa0f6b 100644 --- a/dist/treacherous.browser.js +++ b/dist/treacherous.browser.js @@ -59,6 +59,7 @@ return /******/ (function(modules) { // webpackBootstrap for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; } __export(__webpack_require__(1)); + __export(__webpack_require__(36)); __export(__webpack_require__(3)); __export(__webpack_require__(7)); __export(__webpack_require__(8)); @@ -67,18 +68,14 @@ return /******/ (function(modules) { // webpackBootstrap __export(__webpack_require__(10)); __export(__webpack_require__(11)); __export(__webpack_require__(12)); - __export(__webpack_require__(36)); - __export(__webpack_require__(32)); - __export(__webpack_require__(31)); - __export(__webpack_require__(9)); - __export(__webpack_require__(29)); - __export(__webpack_require__(30)); + __export(__webpack_require__(37)); + __export(__webpack_require__(38)); __export(__webpack_require__(14)); __export(__webpack_require__(15)); __export(__webpack_require__(16)); __export(__webpack_require__(17)); __export(__webpack_require__(19)); - __export(__webpack_require__(37)); + __export(__webpack_require__(39)); __export(__webpack_require__(20)); __export(__webpack_require__(21)); __export(__webpack_require__(22)); @@ -89,10 +86,16 @@ return /******/ (function(modules) { // webpackBootstrap __export(__webpack_require__(27)); __export(__webpack_require__(13)); __export(__webpack_require__(28)); - __export(__webpack_require__(38)); + __export(__webpack_require__(40)); __export(__webpack_require__(33)); __export(__webpack_require__(35)); __export(__webpack_require__(34)); + __export(__webpack_require__(32)); + __export(__webpack_require__(41)); + __export(__webpack_require__(31)); + __export(__webpack_require__(9)); + __export(__webpack_require__(29)); + __export(__webpack_require__(30)); /***/ }, @@ -189,6 +192,7 @@ return /******/ (function(modules) { // webpackBootstrap var validation_state_changed_event_1 = __webpack_require__(8); var rule_resolver_1 = __webpack_require__(9); var type_helper_1 = __webpack_require__(10); + // TODO: This class is WAY to long, needs refactoring var ValidationGroup = (function () { function ValidationGroup(fieldErrorProcessor, modelWatcher, propertyResolver, ruleResolver, ruleset, model, refreshRate) { var _this = this; @@ -214,9 +218,9 @@ return /******/ (function(modules) { // webpackBootstrap if (_this.propertyErrors[propertyName]) { delete _this.propertyErrors[propertyName]; var eventArgs = new property_validation_changed_event_1.PropertyValidationChangedEvent(propertyName, true); - _this.propertyChangedEvent.publish(eventArgs); + _this.propertyStateChangedEvent.publish(eventArgs); if (hadErrors) { - _this.validationStateChangedEvent.publish(new validation_state_changed_event_1.ValidationStateChangedEvent(true)); + _this.modelStateChangedEvent.publish(new validation_state_changed_event_1.ValidationStateChangedEvent(true)); } } return; @@ -225,9 +229,9 @@ return /******/ (function(modules) { // webpackBootstrap _this.propertyErrors[propertyName] = possibleError; if (possibleError != previousError) { var eventArgs = new property_validation_changed_event_1.PropertyValidationChangedEvent(propertyName, false, possibleError); - _this.propertyChangedEvent.publish(eventArgs); + _this.propertyStateChangedEvent.publish(eventArgs); if (!hadErrors) { - _this.validationStateChangedEvent.publish(new validation_state_changed_event_1.ValidationStateChangedEvent(false)); + _this.modelStateChangedEvent.publish(new validation_state_changed_event_1.ValidationStateChangedEvent(false)); } } }; @@ -319,10 +323,14 @@ return /******/ (function(modules) { // webpackBootstrap return _this.waitForValidatorsToFinish() .then(function () { return !_this.hasErrors(); }); }; - this.getErrors = function () { + this.getModelErrors = function () { return _this.waitForValidatorsToFinish() .then(function () { return _this.propertyErrors; }); }; + this.getPropertyError = function (propertyRoute) { + return _this.waitForValidatorsToFinish() + .then(function () { return _this.propertyErrors[propertyRoute]; }); + }; this.release = function () { _this.modelWatcher.stopWatching(); }; @@ -336,8 +344,8 @@ return /******/ (function(modules) { // webpackBootstrap }, 50); }); }; - this.propertyChangedEvent = new eventjs_1.EventHandler(this); - this.validationStateChangedEvent = new eventjs_1.EventHandler(this); + this.propertyStateChangedEvent = new eventjs_1.EventHandler(this); + this.modelStateChangedEvent = new eventjs_1.EventHandler(this); this.modelWatcher.setupWatcher(model, ruleset, refreshRate); this.modelWatcher.onPropertyChanged.subscribe(this.onModelChanged); this.validateModel(); @@ -1274,6 +1282,20 @@ return /******/ (function(modules) { // webpackBootstrap /* 36 */ /***/ function(module, exports) { + + + +/***/ }, +/* 37 */ +/***/ function(module, exports) { + + + + +/***/ }, +/* 38 */ +/***/ function(module, exports) { + var ValidationError = (function () { function ValidationError(propertyName, message) { this.propertyName = propertyName; @@ -1285,14 +1307,21 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }, -/* 37 */ +/* 39 */ /***/ function(module, exports) { /***/ }, -/* 38 */ +/* 40 */ +/***/ function(module, exports) { + + + + +/***/ }, +/* 41 */ /***/ function(module, exports) { diff --git a/dist/treacherous.js b/dist/treacherous.js index d265017..eb1ec49 100644 --- a/dist/treacherous.js +++ b/dist/treacherous.js @@ -59,6 +59,7 @@ return /******/ (function(modules) { // webpackBootstrap for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; } __export(__webpack_require__(1)); + __export(__webpack_require__(38)); __export(__webpack_require__(3)); __export(__webpack_require__(9)); __export(__webpack_require__(10)); @@ -67,18 +68,14 @@ return /******/ (function(modules) { // webpackBootstrap __export(__webpack_require__(12)); __export(__webpack_require__(13)); __export(__webpack_require__(14)); - __export(__webpack_require__(38)); - __export(__webpack_require__(34)); - __export(__webpack_require__(33)); - __export(__webpack_require__(11)); - __export(__webpack_require__(31)); - __export(__webpack_require__(32)); + __export(__webpack_require__(39)); + __export(__webpack_require__(40)); __export(__webpack_require__(16)); __export(__webpack_require__(17)); __export(__webpack_require__(18)); __export(__webpack_require__(19)); __export(__webpack_require__(21)); - __export(__webpack_require__(39)); + __export(__webpack_require__(41)); __export(__webpack_require__(22)); __export(__webpack_require__(23)); __export(__webpack_require__(24)); @@ -89,10 +86,16 @@ return /******/ (function(modules) { // webpackBootstrap __export(__webpack_require__(29)); __export(__webpack_require__(15)); __export(__webpack_require__(30)); - __export(__webpack_require__(40)); + __export(__webpack_require__(42)); __export(__webpack_require__(35)); __export(__webpack_require__(37)); __export(__webpack_require__(36)); + __export(__webpack_require__(34)); + __export(__webpack_require__(43)); + __export(__webpack_require__(33)); + __export(__webpack_require__(11)); + __export(__webpack_require__(31)); + __export(__webpack_require__(32)); /***/ }, @@ -189,6 +192,7 @@ return /******/ (function(modules) { // webpackBootstrap var validation_state_changed_event_1 = __webpack_require__(10); var rule_resolver_1 = __webpack_require__(11); var type_helper_1 = __webpack_require__(12); + // TODO: This class is WAY to long, needs refactoring var ValidationGroup = (function () { function ValidationGroup(fieldErrorProcessor, modelWatcher, propertyResolver, ruleResolver, ruleset, model, refreshRate) { var _this = this; @@ -214,9 +218,9 @@ return /******/ (function(modules) { // webpackBootstrap if (_this.propertyErrors[propertyName]) { delete _this.propertyErrors[propertyName]; var eventArgs = new property_validation_changed_event_1.PropertyValidationChangedEvent(propertyName, true); - _this.propertyChangedEvent.publish(eventArgs); + _this.propertyStateChangedEvent.publish(eventArgs); if (hadErrors) { - _this.validationStateChangedEvent.publish(new validation_state_changed_event_1.ValidationStateChangedEvent(true)); + _this.modelStateChangedEvent.publish(new validation_state_changed_event_1.ValidationStateChangedEvent(true)); } } return; @@ -225,9 +229,9 @@ return /******/ (function(modules) { // webpackBootstrap _this.propertyErrors[propertyName] = possibleError; if (possibleError != previousError) { var eventArgs = new property_validation_changed_event_1.PropertyValidationChangedEvent(propertyName, false, possibleError); - _this.propertyChangedEvent.publish(eventArgs); + _this.propertyStateChangedEvent.publish(eventArgs); if (!hadErrors) { - _this.validationStateChangedEvent.publish(new validation_state_changed_event_1.ValidationStateChangedEvent(false)); + _this.modelStateChangedEvent.publish(new validation_state_changed_event_1.ValidationStateChangedEvent(false)); } } }; @@ -319,10 +323,14 @@ return /******/ (function(modules) { // webpackBootstrap return _this.waitForValidatorsToFinish() .then(function () { return !_this.hasErrors(); }); }; - this.getErrors = function () { + this.getModelErrors = function () { return _this.waitForValidatorsToFinish() .then(function () { return _this.propertyErrors; }); }; + this.getPropertyError = function (propertyRoute) { + return _this.waitForValidatorsToFinish() + .then(function () { return _this.propertyErrors[propertyRoute]; }); + }; this.release = function () { _this.modelWatcher.stopWatching(); }; @@ -336,8 +344,8 @@ return /******/ (function(modules) { // webpackBootstrap }, 50); }); }; - this.propertyChangedEvent = new eventjs_1.EventHandler(this); - this.validationStateChangedEvent = new eventjs_1.EventHandler(this); + this.propertyStateChangedEvent = new eventjs_1.EventHandler(this); + this.modelStateChangedEvent = new eventjs_1.EventHandler(this); this.modelWatcher.setupWatcher(model, ruleset, refreshRate); this.modelWatcher.onPropertyChanged.subscribe(this.onModelChanged); this.validateModel(); @@ -1515,6 +1523,20 @@ return /******/ (function(modules) { // webpackBootstrap /* 38 */ /***/ function(module, exports) { + + + +/***/ }, +/* 39 */ +/***/ function(module, exports) { + + + + +/***/ }, +/* 40 */ +/***/ function(module, exports) { + var ValidationError = (function () { function ValidationError(propertyName, message) { this.propertyName = propertyName; @@ -1526,14 +1548,21 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }, -/* 39 */ +/* 41 */ /***/ function(module, exports) { /***/ }, -/* 40 */ +/* 42 */ +/***/ function(module, exports) { + + + + +/***/ }, +/* 43 */ /***/ function(module, exports) { diff --git a/dist/treacherous.minimal.js b/dist/treacherous.minimal.js index 9436c65..7d2c7f5 100644 --- a/dist/treacherous.minimal.js +++ b/dist/treacherous.minimal.js @@ -59,6 +59,7 @@ return /******/ (function(modules) { // webpackBootstrap for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; } __export(__webpack_require__(1)); + __export(__webpack_require__(36)); __export(__webpack_require__(3)); __export(__webpack_require__(7)); __export(__webpack_require__(8)); @@ -67,18 +68,14 @@ return /******/ (function(modules) { // webpackBootstrap __export(__webpack_require__(10)); __export(__webpack_require__(11)); __export(__webpack_require__(12)); - __export(__webpack_require__(36)); - __export(__webpack_require__(32)); - __export(__webpack_require__(31)); - __export(__webpack_require__(9)); - __export(__webpack_require__(29)); - __export(__webpack_require__(30)); + __export(__webpack_require__(37)); + __export(__webpack_require__(38)); __export(__webpack_require__(14)); __export(__webpack_require__(15)); __export(__webpack_require__(16)); __export(__webpack_require__(17)); __export(__webpack_require__(19)); - __export(__webpack_require__(37)); + __export(__webpack_require__(39)); __export(__webpack_require__(20)); __export(__webpack_require__(21)); __export(__webpack_require__(22)); @@ -89,10 +86,16 @@ return /******/ (function(modules) { // webpackBootstrap __export(__webpack_require__(27)); __export(__webpack_require__(13)); __export(__webpack_require__(28)); - __export(__webpack_require__(38)); + __export(__webpack_require__(40)); __export(__webpack_require__(33)); __export(__webpack_require__(35)); __export(__webpack_require__(34)); + __export(__webpack_require__(32)); + __export(__webpack_require__(41)); + __export(__webpack_require__(31)); + __export(__webpack_require__(9)); + __export(__webpack_require__(29)); + __export(__webpack_require__(30)); /***/ }, @@ -189,6 +192,7 @@ return /******/ (function(modules) { // webpackBootstrap var validation_state_changed_event_1 = __webpack_require__(8); var rule_resolver_1 = __webpack_require__(9); var type_helper_1 = __webpack_require__(10); + // TODO: This class is WAY to long, needs refactoring var ValidationGroup = (function () { function ValidationGroup(fieldErrorProcessor, modelWatcher, propertyResolver, ruleResolver, ruleset, model, refreshRate) { var _this = this; @@ -214,9 +218,9 @@ return /******/ (function(modules) { // webpackBootstrap if (_this.propertyErrors[propertyName]) { delete _this.propertyErrors[propertyName]; var eventArgs = new property_validation_changed_event_1.PropertyValidationChangedEvent(propertyName, true); - _this.propertyChangedEvent.publish(eventArgs); + _this.propertyStateChangedEvent.publish(eventArgs); if (hadErrors) { - _this.validationStateChangedEvent.publish(new validation_state_changed_event_1.ValidationStateChangedEvent(true)); + _this.modelStateChangedEvent.publish(new validation_state_changed_event_1.ValidationStateChangedEvent(true)); } } return; @@ -225,9 +229,9 @@ return /******/ (function(modules) { // webpackBootstrap _this.propertyErrors[propertyName] = possibleError; if (possibleError != previousError) { var eventArgs = new property_validation_changed_event_1.PropertyValidationChangedEvent(propertyName, false, possibleError); - _this.propertyChangedEvent.publish(eventArgs); + _this.propertyStateChangedEvent.publish(eventArgs); if (!hadErrors) { - _this.validationStateChangedEvent.publish(new validation_state_changed_event_1.ValidationStateChangedEvent(false)); + _this.modelStateChangedEvent.publish(new validation_state_changed_event_1.ValidationStateChangedEvent(false)); } } }; @@ -319,10 +323,14 @@ return /******/ (function(modules) { // webpackBootstrap return _this.waitForValidatorsToFinish() .then(function () { return !_this.hasErrors(); }); }; - this.getErrors = function () { + this.getModelErrors = function () { return _this.waitForValidatorsToFinish() .then(function () { return _this.propertyErrors; }); }; + this.getPropertyError = function (propertyRoute) { + return _this.waitForValidatorsToFinish() + .then(function () { return _this.propertyErrors[propertyRoute]; }); + }; this.release = function () { _this.modelWatcher.stopWatching(); }; @@ -336,8 +344,8 @@ return /******/ (function(modules) { // webpackBootstrap }, 50); }); }; - this.propertyChangedEvent = new eventjs_1.EventHandler(this); - this.validationStateChangedEvent = new eventjs_1.EventHandler(this); + this.propertyStateChangedEvent = new eventjs_1.EventHandler(this); + this.modelStateChangedEvent = new eventjs_1.EventHandler(this); this.modelWatcher.setupWatcher(model, ruleset, refreshRate); this.modelWatcher.onPropertyChanged.subscribe(this.onModelChanged); this.validateModel(); @@ -1274,6 +1282,20 @@ return /******/ (function(modules) { // webpackBootstrap /* 36 */ /***/ function(module, exports) { + + + +/***/ }, +/* 37 */ +/***/ function(module, exports) { + + + + +/***/ }, +/* 38 */ +/***/ function(module, exports) { + var ValidationError = (function () { function ValidationError(propertyName, message) { this.propertyName = propertyName; @@ -1285,14 +1307,21 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }, -/* 37 */ +/* 39 */ /***/ function(module, exports) { /***/ }, -/* 38 */ +/* 40 */ +/***/ function(module, exports) { + + + + +/***/ }, +/* 41 */ /***/ function(module, exports) { diff --git a/package.json b/package.json index b7151f8..e8d3c5a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "treacherous", - "version": "0.3.1", + "version": "0.4.0", "dependencies": { "bluebird": "^3.3.4", "property-resolver": "grofit/property-resolver", diff --git a/src/factories/validation-group-factory.ts b/src/factories/validation-group-factory.ts index 3b8040a..29a2ad7 100644 --- a/src/factories/validation-group-factory.ts +++ b/src/factories/validation-group-factory.ts @@ -1,11 +1,12 @@ import {ValidationGroup} from "../validation-group"; -import {FieldErrorProcessor} from "../processors/field-error-processor"; import {Ruleset} from "../rulesets/ruleset"; import {IModelWatcher} from "../watcher/imodel-watcher"; +import {IRuleResolver} from "../rulesets/irule-resolver"; +import {IFieldErrorProcessor} from "../processors/ifield-error-processor"; export class ValidationGroupFactory { - constructor(private fieldErrorProcessor: FieldErrorProcessor, private modelWatcher: IModelWatcher, private propertyResolver: any, private ruleResolver: any){} + constructor(private fieldErrorProcessor: IFieldErrorProcessor, private modelWatcher: IModelWatcher, private propertyResolver: any, private ruleResolver: IRuleResolver){} public createValidationGroup = (model: any, ruleset: Ruleset) => { return new ValidationGroup(this.fieldErrorProcessor, this.modelWatcher, this.propertyResolver, this.ruleResolver, ruleset, model); diff --git a/src/index.ts b/src/index.ts index 0987f32..2baf931 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,7 @@ /* This is an auto-generated file by gulp-es6-exporter */ export * from "./exposer" +export * from "./ivalidation-group" export * from "./validation-group" export * from "./events/property-validation-changed-event" export * from "./events/validation-state-changed-event" @@ -9,12 +10,8 @@ export * from "./helpers/comparer-helper" export * from "./helpers/type-helper" export * from "./processors/field-error-processor" export * from "./processors/field-has-error" +export * from "./processors/ifield-error-processor" export * from "./processors/validation-error" -export * from "./rulesets/for-each-rule" -export * from "./rulesets/rule-link" -export * from "./rulesets/rule-resolver" -export * from "./rulesets/ruleset-builder" -export * from "./rulesets/ruleset" export * from "./rules/date-validation-rule" export * from "./rules/decimal-validation-rule" export * from "./rules/email-validation-rule" @@ -35,3 +32,9 @@ export * from "./watcher/imodel-watcher" export * from "./watcher/model-watcher" export * from "./watcher/property-changed-event" export * from "./watcher/property-watcher" +export * from "./rulesets/for-each-rule" +export * from "./rulesets/irule-resolver" +export * from "./rulesets/rule-link" +export * from "./rulesets/rule-resolver" +export * from "./rulesets/ruleset-builder" +export * from "./rulesets/ruleset" diff --git a/src/ivalidation-group.ts b/src/ivalidation-group.ts new file mode 100644 index 0000000..1cd6e86 --- /dev/null +++ b/src/ivalidation-group.ts @@ -0,0 +1,12 @@ +import {EventHandler} from "eventjs"; +export interface IValidationGroup +{ + propertyStateChangedEvent: EventHandler; + modelStateChangedEvent: EventHandler; + + isValid(): Promise; + getModelErrors(): Promise; + getPropertyError(propertyRoute: string): Promise; + + release(): void; +} \ No newline at end of file diff --git a/src/processors/field-error-processor.ts b/src/processors/field-error-processor.ts index 4605861..e7269d9 100644 --- a/src/processors/field-error-processor.ts +++ b/src/processors/field-error-processor.ts @@ -1,15 +1,14 @@ import * as Promise from "bluebird"; -import {Ruleset} from "../rulesets/ruleset"; import {RuleRegistry} from "../rules/rule-registry"; import {RuleLink} from "../rulesets/rule-link"; -import {ValidationError} from "./validation-error"; import {FieldHasError} from "./field-has-error"; +import {IFieldErrorProcessor} from "./ifield-error-processor"; -export class FieldErrorProcessor +export class FieldErrorProcessor implements IFieldErrorProcessor { constructor(public ruleRegistry: RuleRegistry){} - public processRuleLink(fieldValue: any, ruleLink: RuleLink){ + public processRuleLink(fieldValue: any, ruleLink: RuleLink): Promise{ var validator = this.ruleRegistry.getRuleNamed(ruleLink.ruleName); var checkIfValid = (isValid) => { diff --git a/src/processors/ifield-error-processor.ts b/src/processors/ifield-error-processor.ts new file mode 100644 index 0000000..ffb5414 --- /dev/null +++ b/src/processors/ifield-error-processor.ts @@ -0,0 +1,12 @@ +import * as Promise from "bluebird"; +import {Ruleset} from "../rulesets/ruleset"; +import {RuleRegistry} from "../rules/rule-registry"; +import {RuleLink} from "../rulesets/rule-link"; +import {ValidationError} from "./validation-error"; +import {FieldHasError} from "./field-has-error"; + +export interface IFieldErrorProcessor +{ + processRuleLink(fieldValue: any, ruleLink: RuleLink): Promise; + checkFieldForErrors(fieldValue: any, rules: any): Promise; +} \ No newline at end of file diff --git a/src/rulesets/irule-resolver.ts b/src/rulesets/irule-resolver.ts new file mode 100644 index 0000000..c52985c --- /dev/null +++ b/src/rulesets/irule-resolver.ts @@ -0,0 +1,6 @@ +import {Ruleset} from "./ruleset"; + +export interface IRuleResolver +{ + resolvePropertyRules(propertyRoute: string, ruleset: Ruleset); +} \ No newline at end of file diff --git a/src/rulesets/rule-resolver.ts b/src/rulesets/rule-resolver.ts index 4eef580..eed5709 100644 --- a/src/rulesets/rule-resolver.ts +++ b/src/rulesets/rule-resolver.ts @@ -1,7 +1,8 @@ +import {IRuleResolver} from "./irule-resolver"; import {PropertyResolver} from "property-resolver"; import {Ruleset} from "./ruleset"; -export class RuleResolver +export class RuleResolver implements IRuleResolver { constructor(private propertyResolver = new PropertyResolver()) {} diff --git a/src/validation-group.ts b/src/validation-group.ts index 1a2c81c..e2ae2dd 100644 --- a/src/validation-group.ts +++ b/src/validation-group.ts @@ -2,7 +2,6 @@ import * as Promise from "bluebird"; import {PropertyResolver} from "property-resolver"; import {PropertyChangedEvent} from "./watcher/property-changed-event"; import {EventHandler} from "eventjs"; -import {FieldErrorProcessor} from "./processors/field-error-processor"; import {Ruleset} from "./rulesets/ruleset"; import {PropertyValidationChangedEvent} from "./events/property-validation-changed-event"; import {ValidationStateChangedEvent} from "./events/validation-state-changed-event"; @@ -10,24 +9,29 @@ import {RuleLink} from "./rulesets/rule-link"; import {RuleResolver} from "./rulesets/rule-resolver"; import {IModelWatcher} from "./watcher/imodel-watcher"; import {TypeHelper} from "./helpers/type-helper"; +import {IValidationGroup} from "./ivalidation-group"; +import {IFieldErrorProcessor} from "./processors/ifield-error-processor"; +import {IRuleResolver} from "./rulesets/irule-resolver"; -export class ValidationGroup +// TODO: This class is WAY to long, needs refactoring +export class ValidationGroup implements IValidationGroup { - public propertyErrors = {}; - public propertyChangedEvent: EventHandler; - public validationStateChangedEvent: EventHandler; + private propertyErrors = {}; private activePromiseChain: Promise; private activeValidators = 0; - constructor(private fieldErrorProcessor: FieldErrorProcessor, + public propertyStateChangedEvent: EventHandler; + public modelStateChangedEvent: EventHandler; + + constructor(private fieldErrorProcessor: IFieldErrorProcessor, private modelWatcher: IModelWatcher, private propertyResolver = new PropertyResolver(), - private ruleResolver = new RuleResolver(), + private ruleResolver: IRuleResolver = new RuleResolver(), private ruleset: Ruleset, private model: any, public refreshRate = 500) { - this.propertyChangedEvent = new EventHandler(this); - this.validationStateChangedEvent = new EventHandler(this); + this.propertyStateChangedEvent = new EventHandler(this); + this.modelStateChangedEvent = new EventHandler(this); this.modelWatcher.setupWatcher(model, ruleset, refreshRate); this.modelWatcher.onPropertyChanged.subscribe(this.onModelChanged); @@ -55,9 +59,9 @@ export class ValidationGroup if (this.propertyErrors[propertyName]) { delete this.propertyErrors[propertyName]; var eventArgs = new PropertyValidationChangedEvent(propertyName, true); - this.propertyChangedEvent.publish(eventArgs); + this.propertyStateChangedEvent.publish(eventArgs); if (hadErrors) { - this.validationStateChangedEvent.publish(new ValidationStateChangedEvent(true)); + this.modelStateChangedEvent.publish(new ValidationStateChangedEvent(true)); } } return; @@ -68,10 +72,10 @@ export class ValidationGroup if(possibleError != previousError){ var eventArgs = new PropertyValidationChangedEvent(propertyName, false, possibleError); - this.propertyChangedEvent.publish(eventArgs); + this.propertyStateChangedEvent.publish(eventArgs); if (!hadErrors) { - this.validationStateChangedEvent.publish(new ValidationStateChangedEvent(false)); + this.modelStateChangedEvent.publish(new ValidationStateChangedEvent(false)); } } }; @@ -177,11 +181,16 @@ export class ValidationGroup .then(() => { return !this.hasErrors() }); } - public getErrors = (): Promise => + public getModelErrors = (): Promise => { return this.waitForValidatorsToFinish() .then(() => { return this.propertyErrors}); } + + public getPropertyError = (propertyRoute: string): Promise => { + return this.waitForValidatorsToFinish() + .then(() => { return this.propertyErrors[propertyRoute]; }) + } public release = () => { this.modelWatcher.stopWatching(); diff --git a/tests/specs/treacherous-sanity-tests.js b/tests/specs/treacherous-sanity-tests.js index 36824d8..a58f641 100644 --- a/tests/specs/treacherous-sanity-tests.js +++ b/tests/specs/treacherous-sanity-tests.js @@ -10,13 +10,13 @@ describe('Treacherous Sanity Checks', function () { var validationGroup = Treacherous.create({}, new Treacherous.Ruleset()); expect(validationGroup).is.not.null; - expect(validationGroup.getErrors).to.be.a("function"); + expect(validationGroup.getModelErrors).to.be.a("function"); var validationGroupExplicitRules = Treacherous.createWithRules({}, function(rulesetBuilder){ return rulesetBuilder.create().build(); }); expect(validationGroupExplicitRules).is.not.null; - expect(validationGroupExplicitRules.getErrors).to.be.a("function"); + expect(validationGroupExplicitRules.getModelErrors).to.be.a("function"); }); it('should correctly generate rules', function() { @@ -48,7 +48,7 @@ describe('Treacherous Sanity Checks', function () { var validationGroup = Treacherous.create(dummyModel, ruleset); - validationGroup.getErrors() + validationGroup.getModelErrors() .then(function(errors){ console.log("errors", errors); expect(errors).to.include.keys("foo[1]"); diff --git a/tests/specs/validation-group-tests.js b/tests/specs/validation-group-tests.js index a33f93d..4e90a42 100644 --- a/tests/specs/validation-group-tests.js +++ b/tests/specs/validation-group-tests.js @@ -24,7 +24,7 @@ describe('Validation Group', function () { }; var validationGroup = createValidationGroupFor(dummyModel, ruleset); - validationGroup.getErrors() + validationGroup.getModelErrors() .then(function(errors){ expect(errors).not.to.be.null; expect(errors).to.include.keys("foo"); @@ -52,7 +52,7 @@ describe('Validation Group', function () { }; var validationGroup = createValidationGroupFor(dummyModel, ruleset); - validationGroup.getErrors() + validationGroup.getModelErrors() .then(function(errors){ expect(errors).not.to.be.null; expect(errors).to.include.keys("foo.bar"); @@ -86,7 +86,7 @@ describe('Validation Group', function () { }; var validationGroup = createValidationGroupFor(dummyModel, ruleset); - validationGroup.getErrors() + validationGroup.getModelErrors() .then(function(errors){ expect(errors).not.to.be.null; expect(errors).to.include.keys("foo[1].bar"); @@ -112,7 +112,7 @@ describe('Validation Group', function () { }; var validationGroup = createValidationGroupFor(dummyModel, ruleset); - validationGroup.getErrors() + validationGroup.getModelErrors() .then(function(errors){ expect(errors).not.to.be.null; expect(errors).to.include.keys("foo[2]"); @@ -123,6 +123,147 @@ describe('Validation Group', function () { }); }); + it('should correctly get property error', function (done) { + + var rulesetBuilder = new Treacherous.RulesetBuilder(); + var ruleset = rulesetBuilder.create() + .forProperty("foo") + .addRule("maxLength", 2) + .build(); + + var dummyModel = { + foo: "hello" + }; + + var validationGroup = createValidationGroupFor(dummyModel, ruleset); + validationGroup.getPropertyError("foo") + .then(function(error){ + expect(error).not.to.be.null; + expect(error).to.contain("2"); + expect(error).to.contain("5"); + validationGroup.release(); + done(); + }); + }); + + it('should correctly get nested property error', function (done) { + + var rulesetBuilder = new Treacherous.RulesetBuilder(); + var elementRuleset = rulesetBuilder.create() + .forProperty("bar") + .addRule("required", true) + .addRule("maxLength", 5) + .build(); + + var ruleset = rulesetBuilder.create() + .forProperty("foo") + .addRuleset(elementRuleset) + .build(); + + var dummyModel = { + foo: { bar: "not valid" } + }; + + var validationGroup = createValidationGroupFor(dummyModel, ruleset); + validationGroup.getPropertyError("foo.bar") + .then(function(error){ + expect(error).not.to.be.null; + expect(error).to.contain("9"); + expect(error).to.contain("5"); + validationGroup.release(); + done(); + }); + }); + + it('should correctly get property error in complex arrays', function (done) { + + var rulesetBuilder = new Treacherous.RulesetBuilder(); + var elementRuleset = rulesetBuilder.create() + .forProperty("bar") + .addRule("required") + .addRule("maxLength", 5) + .build(); + + var ruleset = rulesetBuilder.create() + .forProperty("foo") + .addRulesetForEach(elementRuleset) + .build(); + + var dummyModel = { + foo: [ + { bar: "hello" }, + { bar: "" }, + { bar: "too long" } + ] + }; + + var validationGroup = createValidationGroupFor(dummyModel, ruleset); + var checkOne = validationGroup.getPropertyError("foo[1].bar") + .then(function(error){ + console.log(error); + expect(error).not.to.be.null; + expect(error).to.contain("required"); + }); + + var checkTwo = validationGroup.getPropertyError("foo[2].bar") + .then(function(error){ + console.log(error); + expect(error).not.to.be.null; + expect(error).to.contain("8"); + expect(error).to.contain("5"); + }); + + Promise.all([checkOne, checkTwo]) + .then(function() { + validationGroup.release(); + done(); + }); + }); + + it('should correctly get property error in simple array', function (done) { + + var rulesetBuilder = new Treacherous.RulesetBuilder(); + var ruleset = rulesetBuilder.create() + .forProperty("foo") + .addRuleForEach("maxValue", 25) + .build(); + + var dummyModel = { + foo: [ 10, 20, 30 ] + }; + + var validationGroup = createValidationGroupFor(dummyModel, ruleset); + validationGroup.getPropertyError("foo[2]") + .then(function(error){ + expect(error).not.to.be.null; + expect(error).to.contain("25"); + expect(error).to.contain("30"); + validationGroup.release(); + done(); + }); + }); + + it('should return undefined if no error exists for property', function (done) { + + var rulesetBuilder = new Treacherous.RulesetBuilder(); + var ruleset = rulesetBuilder.create() + .forProperty("foo") + .addRule("maxLength", 2) + .build(); + + var dummyModel = { + foo: "hello" + }; + + var validationGroup = createValidationGroupFor(dummyModel, ruleset); + validationGroup.getPropertyError("nothing") + .then(function(error){ + expect(error).to.be.undefined; + validationGroup.release(); + done(); + }); + }); + it('should not apply array errors to child indexes', function (done) { var rulesetBuilder = new Treacherous.RulesetBuilder(); @@ -137,7 +278,7 @@ describe('Validation Group', function () { }; var validationGroup = createValidationGroupFor(dummyModel, ruleset); - validationGroup.getErrors() + validationGroup.getModelErrors() .then(function(errors){ console.log(errors); expect(errors).not.to.be.null; @@ -176,7 +317,7 @@ describe('Validation Group', function () { dummyModel.foo.push({ bar: "too long" }); setTimeout(function(){ - validationGroup.getErrors() + validationGroup.getModelErrors() .then(function(errors){ console.log(errors); expect(errors).not.to.be.null; @@ -204,7 +345,7 @@ describe('Validation Group', function () { }; var validationGroup = createValidationGroupFor(dummyModel, ruleset); - validationGroup.propertyChangedEvent.subscribe(function(args){ + validationGroup.propertyStateChangedEvent.subscribe(function(args){ expect(args.isValid).to.be.false; expect(args.error).contains("15"); expect(args.property).to.equal("foo"); @@ -243,7 +384,7 @@ describe('Validation Group', function () { }; var validationGroup = createValidationGroupFor(dummyModel, ruleset); - validationGroup.propertyChangedEvent.subscribe(function(args){ + validationGroup.propertyStateChangedEvent.subscribe(function(args){ expect(args.isValid).to.be.false; expect(args.error).contains("27"); expect(args.property).to.equal("foo.bar"); @@ -273,7 +414,7 @@ describe('Validation Group', function () { }; var validationGroup = createValidationGroupFor(dummyModel, ruleset); - validationGroup.propertyChangedEvent.subscribe(function(args){ + validationGroup.propertyStateChangedEvent.subscribe(function(args){ expect(args.isValid).to.be.false; expect(args.error).contains("15"); expect(args.error).contains("20"); @@ -306,7 +447,7 @@ describe('Validation Group', function () { }; var validationGroup = createValidationGroupFor(dummyModel, ruleset); - validationGroup.propertyChangedEvent.subscribe(function(args){ + validationGroup.propertyStateChangedEvent.subscribe(function(args){ console.log("triggered", args); expect(args.isValid).to.be.false; expect(args.error).contains("3"); @@ -332,7 +473,7 @@ describe('Validation Group', function () { }; var validationGroup = createValidationGroupFor(dummyModel, ruleset); - validationGroup.validationStateChangedEvent.subscribe(function(args){ + validationGroup.modelStateChangedEvent.subscribe(function(args){ expect(args.isValid).to.be.false; validationGroup.release(); done(); @@ -360,7 +501,7 @@ describe('Validation Group', function () { }; var validationGroup = createValidationGroupFor(dummyModel, ruleset); - validationGroup.getErrors().then(function(errors){ + validationGroup.getModelErrors().then(function(errors){ expect(errors).not.to.be.null; expect(errors).to.include.keys("foo"); expect(errors.foo).to.contain("32"); @@ -383,7 +524,7 @@ describe('Validation Group', function () { }; var validationGroup = createValidationGroupFor(dummyModel, ruleset); - validationGroup.getErrors().then(function(errors){ + validationGroup.getModelErrors().then(function(errors){ expect(errors).not.to.be.null; expect(errors).to.include.keys("foo"); expect(errors.foo).to.contain("32"); @@ -419,7 +560,7 @@ describe('Validation Group', function () { }; var validationGroup = createValidationGroupFor(dummyModel, ruleset); - validationGroup.getErrors() + validationGroup.getModelErrors() .then(function(errors){ expect(errors).to.be.empty; validationGroup.release(); @@ -493,14 +634,14 @@ describe('Validation Group', function () { var validationGroup = createValidationGroupFor(dummyModel, ruleset); // This starts the initial validation chain so delays it - var promise1 = validationGroup.getErrors() + var promise1 = validationGroup.getModelErrors() .then(function(errors){ expect(errors).to.be.empty; }); dummyModel.foo = 10; - var promise2 = validationGroup.getErrors() + var promise2 = validationGroup.getModelErrors() .then(function(errors){ expect(errors).to.be.empty; });