/test/validation.js

https://github.com/koodaamo/uni-form · JavaScript · 444 lines · 332 code · 82 blank · 30 comment · 6 complexity · 6ddc22eded7fabbe630bace19b805410 MD5 · raw file

  1. // http://docs.jquery.com/Qunit
  2. /**
  3. * Short accessor to a input element
  4. *
  5. * Note that IE can't do attr('type','text')
  6. *
  7. * @param string type input type enumerated [checkbox, radio, text, password]
  8. * @param string value text value of input
  9. *
  10. * @return obj jQuery object
  11. */
  12. var getInput = function(type, value) {
  13. return $('<input type="' + type + '" />').val(value);
  14. }
  15. /**
  16. * Test our validators
  17. *
  18. * Validators return:
  19. * bool true for sucess
  20. * string error message for failure
  21. *
  22. * So, this function tests for true/string, and makes the output
  23. * in the unit test a little more clear
  24. *
  25. * @param mixed a result
  26. * @param bool b expected pass/fail
  27. * @param string message unit test message
  28. *
  29. * return bool result of assertion
  30. */
  31. var validationTest = function(a, b, message) {
  32. if (b === true) {
  33. return ok((a === b), message);
  34. }
  35. return ok((typeof a == "string"), message);
  36. }
  37. module("Test fixtures");
  38. test("Test data is correctly setup", function() {
  39. ok(jQuery().uniform, "Plugin script not loaded/registered");
  40. ok(jQuery('#qunit-form').length, "Sample form present");
  41. });
  42. var validators;
  43. module("Validation unit tests", {
  44. setup: function() {
  45. validators = jQuery().uniform().validators;
  46. }
  47. });
  48. test("Required test", function() {
  49. var $input = getInput('text','');
  50. validationTest(
  51. validators.required($input.val('non empty text')),
  52. true,
  53. 'Required value detected'
  54. );
  55. validationTest(
  56. validators.required($input.val('')),
  57. false,
  58. "Error message for empty input"
  59. );
  60. });
  61. test("Minlength test", function() {
  62. var $input = getInput('text','');
  63. $input
  64. .addClass('validateMinLength')
  65. .addClass('val-8');
  66. validationTest(
  67. validators.validateMinLength($input.val('non empty text')), // 14 char
  68. true,
  69. 'Minimum length passed with 14 char input'
  70. );
  71. validationTest(
  72. validators.validateMinLength($input.val('Short')),
  73. false,
  74. "Error message set for short input"
  75. );
  76. validationTest(
  77. validators.validateMinLength($input.val('')),
  78. false,
  79. "Error message set for empty input"
  80. );
  81. });
  82. test("Maxlength test", function() {
  83. var $input = getInput('text','');
  84. $input
  85. .addClass('validateMaxLength')
  86. .addClass('val-8');
  87. validationTest(
  88. validators.validateMaxLength($input.val('non empty text')), // 14 char
  89. false,
  90. 'maximum length error with 14 char input'
  91. );
  92. validationTest(
  93. validators.validateMaxLength($input.val('Short')),
  94. true,
  95. "Passed short input"
  96. );
  97. validationTest(
  98. validators.validateMaxLength($input.val('')),
  99. true,
  100. "Passed empty input"
  101. );
  102. });
  103. test("Min test", function() {
  104. var $input = getInput('text','');
  105. $input
  106. .addClass('validateMin')
  107. .addClass('val-8');
  108. validationTest(
  109. validators.validateMin($input.val('6')),
  110. false,
  111. 'Value less than min'
  112. );
  113. validationTest(
  114. validators.validateMin($input.val('8')),
  115. true,
  116. 'Value equal to min'
  117. );
  118. validationTest(
  119. validators.validateMin($input.val('10')),
  120. true,
  121. "Value greater than min"
  122. );
  123. });
  124. test("Max test", function() {
  125. var $input = getInput('text','');
  126. $input
  127. .addClass('validateMax')
  128. .addClass('val-8');
  129. validationTest(
  130. validators.validateMax($input.val('6')),
  131. true,
  132. 'Value less than max'
  133. );
  134. validationTest(
  135. validators.validateMax($input.val('8')),
  136. true,
  137. 'Value equal to max'
  138. );
  139. validationTest(
  140. validators.validateMax($input.val('10')),
  141. false,
  142. "Value greater than max"
  143. );
  144. });
  145. test("SameAs test", function() {
  146. var $inputA = getInput('text','Same Value').attr('name','inputA');
  147. var $inputB = getInput('text','Same Value').attr('name','inputB').addClass('validateSameAs').addClass('inputA');
  148. var $form = $('#qunit-fixture').append($inputA).append($inputB);
  149. validationTest(
  150. validators.validateSameAs($inputB),
  151. true,
  152. 'Same Values'
  153. );
  154. $inputA.val('Different Value');
  155. validationTest(
  156. validators.validateSameAs($inputB),
  157. false,
  158. "Different values"
  159. );
  160. });
  161. test("Email address test", function() {
  162. var $input = getInput('text',''),
  163. address,
  164. addresses = {
  165. 'spam@example.com' : true,
  166. 'spam@example.co.uk' : true,
  167. 'spam.spam@example.co.uk' : true,
  168. 'user+filter@gmail.com' : true,
  169. 'spam@.com' : false,
  170. 'spam@com' : false,
  171. 'spam.com' : false
  172. },
  173. explanation;
  174. for (address in addresses) {
  175. explanation = (addresses[address]) ? ' passes' : ' fails'
  176. validationTest(
  177. validators.validateEmail($input.val(address)),
  178. addresses[address],
  179. address + explanation
  180. );
  181. }
  182. });
  183. test("Url test", function() {
  184. var $input = getInput('text',''),
  185. explanation,
  186. address,
  187. addresses = {
  188. 'http://www.example.com/test/url' : true,
  189. 'http://www.example.com/test.html' : true,
  190. 'ftp://www.example.com' : true,
  191. 'htp://www.example.com' : false,
  192. 'http://www example.com' : false
  193. };
  194. for (address in addresses) {
  195. explanation = (addresses[address]) ? ' passes' : ' fails'
  196. validationTest(
  197. validators.validateUrl($input.val(address)),
  198. addresses[address],
  199. address + explanation
  200. );
  201. }
  202. });
  203. test("Number test", function() {
  204. var $input = getInput('text','');
  205. validationTest(
  206. validators.validateNumber($input.val('6')),
  207. true,
  208. 'Interger value'
  209. );
  210. validationTest(
  211. validators.validateNumber($input.val('8.345')),
  212. true,
  213. 'Float value'
  214. );
  215. validationTest(
  216. validators.validateNumber($input.val('Notanumber')),
  217. false,
  218. "Text"
  219. );
  220. validationTest(
  221. validators.validateNumber($input.val('#$')),
  222. false,
  223. "Special characters"
  224. );
  225. });
  226. test("Alpha test", function() {
  227. var $input = getInput('text','');
  228. validationTest(
  229. validators.validateAlpha($input.val('6')),
  230. false,
  231. 'Integer value'
  232. );
  233. validationTest(
  234. validators.validateAlpha($input.val('8.345')),
  235. false,
  236. 'Float value'
  237. );
  238. validationTest(
  239. validators.validateAlpha($input.val('Text with spaces')),
  240. false,
  241. "Text with spaces"
  242. );
  243. validationTest(
  244. validators.validateAlpha($input.val('Word')),
  245. true,
  246. "Single word"
  247. );
  248. validationTest(
  249. validators.validateAlpha($input.val('Word345')),
  250. false,
  251. "Single alphanum"
  252. );
  253. });
  254. test("Alphanum test", function() {
  255. var $input = getInput('text','');
  256. validationTest(
  257. validators.validateAlphaNum($input.val('6')),
  258. true,
  259. 'Integer value'
  260. );
  261. // questionable, because "." is not in \W
  262. validationTest(
  263. validators.validateAlphaNum($input.val('8.345')),
  264. false,
  265. 'Float value'
  266. );
  267. validationTest(
  268. validators.validateAlphaNum($input.val('Text with spaces')),
  269. false,
  270. "Text with spaces"
  271. );
  272. validationTest(
  273. validators.validateAlphaNum($input.val('Word')),
  274. true,
  275. "Single word"
  276. );
  277. validationTest(
  278. validators.validateAlphaNum($input.val('Word345')),
  279. true,
  280. "Single alphanum"
  281. );
  282. });
  283. test("Phrase test", function() {
  284. var $input = getInput('text','');
  285. validationTest(
  286. validators.validatePhrase($input.val('Text with spaces')),
  287. true,
  288. "Text with spaces"
  289. );
  290. validationTest(
  291. validators.validatePhrase($input.val('Word')),
  292. true,
  293. "Single word"
  294. );
  295. validationTest(
  296. validators.validatePhrase($input.val('Word345')),
  297. true,
  298. "Single alphanum"
  299. );
  300. });
  301. test("Phone test", function() {
  302. var $input = getInput('text',''),
  303. numbers = {
  304. '(308)-135-7895' : true,
  305. '(123) 456-7890' : true,
  306. '123-345-6789' : true,
  307. '123 456-7890' : true,
  308. '456-7890' : false,
  309. '23456789' : false
  310. },
  311. number,
  312. explanation;
  313. for (number in numbers) {
  314. explanation = (numbers[number]) ? ' passes' : ' fails'
  315. validationTest(
  316. validators.validatePhone($input.val(number)),
  317. numbers[number],
  318. number + explanation
  319. );
  320. }
  321. });
  322. test("Date test", function() {
  323. var $input = getInput('text',''),
  324. explanation,
  325. date,
  326. dates = {
  327. '1/1/11' : true,
  328. '1/1/2011' : true,
  329. '1/1/2011' : true,
  330. '11/1/2011' : true,
  331. '01/01/2001' : true, // Case 6
  332. '16/40/2011' : false
  333. };
  334. for (date in dates) {
  335. explanation = (dates[date]) ? ' passes' : ' fails'
  336. validationTest(
  337. validators.validateDate($input.val(date)),
  338. dates[date],
  339. date + explanation
  340. );
  341. }
  342. });
  343. test("Default data hides correctly", function() {
  344. var default_text = 'This is a sample',
  345. $input = $('#issue_15_a'),
  346. $form = jQuery('#qunit-form');
  347. $input.attr('data-default-value', default_text);
  348. $form.uniform();
  349. // should be showing the default
  350. equals(
  351. $input.val(),
  352. default_text,
  353. "The default value has not been displayed correctly"
  354. );
  355. $input.focus();
  356. // should now be empty
  357. equals(
  358. $input.val(),
  359. '',
  360. "The default value has not been displayed correctly"
  361. );
  362. });