comparison .svn/pristine/26/26b129aaf0142d0284cf85c4dcc060c09b8d918d.svn-base @ 909:cbb26bc654de redmine-1.3

Update to Redmine 1.3-stable branch (Redmine SVN rev 8964)
author Chris Cannam
date Fri, 24 Feb 2012 19:09:32 +0000
parents
children
comparison
equal deleted inserted replaced
908:c6c2cbd0afee 909:cbb26bc654de
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