annotate lib/plugins/acts_as_versioned/test/versioned_test.rb @ 1517:dffacf8a6908 redmine-2.5

Update to Redmine SVN revision 13367 on 2.5-stable branch
author Chris Cannam
date Tue, 09 Sep 2014 09:29:00 +0100
parents 433d4f72a19b
children
rev   line source
Chris@0 1 require File.join(File.dirname(__FILE__), 'abstract_unit')
Chris@0 2 require File.join(File.dirname(__FILE__), 'fixtures/page')
Chris@0 3 require File.join(File.dirname(__FILE__), 'fixtures/widget')
Chris@0 4
Chris@0 5 class VersionedTest < Test::Unit::TestCase
Chris@0 6 fixtures :pages, :page_versions, :locked_pages, :locked_pages_revisions, :authors, :landmarks, :landmark_versions
Chris@0 7 set_fixture_class :page_versions => Page::Version
Chris@0 8
Chris@0 9 def test_saves_versioned_copy
Chris@0 10 p = Page.create! :title => 'first title', :body => 'first body'
Chris@0 11 assert !p.new_record?
Chris@0 12 assert_equal 1, p.versions.size
Chris@0 13 assert_equal 1, p.version
Chris@0 14 assert_instance_of Page.versioned_class, p.versions.first
Chris@0 15 end
Chris@0 16
Chris@0 17 def test_saves_without_revision
Chris@0 18 p = pages(:welcome)
Chris@0 19 old_versions = p.versions.count
Chris@0 20
Chris@0 21 p.save_without_revision
Chris@0 22
Chris@0 23 p.without_revision do
Chris@0 24 p.update_attributes :title => 'changed'
Chris@0 25 end
Chris@0 26
Chris@0 27 assert_equal old_versions, p.versions.count
Chris@0 28 end
Chris@0 29
Chris@0 30 def test_rollback_with_version_number
Chris@0 31 p = pages(:welcome)
Chris@0 32 assert_equal 24, p.version
Chris@0 33 assert_equal 'Welcome to the weblog', p.title
Chris@0 34
Chris@0 35 assert p.revert_to!(p.versions.first.version), "Couldn't revert to 23"
Chris@0 36 assert_equal 23, p.version
Chris@0 37 assert_equal 'Welcome to the weblg', p.title
Chris@0 38 end
Chris@0 39
Chris@0 40 def test_versioned_class_name
Chris@0 41 assert_equal 'Version', Page.versioned_class_name
Chris@0 42 assert_equal 'LockedPageRevision', LockedPage.versioned_class_name
Chris@0 43 end
Chris@0 44
Chris@0 45 def test_versioned_class
Chris@0 46 assert_equal Page::Version, Page.versioned_class
Chris@0 47 assert_equal LockedPage::LockedPageRevision, LockedPage.versioned_class
Chris@0 48 end
Chris@0 49
Chris@0 50 def test_special_methods
Chris@0 51 assert_nothing_raised { pages(:welcome).feeling_good? }
Chris@0 52 assert_nothing_raised { pages(:welcome).versions.first.feeling_good? }
Chris@0 53 assert_nothing_raised { locked_pages(:welcome).hello_world }
Chris@0 54 assert_nothing_raised { locked_pages(:welcome).versions.first.hello_world }
Chris@0 55 end
Chris@0 56
Chris@0 57 def test_rollback_with_version_class
Chris@0 58 p = pages(:welcome)
Chris@0 59 assert_equal 24, p.version
Chris@0 60 assert_equal 'Welcome to the weblog', p.title
Chris@0 61
Chris@0 62 assert p.revert_to!(p.versions.first), "Couldn't revert to 23"
Chris@0 63 assert_equal 23, p.version
Chris@0 64 assert_equal 'Welcome to the weblg', p.title
Chris@0 65 end
Chris@0 66
Chris@0 67 def test_rollback_fails_with_invalid_revision
Chris@0 68 p = locked_pages(:welcome)
Chris@0 69 assert !p.revert_to!(locked_pages(:thinking))
Chris@0 70 end
Chris@0 71
Chris@0 72 def test_saves_versioned_copy_with_options
Chris@0 73 p = LockedPage.create! :title => 'first title'
Chris@0 74 assert !p.new_record?
Chris@0 75 assert_equal 1, p.versions.size
Chris@0 76 assert_instance_of LockedPage.versioned_class, p.versions.first
Chris@0 77 end
Chris@0 78
Chris@0 79 def test_rollback_with_version_number_with_options
Chris@0 80 p = locked_pages(:welcome)
Chris@0 81 assert_equal 'Welcome to the weblog', p.title
Chris@0 82 assert_equal 'LockedPage', p.versions.first.version_type
Chris@0 83
Chris@0 84 assert p.revert_to!(p.versions.first.version), "Couldn't revert to 23"
Chris@0 85 assert_equal 'Welcome to the weblg', p.title
Chris@0 86 assert_equal 'LockedPage', p.versions.first.version_type
Chris@0 87 end
Chris@0 88
Chris@0 89 def test_rollback_with_version_class_with_options
Chris@0 90 p = locked_pages(:welcome)
Chris@0 91 assert_equal 'Welcome to the weblog', p.title
Chris@0 92 assert_equal 'LockedPage', p.versions.first.version_type
Chris@0 93
Chris@0 94 assert p.revert_to!(p.versions.first), "Couldn't revert to 1"
Chris@0 95 assert_equal 'Welcome to the weblg', p.title
Chris@0 96 assert_equal 'LockedPage', p.versions.first.version_type
Chris@0 97 end
Chris@0 98
Chris@0 99 def test_saves_versioned_copy_with_sti
Chris@0 100 p = SpecialLockedPage.create! :title => 'first title'
Chris@0 101 assert !p.new_record?
Chris@0 102 assert_equal 1, p.versions.size
Chris@0 103 assert_instance_of LockedPage.versioned_class, p.versions.first
Chris@0 104 assert_equal 'SpecialLockedPage', p.versions.first.version_type
Chris@0 105 end
Chris@0 106
Chris@0 107 def test_rollback_with_version_number_with_sti
Chris@0 108 p = locked_pages(:thinking)
Chris@0 109 assert_equal 'So I was thinking', p.title
Chris@0 110
Chris@0 111 assert p.revert_to!(p.versions.first.version), "Couldn't revert to 1"
Chris@0 112 assert_equal 'So I was thinking!!!', p.title
Chris@0 113 assert_equal 'SpecialLockedPage', p.versions.first.version_type
Chris@0 114 end
Chris@0 115
Chris@0 116 def test_lock_version_works_with_versioning
Chris@0 117 p = locked_pages(:thinking)
Chris@0 118 p2 = LockedPage.find(p.id)
Chris@0 119
Chris@0 120 p.title = 'fresh title'
Chris@0 121 p.save
Chris@0 122 assert_equal 2, p.versions.size # limit!
Chris@0 123
Chris@0 124 assert_raises(ActiveRecord::StaleObjectError) do
Chris@0 125 p2.title = 'stale title'
Chris@0 126 p2.save
Chris@0 127 end
Chris@0 128 end
Chris@0 129
Chris@0 130 def test_version_if_condition
Chris@0 131 p = Page.create! :title => "title"
Chris@0 132 assert_equal 1, p.version
Chris@0 133
Chris@0 134 Page.feeling_good = false
Chris@0 135 p.save
Chris@0 136 assert_equal 1, p.version
Chris@0 137 Page.feeling_good = true
Chris@0 138 end
Chris@0 139
Chris@0 140 def test_version_if_condition2
Chris@0 141 # set new if condition
Chris@0 142 Page.class_eval do
Chris@0 143 def new_feeling_good() title[0..0] == 'a'; end
Chris@0 144 alias_method :old_feeling_good, :feeling_good?
Chris@0 145 alias_method :feeling_good?, :new_feeling_good
Chris@0 146 end
Chris@0 147
Chris@0 148 p = Page.create! :title => "title"
Chris@0 149 assert_equal 1, p.version # version does not increment
Chris@0 150 assert_equal 1, p.versions(true).size
Chris@0 151
Chris@0 152 p.update_attributes(:title => 'new title')
Chris@0 153 assert_equal 1, p.version # version does not increment
Chris@0 154 assert_equal 1, p.versions(true).size
Chris@0 155
Chris@0 156 p.update_attributes(:title => 'a title')
Chris@0 157 assert_equal 2, p.version
Chris@0 158 assert_equal 2, p.versions(true).size
Chris@0 159
Chris@0 160 # reset original if condition
Chris@0 161 Page.class_eval { alias_method :feeling_good?, :old_feeling_good }
Chris@0 162 end
Chris@0 163
Chris@0 164 def test_version_if_condition_with_block
Chris@0 165 # set new if condition
Chris@0 166 old_condition = Page.version_condition
Chris@0 167 Page.version_condition = Proc.new { |page| page.title[0..0] == 'b' }
Chris@0 168
Chris@0 169 p = Page.create! :title => "title"
Chris@0 170 assert_equal 1, p.version # version does not increment
Chris@0 171 assert_equal 1, p.versions(true).size
Chris@0 172
Chris@0 173 p.update_attributes(:title => 'a title')
Chris@0 174 assert_equal 1, p.version # version does not increment
Chris@0 175 assert_equal 1, p.versions(true).size
Chris@0 176
Chris@0 177 p.update_attributes(:title => 'b title')
Chris@0 178 assert_equal 2, p.version
Chris@0 179 assert_equal 2, p.versions(true).size
Chris@0 180
Chris@0 181 # reset original if condition
Chris@0 182 Page.version_condition = old_condition
Chris@0 183 end
Chris@0 184
Chris@0 185 def test_version_no_limit
Chris@0 186 p = Page.create! :title => "title", :body => 'first body'
Chris@0 187 p.save
Chris@0 188 p.save
Chris@0 189 5.times do |i|
Chris@0 190 assert_page_title p, i
Chris@0 191 end
Chris@0 192 end
Chris@0 193
Chris@0 194 def test_version_max_limit
Chris@0 195 p = LockedPage.create! :title => "title"
Chris@0 196 p.update_attributes(:title => "title1")
Chris@0 197 p.update_attributes(:title => "title2")
Chris@0 198 5.times do |i|
Chris@0 199 assert_page_title p, i, :lock_version
Chris@0 200 assert p.versions(true).size <= 2, "locked version can only store 2 versions"
Chris@0 201 end
Chris@0 202 end
Chris@0 203
Chris@0 204 def test_track_altered_attributes_default_value
Chris@0 205 assert !Page.track_altered_attributes
Chris@0 206 assert LockedPage.track_altered_attributes
Chris@0 207 assert SpecialLockedPage.track_altered_attributes
Chris@0 208 end
Chris@0 209
Chris@0 210 def test_version_order
Chris@0 211 assert_equal 23, pages(:welcome).versions.first.version
Chris@0 212 assert_equal 24, pages(:welcome).versions.last.version
Chris@0 213 end
Chris@0 214
Chris@0 215 def test_track_altered_attributes
Chris@0 216 p = LockedPage.create! :title => "title"
Chris@0 217 assert_equal 1, p.lock_version
Chris@0 218 assert_equal 1, p.versions(true).size
Chris@0 219
Chris@0 220 p.title = 'title'
Chris@0 221 assert !p.save_version?
Chris@0 222 p.save
Chris@0 223 assert_equal 2, p.lock_version # still increments version because of optimistic locking
Chris@0 224 assert_equal 1, p.versions(true).size
Chris@0 225
Chris@0 226 p.title = 'updated title'
Chris@0 227 assert p.save_version?
Chris@0 228 p.save
Chris@0 229 assert_equal 3, p.lock_version
Chris@0 230 assert_equal 1, p.versions(true).size # version 1 deleted
Chris@0 231
Chris@0 232 p.title = 'updated title!'
Chris@0 233 assert p.save_version?
Chris@0 234 p.save
Chris@0 235 assert_equal 4, p.lock_version
Chris@0 236 assert_equal 2, p.versions(true).size # version 1 deleted
Chris@0 237 end
Chris@0 238
Chris@0 239 def assert_page_title(p, i, version_field = :version)
Chris@0 240 p.title = "title#{i}"
Chris@0 241 p.save
Chris@0 242 assert_equal "title#{i}", p.title
Chris@0 243 assert_equal (i+4), p.send(version_field)
Chris@0 244 end
Chris@0 245
Chris@0 246 def test_find_versions
Chris@0 247 assert_equal 2, locked_pages(:welcome).versions.size
Chris@0 248 assert_equal 1, locked_pages(:welcome).versions.find(:all, :conditions => ['title LIKE ?', '%weblog%']).length
Chris@0 249 assert_equal 2, locked_pages(:welcome).versions.find(:all, :conditions => ['title LIKE ?', '%web%']).length
Chris@0 250 assert_equal 0, locked_pages(:thinking).versions.find(:all, :conditions => ['title LIKE ?', '%web%']).length
Chris@0 251 assert_equal 2, locked_pages(:welcome).versions.length
Chris@0 252 end
Chris@0 253
Chris@0 254 def test_find_version
Chris@0 255 assert_equal page_versions(:welcome_1), Page.find_version(pages(:welcome).id, 23)
Chris@0 256 assert_equal page_versions(:welcome_2), Page.find_version(pages(:welcome).id, 24)
Chris@0 257 assert_equal pages(:welcome), Page.find_version(pages(:welcome).id)
Chris@0 258
Chris@0 259 assert_equal page_versions(:welcome_1), pages(:welcome).find_version(23)
Chris@0 260 assert_equal page_versions(:welcome_2), pages(:welcome).find_version(24)
Chris@0 261 assert_equal pages(:welcome), pages(:welcome).find_version
Chris@0 262
Chris@0 263 assert_raise(ActiveRecord::RecordNotFound) { Page.find_version(pages(:welcome).id, 1) }
Chris@0 264 assert_raise(ActiveRecord::RecordNotFound) { Page.find_version(0, 23) }
Chris@0 265 end
Chris@0 266
Chris@0 267 def test_with_sequence
Chris@0 268 assert_equal 'widgets_seq', Widget.versioned_class.sequence_name
Chris@0 269 3.times { Widget.create! :name => 'new widget' }
Chris@0 270 assert_equal 3, Widget.count
Chris@0 271 assert_equal 3, Widget.versioned_class.count
Chris@0 272 end
Chris@0 273
Chris@0 274 def test_has_many_through
Chris@0 275 assert_equal [authors(:caged), authors(:mly)], pages(:welcome).authors
Chris@0 276 end
Chris@0 277
Chris@0 278 def test_has_many_through_with_custom_association
Chris@0 279 assert_equal [authors(:caged), authors(:mly)], pages(:welcome).revisors
Chris@0 280 end
Chris@0 281
Chris@0 282 def test_referential_integrity
Chris@0 283 pages(:welcome).destroy
Chris@0 284 assert_equal 0, Page.count
Chris@0 285 assert_equal 0, Page::Version.count
Chris@0 286 end
Chris@0 287
Chris@0 288 def test_association_options
Chris@0 289 association = Page.reflect_on_association(:versions)
Chris@0 290 options = association.options
Chris@0 291 assert_equal :delete_all, options[:dependent]
Chris@0 292 assert_equal 'version', options[:order]
Chris@0 293
Chris@0 294 association = Widget.reflect_on_association(:versions)
Chris@0 295 options = association.options
Chris@0 296 assert_equal :nullify, options[:dependent]
Chris@0 297 assert_equal 'version desc', options[:order]
Chris@0 298 assert_equal 'widget_id', options[:foreign_key]
Chris@0 299
Chris@0 300 widget = Widget.create! :name => 'new widget'
Chris@0 301 assert_equal 1, Widget.count
Chris@0 302 assert_equal 1, Widget.versioned_class.count
Chris@0 303 widget.destroy
Chris@0 304 assert_equal 0, Widget.count
Chris@0 305 assert_equal 1, Widget.versioned_class.count
Chris@0 306 end
Chris@0 307
Chris@0 308 def test_versioned_records_should_belong_to_parent
Chris@0 309 page = pages(:welcome)
Chris@0 310 page_version = page.versions.last
Chris@0 311 assert_equal page, page_version.page
Chris@0 312 end
Chris@0 313
Chris@0 314 def test_unaltered_attributes
Chris@0 315 landmarks(:washington).attributes = landmarks(:washington).attributes.except("id")
Chris@0 316 assert !landmarks(:washington).changed?
Chris@0 317 end
Chris@0 318
Chris@0 319 def test_unchanged_string_attributes
Chris@0 320 landmarks(:washington).attributes = landmarks(:washington).attributes.except("id").inject({}) { |params, (key, value)| params.update(key => value.to_s) }
Chris@0 321 assert !landmarks(:washington).changed?
Chris@0 322 end
Chris@0 323
Chris@0 324 def test_should_find_earliest_version
Chris@0 325 assert_equal page_versions(:welcome_1), pages(:welcome).versions.earliest
Chris@0 326 end
Chris@0 327
Chris@0 328 def test_should_find_latest_version
Chris@0 329 assert_equal page_versions(:welcome_2), pages(:welcome).versions.latest
Chris@0 330 end
Chris@0 331
Chris@0 332 def test_should_find_previous_version
Chris@0 333 assert_equal page_versions(:welcome_1), page_versions(:welcome_2).previous
Chris@0 334 assert_equal page_versions(:welcome_1), pages(:welcome).versions.before(page_versions(:welcome_2))
Chris@0 335 end
Chris@0 336
Chris@0 337 def test_should_find_next_version
Chris@0 338 assert_equal page_versions(:welcome_2), page_versions(:welcome_1).next
Chris@0 339 assert_equal page_versions(:welcome_2), pages(:welcome).versions.after(page_versions(:welcome_1))
Chris@0 340 end
Chris@0 341
Chris@0 342 def test_should_find_version_count
Chris@0 343 assert_equal 24, pages(:welcome).versions_count
Chris@0 344 assert_equal 24, page_versions(:welcome_1).versions_count
Chris@0 345 assert_equal 24, page_versions(:welcome_2).versions_count
Chris@0 346 end
Chris@0 347 end