Merge pull request #1322 from StephenMcConnel/bug23532
[mono.git] / mcs / class / System.Web / Test / System.Web.Security / MembershipPasswordAttributeTest.cs
1 #if NET_4_5
2
3 using System.ComponentModel.DataAnnotations;
4 using System.Linq;
5 using System.Web.Security;
6 using NUnit.Framework;
7
8 namespace MonoTests.System.Web.Security {
9
10         [TestFixture]
11         public class MembershipPasswordAttributeTest
12         {
13                 private ValidationContext _validationContext;
14
15                 public MembershipPasswordAttributeTest ()
16                 {
17                         _validationContext = new ValidationContext (new object ())
18                                 {
19                                         DisplayName = "testDisplay",
20                                         MemberName = "testMember"
21                                 };
22                 }
23
24                 [Test]
25                 public void IsValid ()
26                 {
27                         var passwordAttribute = new MembershipPasswordAttributeTestClass ();
28                         Assert.IsTrue (passwordAttribute.IsValid (""), "sending an empty password password should should be treated as valid");
29                 }
30
31                 [Test]
32                 public void IsValid_with_ValidationContext ()
33                 {
34                         var passwordAttribute = new MembershipPasswordAttributeTestClass ();
35                         var result = passwordAttribute.TestValidation ("", _validationContext);
36                         Assert.IsNull (result, "sending an empty password password should return a null response");
37
38                         result = passwordAttribute.TestValidation ("a!12345", _validationContext);
39                         Assert.AreEqual (ValidationResult.Success, result, "Should suceed with a 7 character length and a single nonalphanumeric");
40
41                         // test error priority
42                         passwordAttribute.MinRequiredPasswordLength = 4;
43                         passwordAttribute.MinRequiredNonAlphanumericCharacters = 2;
44                         result = passwordAttribute.TestValidation ("aaa", _validationContext);
45                         Assert.AreEqual ("The 'testDisplay' field is an invalid password. Password must have 4 or more characters.", result.ErrorMessage);
46                         
47                 }
48
49                 [Test]
50                 public void MinRequiredPasswordLength ()
51                 {
52                         var passwordAttribute = new MembershipPasswordAttributeTestClass ();
53                         var result = passwordAttribute.TestValidation ("a!1234", _validationContext);
54                         Assert.AreEqual ("The 'testDisplay' field is an invalid password. Password must have 7 or more characters.", result.ErrorMessage, "Error message not correct for lower Min characters");
55                         Assert.AreEqual (_validationContext.MemberName, result.MemberNames.FirstOrDefault (), "Member name not correct");
56
57                         passwordAttribute.MinRequiredPasswordLength = 6;
58                         result = passwordAttribute.TestValidation ("a!1234", _validationContext);
59                         Assert.AreEqual (ValidationResult.Success, result, "Should suceed with a 6 character length after it's reset");
60
61                         result = passwordAttribute.TestValidation ("a!123", _validationContext);
62                         Assert.AreEqual("The 'testDisplay' field is an invalid password. Password must have 6 or more characters.", result.ErrorMessage, "Error message not correct for Min characters of 6");
63
64
65                         passwordAttribute.MinRequiredPasswordLength = 1;
66                         result = passwordAttribute.TestValidation ("!", _validationContext);
67                         Assert.AreEqual(ValidationResult.Success, result, "Should suceed with a 6 character length after it's reset");
68
69                         // Note there is no test for empty password here as it returns null and is therefore in the generic test
70
71                         // Error Message changes
72                         passwordAttribute.MinRequiredPasswordLength = 5;
73                         passwordAttribute.MinPasswordLengthError = "There was an error";
74                         result = passwordAttribute.TestValidation ("a!13", _validationContext);
75                         Assert.AreEqual("There was an error", result.ErrorMessage, "Error Message wasn't correct without parameters.");
76
77                         passwordAttribute.MinPasswordLengthError = "There was an error parameter1: {0}";
78                         result = passwordAttribute.TestValidation ("a!13", _validationContext);
79                         Assert.AreEqual("There was an error parameter1: testDisplay", result.ErrorMessage, "Error Message wasn't correct with 1 parameter.");
80
81                         passwordAttribute.MinPasswordLengthError = "There was an error parameter1: {0} parameter2: {1}";
82                         result = passwordAttribute.TestValidation ("a!13", _validationContext);
83                         Assert.AreEqual ("There was an error parameter1: testDisplay parameter2: 5", result.ErrorMessage, "Error Message wasn't correct with 2 parameters.");
84
85                 }
86
87                 [Test]
88                 public void MinRequiredNonAlphanumericCharacters ()
89                 {
90                         var passwordAttribute = new MembershipPasswordAttributeTestClass ();
91                         var result = passwordAttribute.TestValidation ("a!12345", _validationContext);
92                         Assert.AreEqual (ValidationResult.Success, result, "Should succeed with the default 1 non alpha numeric");
93
94                         result = passwordAttribute.TestValidation ("a123456", _validationContext);
95                         Assert.AreEqual ("The 'testDisplay' field is an invalid password. Password must have 1 or more non-alphanumeric characters.", result.ErrorMessage, "Expected validation to fail without non-alphanumerics");
96
97
98                         passwordAttribute.MinRequiredNonAlphanumericCharacters = 3;
99                         result = passwordAttribute.TestValidation ("a!&12345", _validationContext);
100                         Assert.AreEqual ("The 'testDisplay' field is an invalid password. Password must have 3 or more non-alphanumeric characters.", result.ErrorMessage, "Expected validation to fail without 3 non-alphanumerics");
101
102                         result = passwordAttribute.TestValidation ("a!?&132154", _validationContext);
103                         Assert.AreEqual (ValidationResult.Success, result, "Should succeed with 3 non alpha numerics");
104
105                         passwordAttribute.MinRequiredNonAlphanumericCharacters = 0;
106                         result = passwordAttribute.TestValidation ("a123456", _validationContext);
107                         Assert.AreEqual (ValidationResult.Success, result, "Should succeed with 0 non alpha numerics");
108
109                         // Error Message changes
110                         passwordAttribute.MinRequiredNonAlphanumericCharacters = 1;
111                         passwordAttribute.MinNonAlphanumericCharactersError = "There was an error";
112                         result = passwordAttribute.TestValidation ("a123456", _validationContext);
113                         Assert.AreEqual ("There was an error", result.ErrorMessage, "Error Message wasn't correct without parameters.");
114
115                         passwordAttribute.MinNonAlphanumericCharactersError = "There was an error parameter1: {0}";
116                         result = passwordAttribute.TestValidation ("a123456", _validationContext);
117                         Assert.AreEqual("There was an error parameter1: testDisplay", result.ErrorMessage, "Error Message wasn't correct with 1 parameter.");
118
119                         passwordAttribute.MinNonAlphanumericCharactersError = "There was an error parameter1: {0} parameter2: {1}";
120                         result = passwordAttribute.TestValidation ("a123456", _validationContext);
121                         Assert.AreEqual ("There was an error parameter1: testDisplay parameter2: 1", result.ErrorMessage, "Error Message wasn't correct with 2 parameters.");
122                 }
123
124                 [Test]
125                 public void FormatErrorMessage ()
126                 {
127                         var passwordAttribute = new MembershipPasswordAttribute ();
128                         Assert.AreEqual ("The field testDisplay2 is invalid.", passwordAttribute.FormatErrorMessage ("testDisplay2"));
129                 }
130
131                 internal class MembershipPasswordAttributeTestClass : MembershipPasswordAttribute
132                 {
133                         public ValidationResult TestValidation (object val, ValidationContext context)
134                         {
135                                 return IsValid (val, context);
136                         }
137                 }
138         }
139 }
140 #endif