To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

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