-
Notifications
You must be signed in to change notification settings - Fork 41
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
[FEAT] Improve error message of isEnum validator #830
Changes from 8 commits
941b4da
ec2142b
eec2950
82b4c06
59b4482
722ad71
5909a1d
f961358
ea8e090
d084e4b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,21 @@ | ||||||
# Nestjs-class-validators | ||||||
|
||||||
A set of class validators. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In the description, I think it is important to say that it is based on the existing class-validators (with a link) since most of the validators are just re-exported. |
||||||
|
||||||
## Installation | ||||||
|
||||||
```bash | ||||||
npm install --save @algoan/nestjs-class-validators | ||||||
``` | ||||||
|
||||||
## IsEnum | ||||||
|
||||||
A class validators that validates the enum type. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
||||||
### Usage: | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
||||||
```ts | ||||||
@IsEnum(UserType) | ||||||
public userType: UserType; | ||||||
``` | ||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
{ | ||
"name": "@algoan/nestjs-class-validators", | ||
"version": "1.0.0", | ||
"description": "", | ||
"main": "index.js", | ||
"scripts": { | ||
"test": "echo \"Error: no test specified\" && exit 1" | ||
}, | ||
"author": "", | ||
"license": "ISC", | ||
"dependencies": { | ||
"class-validator": "^0.14.0" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
export { IsEnum } from './is-enum.decorator'; | ||
export * from 'class-validator'; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
import { IsEnum as OriginalIsEnum, ValidationOptions } from 'class-validator'; | ||
|
||
export const IsEnum = (entity: object, validationOptions?: ValidationOptions): PropertyDecorator => | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since this function is part of the public API, you should probably add JSDoc. |
||
OriginalIsEnum(entity, { | ||
message: '$property has the value $value but must be one of the following values: $constraint2', | ||
...validationOptions, | ||
}); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
import { IsEnum } from '../src/is-enum.decorator'; | ||
import { Validator, ValidatorOptions } from 'class-validator'; | ||
|
||
function validateValues( | ||
object: { testProperty: any }, | ||
values: any[], | ||
validatorOptions?: ValidatorOptions, | ||
): Promise<any> { | ||
const validator = new Validator(); | ||
const promises = values.map((value) => { | ||
object.testProperty = value; | ||
return validator.validate(object, validatorOptions).then((errors) => { | ||
expect(errors.length).toEqual(0); | ||
if (errors.length > 0) { | ||
console.log(`Unexpected errors: ${JSON.stringify(errors)}`); | ||
throw new Error('Unexpected validation errors'); | ||
} | ||
}); | ||
}); | ||
|
||
return Promise.all(promises); | ||
} | ||
|
||
function checkReturnedError( | ||
object: { testProperty: any }, | ||
values: any[], | ||
validationType: string, | ||
messages: string[], | ||
validatorOptions?: ValidatorOptions, | ||
): Promise<any> { | ||
let messagesIncrementor: number = 0; | ||
const validator = new Validator(); | ||
const promises = values.map((value) => { | ||
object.testProperty = value; | ||
return validator.validate(object, validatorOptions).then((errors) => { | ||
expect(errors.length).toEqual(1); | ||
expect(errors[0].target).toEqual(object); | ||
expect(errors[0].property).toEqual('testProperty'); | ||
expect(errors[0].constraints).toEqual({ [validationType]: messages[messagesIncrementor] }); | ||
expect(errors[0].value).toEqual(value); | ||
messagesIncrementor++; | ||
}); | ||
}); | ||
|
||
return Promise.all(promises); | ||
} | ||
|
||
describe('Tests related to the custom IsEnum Decorator', () => { | ||
enum CustomEnum { | ||
FIRST_ITEM = 'first-item', | ||
SECOND_ITEM = 'second-item', | ||
} | ||
|
||
class TestClass { | ||
@IsEnum(CustomEnum) | ||
testProperty: CustomEnum = CustomEnum.FIRST_ITEM; | ||
} | ||
|
||
it('should validate the correct values', () => { | ||
return validateValues(new TestClass(), [ | ||
CustomEnum.FIRST_ITEM, | ||
CustomEnum.SECOND_ITEM, | ||
'first-item', | ||
'second-item', | ||
]); | ||
}); | ||
|
||
it('should not validate invalid values and return the correct errors', () => { | ||
const validationType = 'isEnum'; | ||
const firstMessage = | ||
'testProperty has the value false-value-1 but must be one of the following values: first-item, second-item'; | ||
const secondMessage = | ||
'testProperty has the value false-value-2 but must be one of the following values: first-item, second-item'; | ||
return checkReturnedError(new TestClass(), ['false-value-1', 'false-value-2'], validationType, [ | ||
firstMessage, | ||
secondMessage, | ||
]); | ||
}); | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.