PageRenderTime 46ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/vendor/plugins/acts_as_versioned/test/versioned_test.rb

http://wookiewiki.googlecode.com/
Ruby | 238 lines | 227 code | 11 blank | 0 comment | 0 complexity | 3aeef93fac346b303c34badc1e7a7398 MD5 | raw file
  1. require 'abstract_unit'
  2. require 'fixtures/page'
  3. require 'fixtures/widget'
  4. class VersionedTest < Test::Unit::TestCase
  5. fixtures :pages, :page_versions, :locked_pages, :locked_pages_revisions
  6. def test_saves_versioned_copy
  7. p = Page.create :title => 'first title', :body => 'first body'
  8. assert !p.new_record?
  9. assert_equal 1, p.versions.size
  10. assert_equal 1, p.version
  11. assert_instance_of Page.versioned_class, p.versions.first
  12. end
  13. def test_rollback_with_version_number
  14. p = pages(:welcome)
  15. assert_equal 24, p.version
  16. assert_equal 'Welcome to the weblog', p.title
  17. assert p.revert_to!(p.versions.first.version), "Couldn't revert to 23"
  18. assert_equal 23, p.version
  19. assert_equal 'Welcome to the weblg', p.title
  20. end
  21. def test_versioned_class_name
  22. assert_equal 'PageVersion', Page.versioned_class_name
  23. assert_equal 'LockedPageRevision', LockedPage.versioned_class_name
  24. end
  25. def test_rollback_with_version_class
  26. p = pages(:welcome)
  27. assert_equal 24, p.version
  28. assert_equal 'Welcome to the weblog', p.title
  29. assert p.revert_to!(p.versions.first), "Couldn't revert to 23"
  30. assert_equal 23, p.version
  31. assert_equal 'Welcome to the weblg', p.title
  32. end
  33. def test_rollback_fails_with_invalid_revision
  34. p = locked_pages(:welcome)
  35. assert !p.revert_to!(locked_pages(:thinking))
  36. end
  37. def test_saves_versioned_copy_with_options
  38. p = LockedPage.create :title => 'first title'
  39. assert !p.new_record?
  40. assert_equal 1, p.versions.size
  41. assert_instance_of LockedPage.versioned_class, p.versions.first
  42. end
  43. def test_rollback_with_version_number_with_options
  44. p = locked_pages(:welcome)
  45. assert_equal 'Welcome to the weblog', p.title
  46. assert_equal 'LockedPage', p.versions.first.version_type
  47. assert p.revert_to!(p.versions.first.version), "Couldn't revert to 23"
  48. assert_equal 'Welcome to the weblg', p.title
  49. assert_equal 'LockedPage', p.versions.first.version_type
  50. end
  51. def test_rollback_with_version_class_with_options
  52. p = locked_pages(:welcome)
  53. assert_equal 'Welcome to the weblog', p.title
  54. assert_equal 'LockedPage', p.versions.first.version_type
  55. assert p.revert_to!(p.versions.first), "Couldn't revert to 1"
  56. assert_equal 'Welcome to the weblg', p.title
  57. assert_equal 'LockedPage', p.versions.first.version_type
  58. end
  59. def test_saves_versioned_copy_with_sti
  60. p = SpecialLockedPage.create :title => 'first title'
  61. assert !p.new_record?
  62. assert_equal 1, p.versions.size
  63. assert_instance_of LockedPage.versioned_class, p.versions.first
  64. assert_equal 'SpecialLockedPage', p.versions.first.version_type
  65. end
  66. def test_rollback_with_version_number_with_sti
  67. p = locked_pages(:thinking)
  68. assert_equal 'So I was thinking', p.title
  69. assert p.revert_to!(p.versions.first.version), "Couldn't revert to 1"
  70. assert_equal 'So I was thinking!!!', p.title
  71. assert_equal 'SpecialLockedPage', p.versions.first.version_type
  72. end
  73. def test_lock_version_works_with_versioning
  74. p = locked_pages(:thinking)
  75. p2 = LockedPage.find(p.id)
  76. p.title = 'fresh title'
  77. p.save
  78. assert_equal 2, p.versions.size # limit!
  79. assert_raises(ActiveRecord::StaleObjectError) do
  80. p2.title = 'stale title'
  81. p2.save
  82. end
  83. end
  84. def test_version_if_condition
  85. p = Page.create :title => "title"
  86. assert_equal 1, p.version
  87. Page.feeling_good = false
  88. p.save
  89. assert_equal 1, p.version
  90. Page.feeling_good = true
  91. end
  92. def test_version_if_condition2
  93. # set new if condition
  94. Page.class_eval do
  95. def new_feeling_good() title[0..0] == 'a'; end
  96. alias_method :old_feeling_good, :feeling_good?
  97. alias_method :feeling_good?, :new_feeling_good
  98. end
  99. p = Page.create :title => "title"
  100. assert_equal 1, p.version # version does not increment
  101. assert_equal 1, p.versions(true).size
  102. p.update_attributes(:title => 'new title')
  103. assert_equal 1, p.version # version does not increment
  104. assert_equal 1, p.versions(true).size
  105. p.update_attributes(:title => 'a title')
  106. assert_equal 2, p.version
  107. assert_equal 2, p.versions(true).size
  108. # reset original if condition
  109. Page.class_eval { alias_method :feeling_good?, :old_feeling_good }
  110. end
  111. def test_version_if_condition_with_block
  112. # set new if condition
  113. old_condition = Page.version_condition
  114. Page.version_condition = Proc.new { |page| page.title[0..0] == 'b' }
  115. p = Page.create :title => "title"
  116. assert_equal 1, p.version # version does not increment
  117. assert_equal 1, p.versions(true).size
  118. p.update_attributes(:title => 'a title')
  119. assert_equal 1, p.version # version does not increment
  120. assert_equal 1, p.versions(true).size
  121. p.update_attributes(:title => 'b title')
  122. assert_equal 2, p.version
  123. assert_equal 2, p.versions(true).size
  124. # reset original if condition
  125. Page.version_condition = old_condition
  126. end
  127. def test_version_no_limit
  128. p = Page.create :title => "title", :body => 'first body'
  129. p.save
  130. p.save
  131. 5.times do |i|
  132. assert_page_title p, i
  133. end
  134. end
  135. def test_version_max_limit
  136. p = LockedPage.create :title => "title"
  137. p.update_attributes(:title => "title1")
  138. p.update_attributes(:title => "title2")
  139. 5.times do |i|
  140. assert_page_title p, i, :lock_version
  141. assert p.versions(true).size <= 2, "locked version can only store 2 versions"
  142. end
  143. end
  144. def test_track_changed_attributes_default_value
  145. assert !Page.track_changed_attributes
  146. assert LockedPage.track_changed_attributes
  147. assert SpecialLockedPage.track_changed_attributes
  148. end
  149. def test_version_order
  150. assert_equal 23, pages(:welcome).versions.first.version
  151. assert_equal 24, pages(:welcome).versions.last.version
  152. assert_equal 23, pages(:welcome).find_versions.first.version
  153. assert_equal 24, pages(:welcome).find_versions.last.version
  154. end
  155. def test_track_changed_attributes
  156. p = LockedPage.create :title => "title"
  157. assert_equal 1, p.lock_version
  158. assert_equal 1, p.versions(true).size
  159. p.title = 'title'
  160. assert !p.save_version?
  161. p.save
  162. assert_equal 2, p.lock_version # still increments version because of optimistic locking
  163. assert_equal 1, p.versions(true).size
  164. p.title = 'updated title'
  165. assert p.save_version?
  166. p.save
  167. assert_equal 3, p.lock_version
  168. assert_equal 1, p.versions(true).size # version 1 deleted
  169. p.title = 'updated title!'
  170. assert p.save_version?
  171. p.save
  172. assert_equal 4, p.lock_version
  173. assert_equal 2, p.versions(true).size # version 1 deleted
  174. end
  175. def assert_page_title(p, i, version_field = :version)
  176. p.title = "title#{i}"
  177. p.save
  178. assert_equal "title#{i}", p.title
  179. assert_equal (i+4), p.send(version_field)
  180. end
  181. def test_find_versions
  182. assert_equal 2, locked_pages(:welcome).versions.size
  183. assert_equal 1, locked_pages(:welcome).find_versions(:conditions => ['title LIKE ?', '%weblog%']).length
  184. assert_equal 2, locked_pages(:welcome).find_versions(:conditions => ['title LIKE ?', '%web%']).length
  185. assert_equal 0, locked_pages(:thinking).find_versions(:conditions => ['title LIKE ?', '%web%']).length
  186. assert_equal 2, locked_pages(:welcome).find_versions.length
  187. end
  188. def test_with_sequence
  189. assert_equal 'widgets_seq', Widget.versioned_class.sequence_name
  190. Widget.create :name => 'new widget'
  191. Widget.create :name => 'new widget'
  192. Widget.create :name => 'new widget'
  193. assert_equal 3, Widget.count
  194. assert_equal 3, Widget.versions.size
  195. end
  196. end