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 |