annotate .svn/pristine/26/26b129aaf0142d0284cf85c4dcc060c09b8d918d.svn-base @ 1519:afce8026aaeb redmine-2.4-integration

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