/test/functional/test_validatable.rb

https://github.com/jnunemaker/validatable · Ruby · 519 lines · 486 code · 33 blank · 0 comment · 0 complexity · dac81285804188aa4c2fec718f0c18d6 MD5 · raw file

  1. require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
  2. functional_tests do
  3. expect "can't be empty" do
  4. child_class = Module.new do
  5. include Validatable
  6. validates_presence_of :name
  7. end
  8. klass = Class.new do
  9. include Validatable
  10. include_validations_from :child
  11. define_method :child do
  12. child_class
  13. end
  14. attr_accessor :name
  15. end
  16. instance = klass.new
  17. instance.valid?
  18. instance.errors.on(:name)
  19. end
  20. expect "can't be empty" do
  21. child_class = Module.new do
  22. include Validatable
  23. validates_presence_of :name
  24. end
  25. klass = Class.new do
  26. include Validatable
  27. validates_presence_of :address
  28. include_validations_from :child
  29. define_method :child do
  30. child_class
  31. end
  32. attr_accessor :name, :address
  33. end
  34. instance = klass.new
  35. instance.valid?
  36. instance.errors.on(:address)
  37. end
  38. expect :is_set do
  39. klass = Class.new do
  40. include Validatable
  41. attr_accessor :result
  42. before_validation do
  43. self.result = :is_set
  44. end
  45. end
  46. instance = klass.new
  47. instance.valid?
  48. instance.result
  49. end
  50. expect :is_set do
  51. klass = Class.new do
  52. include Validatable
  53. attr_accessor :name, :result
  54. validates_presence_of :name, :after_validate => lambda { |result, attribute| self.result = :is_set }
  55. end
  56. instance = klass.new
  57. instance.valid?
  58. instance.result
  59. end
  60. expect false do
  61. klass = Class.new do
  62. include Validatable
  63. attr_accessor :name
  64. validates_presence_of :name
  65. end
  66. subclass = Class.new klass do
  67. end
  68. subsubclass = Class.new subclass do
  69. end
  70. subsubclass.new.valid?
  71. end
  72. expect false do
  73. klass = Class.new do
  74. include Validatable
  75. attr_accessor :name
  76. validates_presence_of :name
  77. end
  78. subclass = Class.new klass do
  79. end
  80. subclass.new.valid?
  81. end
  82. expect true do
  83. klass = Class.new do
  84. include Validatable
  85. attr_accessor :name
  86. validates_presence_of :name
  87. end
  88. subclass = Class.new klass do
  89. end
  90. instance = subclass.new
  91. instance.name = 'a name'
  92. instance.valid?
  93. end
  94. expect ArgumentError do
  95. Class.new do
  96. include Validatable
  97. attr_accessor :name
  98. validates_presence_of :name, :times => 1
  99. validates_presence_of :name, :times => 1
  100. end
  101. end
  102. expect ArgumentError do
  103. Class.new do
  104. include Validatable
  105. attr_accessor :name
  106. validates_presence_of :name, :times => 1, :key => 'anything'
  107. validates_presence_of :name, :times => 1, :key => 'anything'
  108. end
  109. end
  110. expect "is invalid" do
  111. child_class = Class.new do
  112. include Validatable
  113. attr_accessor :name, :address
  114. validates_presence_of :name
  115. validates_format_of :address, :with => /.+/
  116. end
  117. klass = Class.new do
  118. include Validatable
  119. include_errors_from :child
  120. define_method :child do
  121. child_class.new
  122. end
  123. end
  124. instance = klass.new
  125. instance.valid?
  126. instance.errors.on(:address)
  127. end
  128. expect "is invalid" do
  129. child_class = Class.new do
  130. include Validatable
  131. attr_accessor :name, :address
  132. validates_presence_of :name
  133. validates_format_of :address, :with => /.+/
  134. end
  135. klass = Class.new do
  136. include Validatable
  137. include_errors_from :child
  138. define_method :child do
  139. valid_child = child_class.new
  140. valid_child.name = "nom de plume"
  141. valid_child.address = "nowhere"
  142. [valid_child, child_class.new]
  143. end
  144. end
  145. instance = klass.new
  146. instance.valid?
  147. instance.errors.on(:address)
  148. end
  149. expect true do
  150. child_class = Class.new do
  151. include Validatable
  152. attr_accessor :name, :address
  153. validates_presence_of :name
  154. validates_format_of :address, :with => /.+/
  155. end
  156. klass = Class.new do
  157. include Validatable
  158. include_errors_from :child
  159. define_method :child do
  160. valid_child = child_class.new
  161. valid_child.name = "nom de plume"
  162. valid_child.address = "nowhere"
  163. also_valid = child_class.new
  164. also_valid.name = "nom de guerre"
  165. also_valid.address = "somewhere else"
  166. [valid_child, valid_child]
  167. end
  168. end
  169. instance = klass.new
  170. instance.valid?
  171. end
  172. expect "can't be empty" do
  173. child_class = Class.new do
  174. include Validatable
  175. attr_accessor :name, :address
  176. validates_presence_of :name
  177. validates_format_of :address, :with => /.+/
  178. end
  179. klass = Class.new do
  180. include Validatable
  181. include_errors_from :child
  182. define_method :child do
  183. child_class.new
  184. end
  185. end
  186. instance = klass.new
  187. instance.valid?
  188. instance.errors.on(:name)
  189. end
  190. test "when child validations have errors, level 2 and higher parent validations are not performed" do
  191. child_class = Class.new do
  192. include Validatable
  193. attr_accessor :name
  194. validates_presence_of :name
  195. end
  196. klass = Class.new do
  197. include Validatable
  198. extend Forwardable
  199. def_delegator :child, :name
  200. validates_true_for :name, :logic => lambda { false }, :level => 2, :message => "invalid message"
  201. include_errors_from :child
  202. define_method :child do
  203. @child ||= child_class.new
  204. end
  205. end
  206. instance = klass.new
  207. instance.valid?
  208. assert_equal "can't be empty", instance.errors.on(:name)
  209. end
  210. test "when child validations have errors, level 1 parent validations are still performed" do
  211. child_class = Class.new do
  212. include Validatable
  213. attr_accessor :name
  214. validates_presence_of :name
  215. end
  216. klass = Class.new do
  217. include Validatable
  218. validates_true_for :address, :logic => lambda { false }, :level => 1, :message => "invalid message"
  219. include_errors_from :child
  220. define_method :child do
  221. @child ||= child_class.new
  222. end
  223. end
  224. instance = klass.new
  225. instance.valid?
  226. assert_equal "can't be empty", instance.errors.on(:name)
  227. assert_equal "invalid message", instance.errors.on(:address)
  228. end
  229. expect "can't be empty" do
  230. child_class = Class.new do
  231. include Validatable
  232. attr_accessor :name, :address
  233. validates_presence_of :name
  234. end
  235. klass = Class.new do
  236. include Validatable
  237. include_errors_from :child, :map => {:name => :namen}
  238. define_method :child do
  239. child_class.new
  240. end
  241. end
  242. instance = klass.new
  243. instance.valid?
  244. instance.errors.on(:namen)
  245. end
  246. expect "can't be empty" do
  247. child_class = Class.new do
  248. include Validatable
  249. attr_accessor :name, :address
  250. validates_presence_of :name
  251. end
  252. klass = Class.new do
  253. include Validatable
  254. include_errors_from :child, :if => lambda { true }
  255. define_method :child do
  256. child_class.new
  257. end
  258. end
  259. instance = klass.new
  260. instance.valid?
  261. instance.errors.on(:name)
  262. end
  263. expect true do
  264. child_class = Class.new do
  265. include Validatable
  266. attr_accessor :name, :address
  267. validates_presence_of :name
  268. end
  269. klass = Class.new do
  270. include Validatable
  271. include_errors_from :child, :if => lambda { false }
  272. define_method :child do
  273. child_class.new
  274. end
  275. end
  276. instance = klass.new
  277. instance.valid?
  278. end
  279. test ':if with symbol should work' do
  280. klass = Class.new do
  281. include Validatable
  282. attr_accessor :name, :name_required
  283. validates_presence_of :name, :if => :name_required?
  284. def name_required?
  285. name_required
  286. end
  287. end
  288. instance = klass.new
  289. instance.name_required = false
  290. assert instance.valid?
  291. instance.name_required = true
  292. assert !instance.valid?
  293. assert_equal "can't be empty", instance.errors.on(:name)
  294. end
  295. test ':if with string should work' do
  296. klass = Class.new do
  297. include Validatable
  298. attr_accessor :name, :name_required
  299. validates_presence_of :name, :if => 'name_required?'
  300. def name_required?
  301. name_required
  302. end
  303. end
  304. instance = klass.new
  305. instance.name_required = false
  306. assert instance.valid?
  307. instance.name_required = true
  308. assert !instance.valid?
  309. assert_equal "can't be empty", instance.errors.on(:name)
  310. end
  311. test "classes only have valid_for_* methods for groups that appear in their validations" do
  312. class_with_group_one = Class.new do
  313. include Validatable
  314. validates_presence_of :name, :groups => :group_one
  315. attr_accessor :name
  316. end
  317. class_with_group_two = Class.new do
  318. include Validatable
  319. validates_presence_of :name, :groups => :group_two
  320. attr_accessor :name
  321. end
  322. assert_equal false, class_with_group_one.public_instance_methods.include?(:valid_for_group_two?)
  323. assert_equal false, class_with_group_two.public_instance_methods.include?(:valid_for_group_one?)
  324. end
  325. test "nonmatching groups are not used as validations" do
  326. klass = Class.new do
  327. include Validatable
  328. validates_presence_of :name, :groups => :group_one
  329. validates_presence_of :address, :groups => :group_two
  330. attr_accessor :name, :address
  331. end
  332. instance = klass.new
  333. assert_equal nil, instance.errors.on(:name)
  334. end
  335. expect "can't be empty twice changed message" do
  336. klass = Class.new do
  337. include Validatable
  338. validates_presence_of :name
  339. attr_accessor :name
  340. end
  341. Validatable::ValidationBase.class_eval do
  342. after_validate do |result, instance, attribute|
  343. instance.errors.add(attribute, " changed message")
  344. end
  345. end
  346. Validatable::ValidatesPresenceOf.class_eval do
  347. after_validate do |result, instance, attribute|
  348. instance.errors.add(attribute, " twice")
  349. end
  350. end
  351. instance = klass.new
  352. instance.valid?
  353. Validatable::ValidatesPresenceOf.after_validations.clear
  354. Validatable::ValidationBase.after_validations.clear
  355. instance.errors.on(:name).join
  356. end
  357. expect false do
  358. klass = Class.new do
  359. include Validatable
  360. validates_presence_of :name, :groups => :group_one
  361. attr_accessor :name
  362. end
  363. instance = klass.new
  364. instance.valid_for_group_one?
  365. end
  366. expect false do
  367. klass = Class.new do
  368. include Validatable
  369. validates_presence_of :name, :groups => [:group_one, :group_two]
  370. attr_accessor :name
  371. end
  372. instance = klass.new
  373. instance.valid_for_group_one?
  374. end
  375. expect true do
  376. klass = Class.new do
  377. include Validatable
  378. validates_presence_of :name, :groups => :group_one
  379. validates_presence_of :address
  380. attr_accessor :name, :address
  381. end
  382. instance = klass.new
  383. instance.address = 'anything'
  384. instance.valid?
  385. end
  386. expect true do
  387. klass = Class.new do
  388. include Validatable
  389. validates_presence_of :name, :groups => :group_one
  390. attr_accessor :name
  391. end
  392. instance = klass.new
  393. instance.valid?
  394. end
  395. expect true do
  396. klass = Class.new do
  397. include Validatable
  398. validates_presence_of :name, :times => 1
  399. attr_accessor :name
  400. end
  401. instance = klass.new
  402. instance.valid?
  403. instance.valid?
  404. end
  405. expect false do
  406. klass = Class.new do
  407. include Validatable
  408. validates_presence_of :name, :times => 1
  409. attr_accessor :name
  410. end
  411. instance1 = klass.new
  412. instance1.valid?
  413. instance2 = klass.new
  414. instance2.valid?
  415. end
  416. expect "name message" do
  417. klass = Class.new do
  418. include Validatable
  419. validates_presence_of :name, :level => 1, :message => "name message"
  420. validates_presence_of :address, :level => 2
  421. attr_accessor :name, :address
  422. end
  423. instance = klass.new
  424. instance.valid?
  425. instance.errors.on(:name)
  426. end
  427. expect nil do
  428. klass = Class.new do
  429. include Validatable
  430. validates_presence_of :name, :level => 1, :message => "name message"
  431. validates_presence_of :address, :level => 2
  432. attr_accessor :name, :address
  433. end
  434. instance = klass.new
  435. instance.valid?
  436. instance.errors.on(:address)
  437. end
  438. expect "Mod::Klass/Validatable::ValidatesPresenceOf/name" do
  439. module Mod
  440. class Klass
  441. include Validatable
  442. validates_presence_of :name
  443. end
  444. end
  445. Mod::Klass.validations.first.key
  446. end
  447. expect "/Validatable::ValidatesPresenceOf/custom key" do
  448. klass = Class.new do
  449. include Validatable
  450. validates_presence_of :name, :key => "custom key"
  451. end
  452. klass.validations.first.key
  453. end
  454. expect "can't be empty" do
  455. klass = Class.new do
  456. include Validatable
  457. validates_presence_of :name, :address
  458. attr_accessor :name, :address
  459. end
  460. instance = klass.new
  461. instance.validate_only("presence_of/name")
  462. instance.errors.on(:name)
  463. end
  464. expect nil do
  465. klass = Class.new do
  466. include Validatable
  467. validates_presence_of :name, :address
  468. attr_accessor :name, :address
  469. end
  470. instance = klass.new
  471. instance.validate_only("presence_of/name")
  472. instance.errors.on(:address)
  473. end
  474. end