PageRenderTime 194ms CodeModel.GetById 24ms RepoModel.GetById 8ms app.codeStats 0ms

/test/System.Web.WebPages.Test/Validation/ValidatorTest.cs

https://bitbucket.org/mdavid/aspnetwebstack
C# | 882 lines | 563 code | 162 blank | 157 comment | 2 complexity | dcb0e2fd6fdb08442707a7b5a0bed3f7 MD5 | raw file
  1. using System.Collections.Specialized;
  2. using System.ComponentModel.DataAnnotations;
  3. using System.Linq;
  4. using Moq;
  5. using Xunit;
  6. using Assert = Microsoft.TestCommon.AssertEx;
  7. namespace System.Web.WebPages.Validation.Test
  8. {
  9. public class ValidatorTest
  10. {
  11. [Fact]
  12. public void RequiredValidatorValidatesIfStringIsNull()
  13. {
  14. // Arrange
  15. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  16. var requiredValidator = Validator.Required();
  17. var validationContext = GetValidationContext(GetContext(), "foo");
  18. // Act
  19. var result = requiredValidator.Validate(validationContext);
  20. // Assert
  21. Assert.NotEqual(ValidationResult.Success, result);
  22. Assert.Equal("This field is required.", result.ErrorMessage);
  23. Assert.Equal("foo", result.MemberNames.Single());
  24. }
  25. [Fact]
  26. public void RequiredValidatorValidatesIfStringIsEmpty()
  27. {
  28. // Arrange
  29. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  30. var requiredValidator = Validator.Required();
  31. var validationContext = GetValidationContext(GetContext(new { foo = "" }), "foo");
  32. // Act
  33. var result = requiredValidator.Validate(validationContext);
  34. // Assert
  35. Assert.NotEqual(ValidationResult.Success, result);
  36. Assert.Equal("This field is required.", result.ErrorMessage);
  37. Assert.Equal("foo", result.MemberNames.Single());
  38. }
  39. [Fact]
  40. public void RequiredValidatorReturnsCustomErrorMessagesIfSpecified()
  41. {
  42. // Arrange
  43. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  44. var requiredValidator = Validator.Required("There is no string");
  45. var httpContext = GetContext(new { foo = "" });
  46. var validationContext = GetValidationContext(httpContext, "foo");
  47. // Act
  48. var result = requiredValidator.Validate(validationContext);
  49. // Assert
  50. Assert.NotEqual(ValidationResult.Success, result);
  51. Assert.Equal("There is no string", result.ErrorMessage);
  52. Assert.Equal("foo", result.MemberNames.Single());
  53. }
  54. [Fact]
  55. public void RequiredValidatorReturnsSuccessIfNoFieldIsNotNullOrEmpty()
  56. {
  57. // Arrange
  58. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  59. var requiredValidator = Validator.Required("foo");
  60. var validationContext = GetValidationContext(GetContext(new { foo = "some value" }), "foo");
  61. // Act
  62. var result = requiredValidator.Validate(validationContext);
  63. // Assert
  64. Assert.Equal(ValidationResult.Success, result);
  65. }
  66. [Fact]
  67. public void GetClientValidationRulesForRequiredValidatorWithDefaultErrorMessage()
  68. {
  69. // Arrange
  70. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  71. var requiredValidator = Validator.Required();
  72. // Act
  73. var result = requiredValidator.ClientValidationRule;
  74. // Assert
  75. Assert.Equal("required", result.ValidationType);
  76. Assert.Equal("This field is required.", result.ErrorMessage);
  77. Assert.False(result.ValidationParameters.Any());
  78. }
  79. [Fact]
  80. public void GetClientValidationRulesForRequiredValidatorWithCustomErrorMessage()
  81. {
  82. // Arrange
  83. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  84. var requiredValidator = Validator.Required("custom message");
  85. // Act
  86. var result = requiredValidator.ClientValidationRule;
  87. // Assert
  88. Assert.Equal("required", result.ValidationType);
  89. Assert.Equal("custom message", result.ErrorMessage);
  90. Assert.False(result.ValidationParameters.Any());
  91. }
  92. [Fact]
  93. public void RangeValidatorReturnsSuccessIfValueIsInRange()
  94. {
  95. // Arrange
  96. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  97. var rangeValidator = Validator.Range(10, 12);
  98. var validationContext = GetValidationContext(GetContext(new { foo = 11 }), "foo");
  99. // Act
  100. var result = rangeValidator.Validate(validationContext);
  101. // Assert
  102. Assert.Equal(ValidationResult.Success, result);
  103. }
  104. [Fact]
  105. public void RangeValidatorReturnsDefaultErrorMessageIfValueIsNotInRange()
  106. {
  107. // Arrange
  108. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  109. var rangeValidator = Validator.Range(10, 12);
  110. var validationContext = GetValidationContext(GetContext(new { foo = 7 }), "foo");
  111. // Act
  112. var result = rangeValidator.Validate(validationContext);
  113. // Assert
  114. Assert.NotEqual(ValidationResult.Success, result);
  115. Assert.Equal("Value must be an integer between 10 and 12.", result.ErrorMessage);
  116. Assert.Equal("foo", result.MemberNames.Single());
  117. }
  118. [Fact]
  119. public void RangeValidatorReturnsDefaultErrorMessageIfValueIsNotInRangeForFloatingPointValues()
  120. {
  121. // Arrange
  122. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  123. var rangeValidator = Validator.Range(10.8, 12.2);
  124. var validationContext = GetValidationContext(GetContext(new { foo = 7 }), "foo");
  125. // Act
  126. var result = rangeValidator.Validate(validationContext);
  127. // Assert
  128. Assert.NotEqual(ValidationResult.Success, result);
  129. Assert.Equal("Value must be a decimal between 10.8 and 12.2.", result.ErrorMessage);
  130. Assert.Equal("foo", result.MemberNames.Single());
  131. }
  132. [Fact]
  133. public void RangeValidatorReturnsCustomErrorMessageIfSpecified()
  134. {
  135. // Arrange
  136. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  137. var rangeValidator = Validator.Range(10, 12, "Custom error message");
  138. var validationContext = GetValidationContext(GetContext(new { foo = 13 }), "foo");
  139. // Act
  140. var result = rangeValidator.Validate(validationContext);
  141. // Assert
  142. Assert.NotEqual(ValidationResult.Success, result);
  143. Assert.Equal("Custom error message", result.ErrorMessage);
  144. Assert.Equal("foo", result.MemberNames.Single());
  145. }
  146. [Fact]
  147. public void RangeValidatorFormatsCustomErrorMessage()
  148. {
  149. // Arrange
  150. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  151. var rangeValidator = Validator.Range(10, 12, "Valid range: {0}-{1}");
  152. var validationContext = GetValidationContext(GetContext(new { foo = 13 }), "foo");
  153. // Act
  154. var result = rangeValidator.Validate(validationContext);
  155. // Assert
  156. Assert.NotEqual(ValidationResult.Success, result);
  157. Assert.Equal("Valid range: 10-12", result.ErrorMessage);
  158. Assert.Equal("foo", result.MemberNames.Single());
  159. }
  160. [Fact]
  161. public void GetClientValidationRulesForRangeValidatorWithDefaultErrorMessage()
  162. {
  163. // Arrange
  164. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  165. var rangeValidator = Validator.Range(10, 12);
  166. // Act
  167. var result = rangeValidator.ClientValidationRule;
  168. // Assert
  169. Assert.Equal("range", result.ValidationType);
  170. Assert.Equal("Value must be an integer between 10 and 12.", result.ErrorMessage);
  171. Assert.Equal(10, result.ValidationParameters["min"]);
  172. Assert.Equal(12, result.ValidationParameters["max"]);
  173. }
  174. [Fact]
  175. public void GetClientValidationRulesForRangeValidatorWithCustomErrorMessage()
  176. {
  177. // Arrange
  178. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  179. var rangeValidator = Validator.Range(10, 11, "Range: {0}-{1}");
  180. // Act
  181. var result = rangeValidator.ClientValidationRule;
  182. // Assert
  183. Assert.Equal("range", result.ValidationType);
  184. Assert.Equal("Range: 10-11", result.ErrorMessage);
  185. Assert.Equal(10, result.ValidationParameters["min"]);
  186. Assert.Equal(11, result.ValidationParameters["max"]);
  187. }
  188. [Fact]
  189. public void StringLengthValidatorReturnsSuccessIfStringLengthIsSmallerThanMaxValue()
  190. {
  191. // Arrange
  192. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  193. var validator = Validator.StringLength(10);
  194. var validationContext = GetValidationContext(GetContext(new { baz = "hello" }), "baz");
  195. // Act
  196. var result = validator.Validate(validationContext);
  197. // Assert
  198. Assert.Equal(ValidationResult.Success, result);
  199. }
  200. [Fact]
  201. public void StringLengthValidatorReturnsSuccessIfStringLengthIsRangeOfMinAndMaxValue()
  202. {
  203. // Arrange
  204. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  205. var validator = Validator.StringLength(10, minLength: 6);
  206. var validationContext = GetValidationContext(GetContext(new { bar = "woof woof" }), "bar");
  207. // Act
  208. var result = validator.Validate(validationContext);
  209. // Assert
  210. Assert.Equal(ValidationResult.Success, result);
  211. }
  212. [Fact]
  213. public void StringLengthValidatorReturnsFailureIfStringLengthIsLongerThanMaxValue()
  214. {
  215. // Arrange
  216. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  217. var validator = Validator.StringLength(4);
  218. var validationContext = GetValidationContext(GetContext(new { baz = "woof woof" }), "baz");
  219. // Act
  220. var result = validator.Validate(validationContext);
  221. // Assert
  222. Assert.NotEqual(ValidationResult.Success, result);
  223. Assert.Equal("Max length: 4.", result.ErrorMessage);
  224. Assert.Equal("baz", result.MemberNames.Single());
  225. }
  226. [Fact]
  227. public void StringLengthValidatorReturnsCustomErrorMessageIfStringLengthIsLongerThanMaxValue()
  228. {
  229. // Arrange
  230. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  231. var validator = Validator.StringLength(4, errorMessage: "String must be at least {0} characters long.");
  232. var validationContext = GetValidationContext(GetContext(new { baz = "woof woof" }), "baz");
  233. // Act
  234. var result = validator.Validate(validationContext);
  235. // Assert
  236. Assert.NotEqual(ValidationResult.Success, result);
  237. Assert.Equal("String must be at least 4 characters long.", result.ErrorMessage);
  238. Assert.Equal("baz", result.MemberNames.Single());
  239. }
  240. [Fact]
  241. public void StringLengthValidatorReturnsFailureIfStringLengthIsNotInRange()
  242. {
  243. // Arrange
  244. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  245. var validator = Validator.StringLength(6, 4);
  246. var validationContext = GetValidationContext(GetContext(new { baz = "woof woof" }), "baz");
  247. // Act
  248. var result = validator.Validate(validationContext);
  249. // Assert
  250. Assert.NotEqual(ValidationResult.Success, result);
  251. Assert.Equal("String must be between 4 and 6 characters.", result.ErrorMessage);
  252. Assert.Equal("baz", result.MemberNames.Single());
  253. }
  254. [Fact]
  255. public void StringLengthValidatorReturnsCustomErrorMessageIfStringLengthIsNotInRange()
  256. {
  257. // Arrange
  258. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  259. var validator = Validator.StringLength(6, 4, "Range {0} - {1}");
  260. var validationContext = GetValidationContext(GetContext(new { baz = "woof woof" }), "baz");
  261. // Act
  262. var result = validator.Validate(validationContext);
  263. // Assert
  264. Assert.NotEqual(ValidationResult.Success, result);
  265. Assert.Equal("Range 4 - 6", result.ErrorMessage);
  266. Assert.Equal("baz", result.MemberNames.Single());
  267. }
  268. [Fact]
  269. public void GetClientValidationRulesForStringLengthValidatorWithDefaultErrorMessage()
  270. {
  271. // Arrange
  272. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  273. var validator = Validator.StringLength(6, 4);
  274. // Act
  275. var result = validator.ClientValidationRule;
  276. // Assert
  277. Assert.Equal(result.ValidationType, "length");
  278. Assert.Equal(result.ErrorMessage, "String must be between 4 and 6 characters.");
  279. Assert.Equal(result.ValidationParameters["min"], 4);
  280. Assert.Equal(result.ValidationParameters["max"], 6);
  281. }
  282. [Fact]
  283. public void GetClientValidationRulesForStringLengthValidatorWithCustomErrorMessage()
  284. {
  285. // Arrange
  286. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  287. var validator = Validator.StringLength(6, errorMessage: "Must be at least 6 letters.");
  288. // Act
  289. var result = validator.ClientValidationRule;
  290. // Assert
  291. Assert.Equal(result.ValidationType, "length");
  292. Assert.Equal(result.ErrorMessage, "Must be at least 6 letters.");
  293. Assert.Equal(result.ValidationParameters["max"], 6);
  294. }
  295. [Fact]
  296. public void RegexThrowsIfPatternIsNullOrEmpty()
  297. {
  298. // Act and Assert
  299. Assert.ThrowsArgumentNullOrEmptyString(() => Validator.Regex(null), "pattern");
  300. Assert.ThrowsArgumentNullOrEmptyString(() => Validator.Regex(String.Empty), "pattern");
  301. }
  302. [Fact]
  303. public void RegexReturnsSuccessIfValueMatches()
  304. {
  305. // Arrange
  306. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  307. var validator = Validator.Regex("^a+b+c$");
  308. var context = GetValidationContext(GetContext(new { foo = "aaabbc" }), "foo");
  309. // Act
  310. var result = validator.Validate(context);
  311. // Assert
  312. Assert.Equal(ValidationResult.Success, result);
  313. }
  314. [Fact]
  315. public void RegexReturnsDefaultErrorMessageIfValidationFails()
  316. {
  317. // Arrange
  318. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  319. var validator = Validator.Regex("^a+b+c$");
  320. var context = GetValidationContext(GetContext(new { foo = "aaXabbc" }), "foo");
  321. // Act
  322. var result = validator.Validate(context);
  323. // Assert
  324. Assert.NotEqual(ValidationResult.Success, result);
  325. Assert.Equal("Value is invalid.", result.ErrorMessage);
  326. Assert.Equal("foo", result.MemberNames.Single());
  327. }
  328. [Fact]
  329. public void RegexReturnsCustomErrorMessageIfValidationFails()
  330. {
  331. // Arrange
  332. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  333. var validator = Validator.Regex("^a+b+c$");
  334. var context = GetValidationContext(GetContext(new { foo = "aaXabbc" }), "foo");
  335. // Act
  336. var result = validator.Validate(context);
  337. // Assert
  338. Assert.NotEqual(ValidationResult.Success, result);
  339. Assert.Equal("Value is invalid.", result.ErrorMessage);
  340. Assert.Equal("foo", result.MemberNames.Single());
  341. }
  342. [Fact]
  343. public void IntegerReturnsSuccessIfValueIsNull()
  344. {
  345. // Arrange
  346. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  347. var validator = Validator.Integer();
  348. var context = GetValidationContext(GetContext(new { Name = "Not-Age" }), "age");
  349. // Act
  350. var result = validator.Validate(context);
  351. // Assert
  352. Assert.Equal(ValidationResult.Success, result);
  353. }
  354. [Fact]
  355. public void IntegerReturnsSuccessIfValueIsEmpty()
  356. {
  357. // Arrange
  358. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  359. var validator = Validator.Integer();
  360. var context = GetValidationContext(GetContext(new { Age = "" }), "age");
  361. // Act
  362. var result = validator.Validate(context);
  363. // Assert
  364. Assert.Equal(ValidationResult.Success, result);
  365. }
  366. [Fact]
  367. public void IntegerReturnsSuccessIfValueIsValidInteger()
  368. {
  369. // Arrange
  370. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  371. var validator = Validator.Integer();
  372. var context = GetValidationContext(GetContext(new { Age = "10" }), "age");
  373. // Act
  374. var result = validator.Validate(context);
  375. // Assert
  376. Assert.Equal(ValidationResult.Success, result);
  377. }
  378. [Fact]
  379. public void IntegerReturnsSuccessIfValueIsNegativeInteger()
  380. {
  381. // Arrange
  382. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  383. var validator = Validator.Integer();
  384. var context = GetValidationContext(GetContext(new { Age = "-42" }), "age");
  385. // Act
  386. var result = validator.Validate(context);
  387. // Assert
  388. Assert.Equal(ValidationResult.Success, result);
  389. }
  390. [Fact]
  391. public void IntegerReturnsSuccessIfValueIsZero()
  392. {
  393. // Arrange
  394. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  395. var validator = Validator.Integer();
  396. var context = GetValidationContext(GetContext(new { Age = 0 }), "age");
  397. // Act
  398. var result = validator.Validate(context);
  399. // Assert
  400. Assert.Equal(ValidationResult.Success, result);
  401. }
  402. [Fact]
  403. public void IntegerReturnsErrorMessageIfValueIsFloatingPointValue()
  404. {
  405. // Arrange
  406. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  407. var validator = Validator.Integer();
  408. var context = GetValidationContext(GetContext(new { Age = 1.3 }), "age");
  409. // Act
  410. var result = validator.Validate(context);
  411. // Assert
  412. Assert.NotEqual(ValidationResult.Success, result);
  413. Assert.Equal("Input format is invalid.", result.ErrorMessage);
  414. Assert.Equal("age", result.MemberNames.Single());
  415. }
  416. [Fact]
  417. public void IntegerReturnsErrorMessageIfValueIsNotAnInteger()
  418. {
  419. // Arrange
  420. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  421. var validator = Validator.Integer();
  422. var context = GetValidationContext(GetContext(new { Age = "2008-04-01" }), "age");
  423. // Act
  424. var result = validator.Validate(context);
  425. // Assert
  426. Assert.NotEqual(ValidationResult.Success, result);
  427. Assert.Equal("Input format is invalid.", result.ErrorMessage);
  428. Assert.Equal("age", result.MemberNames.Single());
  429. }
  430. [Fact]
  431. public void FloatReturnsSuccessIfValueIsNull()
  432. {
  433. // Arrange
  434. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  435. var validator = Validator.Float();
  436. var context = GetValidationContext(GetContext(new { }), "Price");
  437. // Act
  438. var result = validator.Validate(context);
  439. // Assert
  440. Assert.Equal(ValidationResult.Success, result);
  441. }
  442. [Fact]
  443. public void FloatReturnsSuccessIfValueIsEmptyString()
  444. {
  445. // Arrange
  446. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  447. var validator = Validator.Float();
  448. var context = GetValidationContext(GetContext(new { Price = "" }), "Price");
  449. // Act
  450. var result = validator.Validate(context);
  451. // Assert
  452. Assert.Equal(ValidationResult.Success, result);
  453. }
  454. [Fact]
  455. public void FloatReturnsSuccessIfValueIsValidFloatString()
  456. {
  457. // Arrange
  458. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  459. var validator = Validator.Float();
  460. var context = GetValidationContext(GetContext(new { Price = Single.MaxValue.ToString() }), "Price");
  461. // Act
  462. var result = validator.Validate(context);
  463. // Assert
  464. Assert.Equal(ValidationResult.Success, result);
  465. }
  466. [Fact]
  467. public void FloatReturnsSuccessIfValueIsValidInteger()
  468. {
  469. // Arrange
  470. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  471. var validator = Validator.Float();
  472. var context = GetValidationContext(GetContext(new { Price = "1" }), "Price");
  473. // Act
  474. var result = validator.Validate(context);
  475. // Assert
  476. Assert.Equal(ValidationResult.Success, result);
  477. }
  478. [Fact]
  479. public void FloatReturnsErrorIfValueIsNotAValidFloat()
  480. {
  481. // Arrange
  482. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  483. var validator = Validator.Float();
  484. var context = GetValidationContext(GetContext(new { Price = "Free!!!" }), "Price");
  485. // Act
  486. var result = validator.Validate(context);
  487. // Assert
  488. Assert.NotEqual(ValidationResult.Success, result);
  489. Assert.Equal("Input format is invalid.", result.ErrorMessage);
  490. Assert.Equal("Price", result.MemberNames.Single());
  491. }
  492. [Fact]
  493. public void DateTimeReturnsSuccessIfValueIsNull()
  494. {
  495. // Arrange
  496. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  497. var validator = Validator.DateTime();
  498. var context = GetValidationContext(GetContext(new { }), "dateOfBirth");
  499. // Act
  500. var result = validator.Validate(context);
  501. // Assert
  502. Assert.Equal(ValidationResult.Success, result);
  503. }
  504. [Fact]
  505. public void DateTimeReturnsSuccessIfValueIsEmpty()
  506. {
  507. // Arrange
  508. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  509. var validator = Validator.DateTime();
  510. var context = GetValidationContext(GetContext(new { dateOfBirth = "" }), "dateOfBirth");
  511. // Act
  512. var result = validator.Validate(context);
  513. // Assert
  514. Assert.Equal(ValidationResult.Success, result);
  515. }
  516. [Fact]
  517. public void DateTimeReturnsSuccessIfValueIsValidDateTime()
  518. {
  519. // Arrange
  520. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  521. var validator = Validator.DateTime();
  522. var context = GetValidationContext(GetContext(new { dateOfBirth = DateTime.Now.ToString() }), "dateOfBirth");
  523. // Act
  524. var result = validator.Validate(context);
  525. // Assert
  526. Assert.Equal(ValidationResult.Success, result);
  527. }
  528. [Fact]
  529. public void DateTimeReturnsErrorIfValueIsInvalidDateTime()
  530. {
  531. // Arrange
  532. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  533. var validator = Validator.DateTime();
  534. var context = GetValidationContext(GetContext(new { dateOfBirth = "23.28" }), "dateOfBirth");
  535. // Act
  536. var result = validator.Validate(context);
  537. // Assert
  538. Assert.NotEqual(ValidationResult.Success, result);
  539. Assert.Equal("Input format is invalid.", result.ErrorMessage);
  540. Assert.Equal("dateOfBirth", result.MemberNames.Single());
  541. }
  542. [Fact]
  543. public void UrlReturnsSuccessIfInputIsNull()
  544. {
  545. // Arrange
  546. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  547. var validator = Validator.Url();
  548. var context = GetValidationContext(GetContext(new { }), "blogUrl");
  549. // Act
  550. var result = validator.Validate(context);
  551. // Assert
  552. Assert.Equal(ValidationResult.Success, result);
  553. }
  554. [Fact]
  555. public void UrlReturnsSuccessIfInputIsEmptyString()
  556. {
  557. // Arrange
  558. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  559. var validator = Validator.Url();
  560. var context = GetValidationContext(GetContext(new { blogUrl = "" }), "blogUrl");
  561. // Act
  562. var result = validator.Validate(context);
  563. // Assert
  564. Assert.Equal(ValidationResult.Success, result);
  565. }
  566. [Fact]
  567. public void UrlReturnsSuccessIfInputIsValidUrl()
  568. {
  569. // Arrange
  570. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  571. var validator = Validator.Url();
  572. var context = GetValidationContext(GetContext(new { blogUrl = "http://www.microsoft.com?query-param=query-param-value&some-val="true"" }), "blogUrl");
  573. // Act
  574. var result = validator.Validate(context);
  575. // Assert
  576. Assert.Equal(ValidationResult.Success, result);
  577. }
  578. [Fact]
  579. public void UrlReturnsErrorMessageIfInputIsPhysicalPath()
  580. {
  581. // Arrange
  582. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  583. var validator = Validator.Url();
  584. var context = GetValidationContext(GetContext(new { blogUrl = @"x:\some-path\foo.txt" }), "blogUrl");
  585. // Act
  586. var result = validator.Validate(context);
  587. // Assert
  588. Assert.NotEqual(ValidationResult.Success, result);
  589. Assert.Equal("Input format is invalid.", result.ErrorMessage);
  590. Assert.Equal("blogUrl", result.MemberNames.Single());
  591. }
  592. [Fact]
  593. public void UrlReturnsErrorMessageIfInputIsNetworkPath()
  594. {
  595. // Arrange
  596. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  597. var validator = Validator.Url();
  598. var context = GetValidationContext(GetContext(new { blogUrl = @"\\network-share\some-path\" }), "blogUrl");
  599. // Act
  600. var result = validator.Validate(context);
  601. // Assert
  602. Assert.NotEqual(ValidationResult.Success, result);
  603. Assert.Equal("Input format is invalid.", result.ErrorMessage);
  604. Assert.Equal("blogUrl", result.MemberNames.Single());
  605. }
  606. [Fact]
  607. public void UrlReturnsErrorMessageIfInputIsNotAnUrl()
  608. {
  609. // Arrange
  610. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  611. var validator = Validator.Url();
  612. var context = GetValidationContext(GetContext(new { blogUrl = 65 }), "blogUrl");
  613. // Act
  614. var result = validator.Validate(context);
  615. // Assert
  616. Assert.NotEqual(ValidationResult.Success, result);
  617. Assert.Equal("Input format is invalid.", result.ErrorMessage);
  618. Assert.Equal("blogUrl", result.MemberNames.Single());
  619. }
  620. [Fact]
  621. public void EqualsToValidatorThrowsIfFieldIsNullOrEmpty()
  622. {
  623. // Act and Assert
  624. Assert.ThrowsArgumentNullOrEmptyString(() => Validator.EqualsTo(null), "otherFieldName");
  625. }
  626. [Fact]
  627. public void EqualsToValidatorReturnsFalseIfEitherFieldIsEmpty()
  628. {
  629. // Arrange
  630. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  631. var validator = Validator.EqualsTo("password");
  632. var context = GetValidationContext(GetContext(new { password = "", confirmPassword = "abcd" }), "confirmPassword");
  633. // Act
  634. var result = validator.Validate(context);
  635. // Assert
  636. Assert.NotEqual(ValidationResult.Success, result);
  637. Assert.Equal("Values do not match.", result.ErrorMessage);
  638. Assert.Equal("confirmPassword", result.MemberNames.Single());
  639. context = GetValidationContext(GetContext(new { password = "abcd", confirmPassword = "" }), "confirmPassword");
  640. // Act
  641. result = validator.Validate(context);
  642. // Assert
  643. Assert.NotEqual(ValidationResult.Success, result);
  644. Assert.Equal("Values do not match.", result.ErrorMessage);
  645. Assert.Equal("confirmPassword", result.MemberNames.Single());
  646. }
  647. [Fact]
  648. public void EqualsToValidatorReturnsFalseIfValuesDoNotMatch()
  649. {
  650. // Arrange
  651. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  652. var validator = Validator.EqualsTo("password");
  653. var context = GetValidationContext(GetContext(new { password = "password2", confirmPassword = "abcd" }), "confirmPassword");
  654. // Act
  655. var result = validator.Validate(context);
  656. // Assert
  657. Assert.NotEqual(ValidationResult.Success, result);
  658. Assert.Equal("Values do not match.", result.ErrorMessage);
  659. Assert.Equal("confirmPassword", result.MemberNames.Single());
  660. }
  661. [Fact]
  662. public void EqualsToValidatorReturnsTrueIfValuesMatch()
  663. {
  664. // Arrange
  665. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  666. var validator = Validator.EqualsTo("password");
  667. var context = GetValidationContext(GetContext(new { password = "abcd", confirmPassword = "abcd" }), "confirmPassword");
  668. // Act
  669. var result = validator.Validate(context);
  670. // Assert
  671. Assert.Equal(ValidationResult.Success, result);
  672. }
  673. [Fact]
  674. public void GetClientValidationRulesForRegex()
  675. {
  676. // Arrange
  677. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  678. var validator = Validator.Regex("^a+b+c$");
  679. // Act
  680. var result = validator.ClientValidationRule;
  681. // Assert
  682. Assert.Equal("regex", result.ValidationType);
  683. Assert.Equal("Value is invalid.", result.ErrorMessage);
  684. Assert.Equal("^a+b+c$", result.ValidationParameters["pattern"]);
  685. }
  686. [Fact]
  687. public void GetClientValidationRulesForRegexWithCustomErrorMessage()
  688. {
  689. // Arrange
  690. RequestFieldValidatorBase.IgnoreUseUnvalidatedValues = true;
  691. var validator = Validator.Regex("^a+b+c$", "Example aaabbc");
  692. // Act
  693. var result = validator.ClientValidationRule;
  694. // Assert
  695. Assert.Equal("regex", result.ValidationType);
  696. Assert.Equal("Example aaabbc", result.ErrorMessage);
  697. Assert.Equal("^a+b+c$", result.ValidationParameters["pattern"]);
  698. }
  699. private static HttpContextBase GetContext(object formValues = null)
  700. {
  701. var context = new Mock<HttpContextBase>();
  702. var request = new Mock<HttpRequestBase>();
  703. var nameValueCollection = new NameValueCollection();
  704. if (formValues != null)
  705. {
  706. foreach (var prop in formValues.GetType().GetProperties())
  707. {
  708. nameValueCollection.Add(prop.Name, prop.GetValue(formValues, null).ToString());
  709. }
  710. }
  711. request.SetupGet(c => c.Form).Returns(nameValueCollection);
  712. context.SetupGet(c => c.Request).Returns(request.Object);
  713. return context.Object;
  714. }
  715. private static ValidationContext GetValidationContext(HttpContextBase httpContext, string memberName)
  716. {
  717. return new ValidationContext(httpContext, null, null) { MemberName = memberName };
  718. }
  719. }
  720. }