PageRenderTime 51ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/vendor/rails/activerecord/test/mixin_test.rb

https://github.com/bricooke/my-biz-expenses
Ruby | 550 lines | 419 code | 130 blank | 1 comment | 1 complexity | efb83b8e7eea48f38a9fd11d96599548 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, BSD-3-Clause
  1. require 'abstract_unit'
  2. require 'active_record/acts/tree'
  3. require 'active_record/acts/list'
  4. require 'active_record/acts/nested_set'
  5. require 'fixtures/mixin'
  6. # Let us control what Time.now returns for the TouchTest suite
  7. class Time
  8. @@forced_now_time = nil
  9. cattr_accessor :forced_now_time
  10. class << self
  11. def now_with_forcing
  12. if @@forced_now_time
  13. @@forced_now_time
  14. else
  15. now_without_forcing
  16. end
  17. end
  18. alias_method_chain :now, :forcing
  19. end
  20. end
  21. class ListTest < Test::Unit::TestCase
  22. fixtures :mixins
  23. def test_reordering
  24. assert_equal [mixins(:list_1),
  25. mixins(:list_2),
  26. mixins(:list_3),
  27. mixins(:list_4)],
  28. ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos')
  29. mixins(:list_2).move_lower
  30. assert_equal [mixins(:list_1),
  31. mixins(:list_3),
  32. mixins(:list_2),
  33. mixins(:list_4)],
  34. ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos')
  35. mixins(:list_2).move_higher
  36. assert_equal [mixins(:list_1),
  37. mixins(:list_2),
  38. mixins(:list_3),
  39. mixins(:list_4)],
  40. ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos')
  41. mixins(:list_1).move_to_bottom
  42. assert_equal [mixins(:list_2),
  43. mixins(:list_3),
  44. mixins(:list_4),
  45. mixins(:list_1)],
  46. ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos')
  47. mixins(:list_1).move_to_top
  48. assert_equal [mixins(:list_1),
  49. mixins(:list_2),
  50. mixins(:list_3),
  51. mixins(:list_4)],
  52. ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos')
  53. mixins(:list_2).move_to_bottom
  54. assert_equal [mixins(:list_1),
  55. mixins(:list_3),
  56. mixins(:list_4),
  57. mixins(:list_2)],
  58. ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos')
  59. mixins(:list_4).move_to_top
  60. assert_equal [mixins(:list_4),
  61. mixins(:list_1),
  62. mixins(:list_3),
  63. mixins(:list_2)],
  64. ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos')
  65. end
  66. def test_move_to_bottom_with_next_to_last_item
  67. assert_equal [mixins(:list_1),
  68. mixins(:list_2),
  69. mixins(:list_3),
  70. mixins(:list_4)],
  71. ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos')
  72. mixins(:list_3).move_to_bottom
  73. assert_equal [mixins(:list_1),
  74. mixins(:list_2),
  75. mixins(:list_4),
  76. mixins(:list_3)],
  77. ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos')
  78. end
  79. def test_next_prev
  80. assert_equal mixins(:list_2), mixins(:list_1).lower_item
  81. assert_nil mixins(:list_1).higher_item
  82. assert_equal mixins(:list_3), mixins(:list_4).higher_item
  83. assert_nil mixins(:list_4).lower_item
  84. end
  85. def test_injection
  86. item = ListMixin.new("parent_id"=>1)
  87. assert_equal "parent_id = 1", item.scope_condition
  88. assert_equal "pos", item.position_column
  89. end
  90. def test_insert
  91. new = ListMixin.create("parent_id"=>20)
  92. assert_equal 1, new.pos
  93. assert new.first?
  94. assert new.last?
  95. new = ListMixin.create("parent_id"=>20)
  96. assert_equal 2, new.pos
  97. assert !new.first?
  98. assert new.last?
  99. new = ListMixin.create("parent_id"=>20)
  100. assert_equal 3, new.pos
  101. assert !new.first?
  102. assert new.last?
  103. new = ListMixin.create("parent_id"=>0)
  104. assert_equal 1, new.pos
  105. assert new.first?
  106. assert new.last?
  107. end
  108. def test_insert_at
  109. new = ListMixin.create("parent_id" => 20)
  110. assert_equal 1, new.pos
  111. new = ListMixin.create("parent_id" => 20)
  112. assert_equal 2, new.pos
  113. new = ListMixin.create("parent_id" => 20)
  114. assert_equal 3, new.pos
  115. new4 = ListMixin.create("parent_id" => 20)
  116. assert_equal 4, new4.pos
  117. new4.insert_at(3)
  118. assert_equal 3, new4.pos
  119. new.reload
  120. assert_equal 4, new.pos
  121. new.insert_at(2)
  122. assert_equal 2, new.pos
  123. new4.reload
  124. assert_equal 4, new4.pos
  125. new5 = ListMixin.create("parent_id" => 20)
  126. assert_equal 5, new5.pos
  127. new5.insert_at(1)
  128. assert_equal 1, new5.pos
  129. new4.reload
  130. assert_equal 5, new4.pos
  131. end
  132. def test_delete_middle
  133. assert_equal [mixins(:list_1),
  134. mixins(:list_2),
  135. mixins(:list_3),
  136. mixins(:list_4)],
  137. ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos')
  138. mixins(:list_2).destroy
  139. assert_equal [mixins(:list_1, :reload),
  140. mixins(:list_3, :reload),
  141. mixins(:list_4, :reload)],
  142. ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos')
  143. assert_equal 1, mixins(:list_1).pos
  144. assert_equal 2, mixins(:list_3).pos
  145. assert_equal 3, mixins(:list_4).pos
  146. mixins(:list_1).destroy
  147. assert_equal [mixins(:list_3, :reload),
  148. mixins(:list_4, :reload)],
  149. ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos')
  150. assert_equal 1, mixins(:list_3).pos
  151. assert_equal 2, mixins(:list_4).pos
  152. end
  153. def test_with_string_based_scope
  154. new = ListWithStringScopeMixin.create("parent_id"=>500)
  155. assert_equal 1, new.pos
  156. assert new.first?
  157. assert new.last?
  158. end
  159. def test_nil_scope
  160. new1, new2, new3 = ListMixin.create, ListMixin.create, ListMixin.create
  161. new2.move_higher
  162. assert_equal [new2, new1, new3], ListMixin.find(:all, :conditions => 'parent_id IS NULL', :order => 'pos')
  163. end
  164. end
  165. class TreeTest < Test::Unit::TestCase
  166. fixtures :mixins
  167. def test_has_child
  168. assert_deprecated 'has_children?' do
  169. assert_equal true, mixins(:tree_1).has_children?
  170. assert_equal true, mixins(:tree_2).has_children?
  171. assert_equal false, mixins(:tree_3).has_children?
  172. assert_equal false, mixins(:tree_4).has_children?
  173. end
  174. end
  175. def test_children
  176. assert_equal mixins(:tree_1).children, [mixins(:tree_2), mixins(:tree_4)]
  177. assert_equal mixins(:tree_2).children, [mixins(:tree_3)]
  178. assert_equal mixins(:tree_3).children, []
  179. assert_equal mixins(:tree_4).children, []
  180. end
  181. def test_has_parent
  182. assert_deprecated 'has_parent?' do
  183. assert_equal false, mixins(:tree_1).has_parent?
  184. assert_equal true, mixins(:tree_2).has_parent?
  185. assert_equal true, mixins(:tree_3).has_parent?
  186. assert_equal true, mixins(:tree_4).has_parent?
  187. end
  188. end
  189. def test_parent
  190. assert_equal mixins(:tree_2).parent, mixins(:tree_1)
  191. assert_equal mixins(:tree_2).parent, mixins(:tree_4).parent
  192. assert_nil mixins(:tree_1).parent
  193. end
  194. def test_delete
  195. assert_equal 6, TreeMixin.count
  196. mixins(:tree_1).destroy
  197. assert_equal 2, TreeMixin.count
  198. mixins(:tree2_1).destroy
  199. mixins(:tree3_1).destroy
  200. assert_equal 0, TreeMixin.count
  201. end
  202. def test_insert
  203. @extra = mixins(:tree_1).children.create
  204. assert @extra
  205. assert_equal @extra.parent, mixins(:tree_1)
  206. assert_equal 3, mixins(:tree_1).children.size
  207. assert mixins(:tree_1).children.include?(@extra)
  208. assert mixins(:tree_1).children.include?(mixins(:tree_2))
  209. assert mixins(:tree_1).children.include?(mixins(:tree_4))
  210. end
  211. def test_ancestors
  212. assert_equal [], mixins(:tree_1).ancestors
  213. assert_equal [mixins(:tree_1)], mixins(:tree_2).ancestors
  214. assert_equal [mixins(:tree_2), mixins(:tree_1)], mixins(:tree_3).ancestors
  215. assert_equal [mixins(:tree_1)], mixins(:tree_4).ancestors
  216. assert_equal [], mixins(:tree2_1).ancestors
  217. assert_equal [], mixins(:tree3_1).ancestors
  218. end
  219. def test_root
  220. assert_equal mixins(:tree_1), TreeMixin.root
  221. assert_equal mixins(:tree_1), mixins(:tree_1).root
  222. assert_equal mixins(:tree_1), mixins(:tree_2).root
  223. assert_equal mixins(:tree_1), mixins(:tree_3).root
  224. assert_equal mixins(:tree_1), mixins(:tree_4).root
  225. assert_equal mixins(:tree2_1), mixins(:tree2_1).root
  226. assert_equal mixins(:tree3_1), mixins(:tree3_1).root
  227. end
  228. def test_roots
  229. assert_equal [mixins(:tree_1), mixins(:tree2_1), mixins(:tree3_1)], TreeMixin.roots
  230. end
  231. def test_siblings
  232. assert_equal [mixins(:tree2_1), mixins(:tree3_1)], mixins(:tree_1).siblings
  233. assert_equal [mixins(:tree_4)], mixins(:tree_2).siblings
  234. assert_equal [], mixins(:tree_3).siblings
  235. assert_equal [mixins(:tree_2)], mixins(:tree_4).siblings
  236. assert_equal [mixins(:tree_1), mixins(:tree3_1)], mixins(:tree2_1).siblings
  237. assert_equal [mixins(:tree_1), mixins(:tree2_1)], mixins(:tree3_1).siblings
  238. end
  239. def test_self_and_siblings
  240. assert_equal [mixins(:tree_1), mixins(:tree2_1), mixins(:tree3_1)], mixins(:tree_1).self_and_siblings
  241. assert_equal [mixins(:tree_2), mixins(:tree_4)], mixins(:tree_2).self_and_siblings
  242. assert_equal [mixins(:tree_3)], mixins(:tree_3).self_and_siblings
  243. assert_equal [mixins(:tree_2), mixins(:tree_4)], mixins(:tree_4).self_and_siblings
  244. assert_equal [mixins(:tree_1), mixins(:tree2_1), mixins(:tree3_1)], mixins(:tree2_1).self_and_siblings
  245. assert_equal [mixins(:tree_1), mixins(:tree2_1), mixins(:tree3_1)], mixins(:tree3_1).self_and_siblings
  246. end
  247. end
  248. class TreeTestWithoutOrder < Test::Unit::TestCase
  249. fixtures :mixins
  250. def test_root
  251. assert [mixins(:tree_without_order_1), mixins(:tree_without_order_2)].include?(TreeMixinWithoutOrder.root)
  252. end
  253. def test_roots
  254. assert_equal [], [mixins(:tree_without_order_1), mixins(:tree_without_order_2)] - TreeMixinWithoutOrder.roots
  255. end
  256. end
  257. class TouchTest < Test::Unit::TestCase
  258. fixtures :mixins
  259. def setup
  260. Time.forced_now_time = Time.now
  261. end
  262. def teardown
  263. Time.forced_now_time = nil
  264. end
  265. def test_time_mocking
  266. five_minutes_ago = 5.minutes.ago
  267. Time.forced_now_time = five_minutes_ago
  268. assert_equal five_minutes_ago, Time.now
  269. Time.forced_now_time = nil
  270. assert_not_equal five_minutes_ago, Time.now
  271. end
  272. def test_update
  273. stamped = Mixin.new
  274. assert_nil stamped.updated_at
  275. assert_nil stamped.created_at
  276. stamped.save
  277. assert_equal Time.now, stamped.updated_at
  278. assert_equal Time.now, stamped.created_at
  279. end
  280. def test_create
  281. obj = Mixin.create
  282. assert_equal Time.now, obj.updated_at
  283. assert_equal Time.now, obj.created_at
  284. end
  285. def test_many_updates
  286. stamped = Mixin.new
  287. assert_nil stamped.updated_at
  288. assert_nil stamped.created_at
  289. stamped.save
  290. assert_equal Time.now, stamped.created_at
  291. assert_equal Time.now, stamped.updated_at
  292. old_updated_at = stamped.updated_at
  293. Time.forced_now_time = 5.minutes.from_now
  294. stamped.save
  295. assert_equal Time.now, stamped.updated_at
  296. assert_equal old_updated_at, stamped.created_at
  297. end
  298. def test_create_turned_off
  299. Mixin.record_timestamps = false
  300. assert_nil mixins(:tree_1).updated_at
  301. mixins(:tree_1).save
  302. assert_nil mixins(:tree_1).updated_at
  303. Mixin.record_timestamps = true
  304. end
  305. end
  306. class ListSubTest < Test::Unit::TestCase
  307. fixtures :mixins
  308. def test_reordering
  309. assert_equal [mixins(:list_sub_1),
  310. mixins(:list_sub_2),
  311. mixins(:list_sub_3),
  312. mixins(:list_sub_4)],
  313. ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
  314. mixins(:list_sub_2).move_lower
  315. assert_equal [mixins(:list_sub_1),
  316. mixins(:list_sub_3),
  317. mixins(:list_sub_2),
  318. mixins(:list_sub_4)],
  319. ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
  320. mixins(:list_sub_2).move_higher
  321. assert_equal [mixins(:list_sub_1),
  322. mixins(:list_sub_2),
  323. mixins(:list_sub_3),
  324. mixins(:list_sub_4)],
  325. ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
  326. mixins(:list_sub_1).move_to_bottom
  327. assert_equal [mixins(:list_sub_2),
  328. mixins(:list_sub_3),
  329. mixins(:list_sub_4),
  330. mixins(:list_sub_1)],
  331. ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
  332. mixins(:list_sub_1).move_to_top
  333. assert_equal [mixins(:list_sub_1),
  334. mixins(:list_sub_2),
  335. mixins(:list_sub_3),
  336. mixins(:list_sub_4)],
  337. ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
  338. mixins(:list_sub_2).move_to_bottom
  339. assert_equal [mixins(:list_sub_1),
  340. mixins(:list_sub_3),
  341. mixins(:list_sub_4),
  342. mixins(:list_sub_2)],
  343. ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
  344. mixins(:list_sub_4).move_to_top
  345. assert_equal [mixins(:list_sub_4),
  346. mixins(:list_sub_1),
  347. mixins(:list_sub_3),
  348. mixins(:list_sub_2)],
  349. ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
  350. end
  351. def test_move_to_bottom_with_next_to_last_item
  352. assert_equal [mixins(:list_sub_1),
  353. mixins(:list_sub_2),
  354. mixins(:list_sub_3),
  355. mixins(:list_sub_4)],
  356. ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
  357. mixins(:list_sub_3).move_to_bottom
  358. assert_equal [mixins(:list_sub_1),
  359. mixins(:list_sub_2),
  360. mixins(:list_sub_4),
  361. mixins(:list_sub_3)],
  362. ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
  363. end
  364. def test_next_prev
  365. assert_equal mixins(:list_sub_2), mixins(:list_sub_1).lower_item
  366. assert_nil mixins(:list_sub_1).higher_item
  367. assert_equal mixins(:list_sub_3), mixins(:list_sub_4).higher_item
  368. assert_nil mixins(:list_sub_4).lower_item
  369. end
  370. def test_injection
  371. item = ListMixin.new("parent_id"=>1)
  372. assert_equal "parent_id = 1", item.scope_condition
  373. assert_equal "pos", item.position_column
  374. end
  375. def test_insert_at
  376. new = ListMixin.create("parent_id" => 20)
  377. assert_equal 1, new.pos
  378. new = ListMixinSub1.create("parent_id" => 20)
  379. assert_equal 2, new.pos
  380. new = ListMixinSub2.create("parent_id" => 20)
  381. assert_equal 3, new.pos
  382. new4 = ListMixin.create("parent_id" => 20)
  383. assert_equal 4, new4.pos
  384. new4.insert_at(3)
  385. assert_equal 3, new4.pos
  386. new.reload
  387. assert_equal 4, new.pos
  388. new.insert_at(2)
  389. assert_equal 2, new.pos
  390. new4.reload
  391. assert_equal 4, new4.pos
  392. new5 = ListMixinSub1.create("parent_id" => 20)
  393. assert_equal 5, new5.pos
  394. new5.insert_at(1)
  395. assert_equal 1, new5.pos
  396. new4.reload
  397. assert_equal 5, new4.pos
  398. end
  399. def test_delete_middle
  400. assert_equal [mixins(:list_sub_1),
  401. mixins(:list_sub_2),
  402. mixins(:list_sub_3),
  403. mixins(:list_sub_4)],
  404. ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
  405. mixins(:list_sub_2).destroy
  406. assert_equal [mixins(:list_sub_1, :reload),
  407. mixins(:list_sub_3, :reload),
  408. mixins(:list_sub_4, :reload)],
  409. ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
  410. assert_equal 1, mixins(:list_sub_1).pos
  411. assert_equal 2, mixins(:list_sub_3).pos
  412. assert_equal 3, mixins(:list_sub_4).pos
  413. mixins(:list_sub_1).destroy
  414. assert_equal [mixins(:list_sub_3, :reload),
  415. mixins(:list_sub_4, :reload)],
  416. ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
  417. assert_equal 1, mixins(:list_sub_3).pos
  418. assert_equal 2, mixins(:list_sub_4).pos
  419. end
  420. end