Skip to content
This repository was archived by the owner on Mar 16, 2020. It is now read-only.

Commit ab09f10

Browse files
authored
Merge pull request #26 from xt0rted/enum-validator
Add adapter for EnumDataTypeAttribute
2 parents 28e35aa + 487a1fe commit ab09f10

5 files changed

Lines changed: 132 additions & 0 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ This project adds support to `Nancy.Validation.DataAnnotations` for the followin
99
- [CompareAttribute](http://msdn.microsoft.com/en-us/library/System.ComponentModel.DataAnnotations.CompareAttribute.aspx)
1010
- [CreditCardAttribute](http://msdn.microsoft.com/en-us/library/System.ComponentModel.DataAnnotations.CreditCardAttribute.aspx)
1111
- [EmailAddressAttribute](http://msdn.microsoft.com/en-us/library/System.ComponentModel.DataAnnotations.EmailAddressAttribute.aspx)
12+
- [EnumDataTypeAttribute](http://msdn.microsoft.com/en-us/library/System.ComponentModel.DataAnnotations.EnumDataTypeAttribute.aspx)
1213
- [FileExtensionsAttribute](http://msdn.microsoft.com/en-us/library/System.ComponentModel.DataAnnotations.FileExtensionsAttribute.aspx)
1314
- [MaxLengthAttribute](http://msdn.microsoft.com/en-us/library/System.ComponentModel.DataAnnotations.MaxLengthAttribute.aspx)
1415
- [MinLengthAttribute](http://msdn.microsoft.com/en-us/library/System.ComponentModel.DataAnnotations.MinLengthAttribute.aspx)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
namespace Nancy.Validation.DataAnnotations.Extensions
2+
{
3+
using System.ComponentModel.DataAnnotations;
4+
5+
/// <summary>
6+
/// An adapter for the <see cref="EnumDataTypeAttribute"/>.
7+
/// </summary>
8+
public class EnumDataTypeValidatorAdapter : BaseValidatorAdapter<EnumDataTypeAttribute>
9+
{
10+
/// <summary>
11+
/// Initializes a new instance of the <see cref="EnumDataTypeValidatorAdapter"/> class.
12+
/// </summary>
13+
public EnumDataTypeValidatorAdapter()
14+
: base("EnumDataType")
15+
{
16+
}
17+
}
18+
}

src/Nancy.Validation.DataAnnotations.Extensions/Nancy.Validation.DataAnnotations.Extensions.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
<Compile Include="CompareValidatorAdapter.cs" />
5252
<Compile Include="CreditCardValidatorAdapter.cs" />
5353
<Compile Include="EmailAddressValidatorAdapter.cs" />
54+
<Compile Include="EnumDataTypeValidatorAdapter.cs" />
5455
<Compile Include="FileExtensionsValidatorAdapter.cs" />
5556
<Compile Include="MaxLengthValidatorAdapter.cs" />
5657
<Compile Include="MinLengthValidatorAdapter.cs" />

test/Nancy.Validation.DataAnnotations.Extensions.Tests/Nancy.Validation.DataAnnotations.Extensions.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
<Compile Include="Tests\CompareValidatorAdapterFixture.cs" />
7070
<Compile Include="Tests\CreditCardValidatorAdapterFixture.cs" />
7171
<Compile Include="Tests\EmailAddressValidatorAdapterFixture.cs" />
72+
<Compile Include="Tests\EnumDataTypeValidatorAdapterFixture.cs" />
7273
<Compile Include="Tests\FileExtensionsValidatorAdapterFixture.cs" />
7374
<Compile Include="Tests\MaxLengthValidatorAdapterFixture.cs" />
7475
<Compile Include="Tests\MinLengthValidatorAdapterFixture.cs" />
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
namespace Nancy.Validation.DataAnnotations.Extensions.Tests
2+
{
3+
using System.ComponentModel;
4+
using System.ComponentModel.DataAnnotations;
5+
using System.Linq;
6+
7+
using Shouldly;
8+
9+
using Xunit;
10+
11+
public class EnumDataTypeValidatorAdapterFixture : BaseTestFixture<EnumDataTypeValidatorAdapter>
12+
{
13+
[Fact]
14+
public void Should_return_true_with_valid_value()
15+
{
16+
// Given
17+
var validator = _factory.Create(typeof(TestModel));
18+
var model = new TestModel
19+
{
20+
Status1 = Status.None,
21+
Status2 = Status.Pending,
22+
Status3 = Status.Approved
23+
};
24+
25+
// When
26+
var result = validator.Validate(model, new NancyContext());
27+
28+
// Then
29+
result.IsValid.ShouldBe(true);
30+
}
31+
32+
[Fact]
33+
public void Should_read_enum_annotations()
34+
{
35+
// Given, When
36+
var validator = _factory.Create(typeof(TestModel));
37+
38+
// Then
39+
validator.Description.Rules.SelectMany(r => r.Value).ShouldContain(r => r.RuleType == "EnumDataType" && r.MemberNames.Contains("Status1"));
40+
validator.Description.Rules.SelectMany(r => r.Value).ShouldContain(r => r.RuleType == "EnumDataType" && r.MemberNames.Contains("Status2"));
41+
validator.Description.Rules.SelectMany(r => r.Value).ShouldContain(r => r.RuleType == "EnumDataType" && r.MemberNames.Contains("Status3"));
42+
}
43+
44+
[Fact]
45+
public void Should_return_false_and_contain_property_name()
46+
{
47+
// Given
48+
var validator = _factory.Create(typeof(TestModel));
49+
var model = new TestModel { Status1 = (Status)13 };
50+
51+
// When
52+
var result = validator.Validate(model, new NancyContext());
53+
54+
// Then
55+
result.IsValid.ShouldBe(false);
56+
result.Errors["Status1"][0].ErrorMessage.ShouldBe("The field Status1 is invalid.");
57+
}
58+
59+
[Fact]
60+
public void Should_return_false_and_contain_display_name()
61+
{
62+
// Given
63+
var validator = _factory.Create(typeof(TestModel));
64+
var model = new TestModel { Status2 = (Status)13 };
65+
66+
// When
67+
var result = validator.Validate(model, new NancyContext());
68+
69+
// Then
70+
result.IsValid.ShouldBe(false);
71+
result.Errors["Status2"][0].ErrorMessage.ShouldBe("The field Status 2 is invalid.");
72+
}
73+
74+
[Fact]
75+
public void Should_return_false_and_contain_displayname()
76+
{
77+
// Given
78+
var validator = _factory.Create(typeof(TestModel));
79+
var model = new TestModel { Status3 = (Status)13 };
80+
81+
// When
82+
var result = validator.Validate(model, new NancyContext());
83+
84+
// Then
85+
result.IsValid.ShouldBe(false);
86+
result.Errors["Status3"][0].ErrorMessage.ShouldBe("The field Status 3 is invalid.");
87+
}
88+
89+
private class TestModel
90+
{
91+
[EnumDataType(typeof(Status))]
92+
public Status Status1 { get; set; }
93+
94+
[Display(Name = "Status 2")]
95+
[EnumDataType(typeof(Status))]
96+
public Status Status2 { get; set; }
97+
98+
[DisplayName("Status 3")]
99+
[EnumDataType(typeof(Status))]
100+
public Status Status3 { get; set; }
101+
}
102+
103+
private enum Status
104+
{
105+
None = 0,
106+
Pending = 1,
107+
Approved = 2,
108+
Denied = 3
109+
}
110+
}
111+
}

0 commit comments

Comments
 (0)