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