paper_trail 4.0.0 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CONTRIBUTING.md +105 -0
  3. data/.github/ISSUE_TEMPLATE.md +13 -0
  4. data/.gitignore +2 -0
  5. data/.rubocop.yml +100 -0
  6. data/.rubocop_todo.yml +14 -0
  7. data/.travis.yml +11 -10
  8. data/Appraisals +37 -0
  9. data/CHANGELOG.md +173 -8
  10. data/Gemfile +1 -1
  11. data/README.md +641 -470
  12. data/Rakefile +19 -19
  13. data/doc/bug_report_template.rb +71 -0
  14. data/doc/warning_about_not_setting_whodunnit.md +32 -0
  15. data/gemfiles/ar3.gemfile +18 -0
  16. data/gemfiles/ar4.gemfile +7 -0
  17. data/gemfiles/ar5.gemfile +13 -0
  18. data/lib/generators/paper_trail/install_generator.rb +26 -18
  19. data/lib/generators/paper_trail/templates/add_object_changes_to_versions.rb +3 -1
  20. data/lib/generators/paper_trail/templates/add_transaction_id_column_to_versions.rb +2 -0
  21. data/lib/generators/paper_trail/templates/create_version_associations.rb +9 -4
  22. data/lib/generators/paper_trail/templates/create_versions.rb +53 -5
  23. data/lib/paper_trail/attribute_serializers/README.md +10 -0
  24. data/lib/paper_trail/attribute_serializers/cast_attribute_serializer.rb +58 -0
  25. data/lib/paper_trail/attribute_serializers/legacy_active_record_shim.rb +48 -0
  26. data/lib/paper_trail/attribute_serializers/object_attribute.rb +39 -0
  27. data/lib/paper_trail/attribute_serializers/object_changes_attribute.rb +42 -0
  28. data/lib/paper_trail/cleaner.rb +41 -18
  29. data/lib/paper_trail/config.rb +42 -26
  30. data/lib/paper_trail/frameworks/active_record/models/paper_trail/version.rb +5 -1
  31. data/lib/paper_trail/frameworks/active_record/models/paper_trail/version_association.rb +6 -2
  32. data/lib/paper_trail/frameworks/active_record.rb +2 -2
  33. data/lib/paper_trail/frameworks/cucumber.rb +1 -0
  34. data/lib/paper_trail/frameworks/rails/controller.rb +50 -14
  35. data/lib/paper_trail/frameworks/rails/engine.rb +6 -1
  36. data/lib/paper_trail/frameworks/rails.rb +2 -7
  37. data/lib/paper_trail/frameworks/rspec/helpers.rb +3 -1
  38. data/lib/paper_trail/frameworks/rspec.rb +5 -5
  39. data/lib/paper_trail/frameworks/sinatra.rb +8 -5
  40. data/lib/paper_trail/has_paper_trail.rb +381 -221
  41. data/lib/paper_trail/record_history.rb +57 -0
  42. data/lib/paper_trail/reifier.rb +450 -0
  43. data/lib/paper_trail/serializers/json.rb +7 -7
  44. data/lib/paper_trail/serializers/yaml.rb +31 -12
  45. data/lib/paper_trail/version_association_concern.rb +6 -2
  46. data/lib/paper_trail/version_concern.rb +200 -287
  47. data/lib/paper_trail/version_number.rb +6 -9
  48. data/lib/paper_trail.rb +169 -137
  49. data/paper_trail.gemspec +41 -43
  50. data/spec/generators/install_generator_spec.rb +24 -25
  51. data/spec/generators/paper_trail/templates/create_versions_spec.rb +51 -0
  52. data/spec/models/animal_spec.rb +23 -6
  53. data/spec/models/boolit_spec.rb +8 -8
  54. data/spec/models/callback_modifier_spec.rb +96 -0
  55. data/spec/models/car_spec.rb +13 -0
  56. data/spec/models/fluxor_spec.rb +3 -3
  57. data/spec/models/gadget_spec.rb +19 -19
  58. data/spec/models/joined_version_spec.rb +3 -3
  59. data/spec/models/json_version_spec.rb +50 -28
  60. data/spec/models/kitchen/banana_spec.rb +3 -3
  61. data/spec/models/not_on_update_spec.rb +7 -4
  62. data/spec/models/post_with_status_spec.rb +13 -3
  63. data/spec/models/skipper_spec.rb +40 -11
  64. data/spec/models/thing_spec.rb +4 -4
  65. data/spec/models/truck_spec.rb +5 -0
  66. data/spec/models/vehicle_spec.rb +5 -0
  67. data/spec/models/version_spec.rb +103 -59
  68. data/spec/models/widget_spec.rb +86 -55
  69. data/spec/modules/paper_trail_spec.rb +2 -2
  70. data/spec/modules/version_concern_spec.rb +11 -12
  71. data/spec/modules/version_number_spec.rb +3 -4
  72. data/spec/paper_trail/config_spec.rb +33 -0
  73. data/spec/paper_trail_spec.rb +16 -14
  74. data/spec/rails_helper.rb +10 -9
  75. data/spec/requests/articles_spec.rb +11 -7
  76. data/spec/spec_helper.rb +42 -17
  77. data/spec/support/alt_db_init.rb +8 -13
  78. data/test/custom_json_serializer.rb +3 -3
  79. data/test/dummy/Rakefile +2 -2
  80. data/test/dummy/app/controllers/application_controller.rb +21 -8
  81. data/test/dummy/app/controllers/articles_controller.rb +11 -8
  82. data/test/dummy/app/controllers/widgets_controller.rb +13 -12
  83. data/test/dummy/app/models/animal.rb +1 -1
  84. data/test/dummy/app/models/article.rb +19 -11
  85. data/test/dummy/app/models/authorship.rb +1 -1
  86. data/test/dummy/app/models/bar_habtm.rb +4 -0
  87. data/test/dummy/app/models/book.rb +4 -4
  88. data/test/dummy/app/models/boolit.rb +1 -1
  89. data/test/dummy/app/models/callback_modifier.rb +45 -0
  90. data/test/dummy/app/models/car.rb +3 -0
  91. data/test/dummy/app/models/chapter.rb +9 -0
  92. data/test/dummy/app/models/citation.rb +5 -0
  93. data/test/dummy/app/models/customer.rb +1 -1
  94. data/test/dummy/app/models/document.rb +2 -2
  95. data/test/dummy/app/models/editor.rb +1 -1
  96. data/test/dummy/app/models/foo_habtm.rb +5 -0
  97. data/test/dummy/app/models/fruit.rb +2 -2
  98. data/test/dummy/app/models/gadget.rb +1 -1
  99. data/test/dummy/app/models/kitchen/banana.rb +1 -1
  100. data/test/dummy/app/models/legacy_widget.rb +2 -2
  101. data/test/dummy/app/models/line_item.rb +1 -1
  102. data/test/dummy/app/models/not_on_update.rb +1 -1
  103. data/test/dummy/app/models/paragraph.rb +5 -0
  104. data/test/dummy/app/models/person.rb +6 -6
  105. data/test/dummy/app/models/post.rb +1 -1
  106. data/test/dummy/app/models/post_with_status.rb +1 -1
  107. data/test/dummy/app/models/quotation.rb +5 -0
  108. data/test/dummy/app/models/section.rb +6 -0
  109. data/test/dummy/app/models/skipper.rb +2 -2
  110. data/test/dummy/app/models/song.rb +13 -4
  111. data/test/dummy/app/models/thing.rb +2 -2
  112. data/test/dummy/app/models/translation.rb +2 -2
  113. data/test/dummy/app/models/truck.rb +4 -0
  114. data/test/dummy/app/models/vehicle.rb +4 -0
  115. data/test/dummy/app/models/whatchamajigger.rb +1 -1
  116. data/test/dummy/app/models/widget.rb +7 -6
  117. data/test/dummy/app/versions/joined_version.rb +4 -3
  118. data/test/dummy/app/versions/json_version.rb +1 -1
  119. data/test/dummy/app/versions/kitchen/banana_version.rb +1 -1
  120. data/test/dummy/app/versions/post_version.rb +2 -2
  121. data/test/dummy/config/application.rb +20 -9
  122. data/test/dummy/config/boot.rb +5 -5
  123. data/test/dummy/config/database.postgres.yml +1 -1
  124. data/test/dummy/config/environment.rb +1 -1
  125. data/test/dummy/config/environments/development.rb +4 -3
  126. data/test/dummy/config/environments/production.rb +3 -2
  127. data/test/dummy/config/environments/test.rb +15 -5
  128. data/test/dummy/config/initializers/backtrace_silencers.rb +4 -2
  129. data/test/dummy/config/initializers/paper_trail.rb +4 -3
  130. data/test/dummy/config/initializers/secret_token.rb +3 -1
  131. data/test/dummy/config/initializers/session_store.rb +1 -1
  132. data/test/dummy/config/routes.rb +2 -2
  133. data/test/dummy/config.ru +1 -1
  134. data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +148 -68
  135. data/test/dummy/db/schema.rb +119 -31
  136. data/test/dummy/script/rails +6 -4
  137. data/test/functional/controller_test.rb +34 -35
  138. data/test/functional/enabled_for_controller_test.rb +6 -7
  139. data/test/functional/modular_sinatra_test.rb +43 -38
  140. data/test/functional/sinatra_test.rb +49 -40
  141. data/test/functional/thread_safety_test.rb +4 -6
  142. data/test/paper_trail_test.rb +15 -14
  143. data/test/test_helper.rb +78 -18
  144. data/test/time_travel_helper.rb +1 -15
  145. data/test/unit/associations_test.rb +1016 -0
  146. data/test/unit/cleaner_test.rb +66 -60
  147. data/test/unit/inheritance_column_test.rb +19 -19
  148. data/test/unit/model_test.rb +646 -1071
  149. data/test/unit/protected_attrs_test.rb +19 -14
  150. data/test/unit/serializer_test.rb +44 -43
  151. data/test/unit/serializers/json_test.rb +28 -21
  152. data/test/unit/serializers/mixin_json_test.rb +15 -14
  153. data/test/unit/serializers/mixin_yaml_test.rb +20 -16
  154. data/test/unit/serializers/yaml_test.rb +16 -14
  155. data/test/unit/timestamp_test.rb +10 -12
  156. data/test/unit/version_test.rb +88 -70
  157. metadata +166 -72
  158. data/gemfiles/3.0.gemfile +0 -52
@@ -1,71 +1,71 @@
1
- require 'test_helper'
1
+ require "test_helper"
2
2
 
3
3
  class PaperTrailCleanerTest < ActiveSupport::TestCase
4
-
5
4
  def populate_db!
6
5
  @animals = [@animal = Animal.new, @dog = Dog.new, @cat = Cat.new]
7
6
  @animals.each do |animal|
8
- 3.times { animal.update_attribute(:name, Faker::Name.name) }
7
+ 3.times { animal.update_attribute(:name, FFaker::Name.name) }
9
8
  end
10
9
  end
11
10
 
12
- context '`clean_versions!` method' do
13
- setup { self.populate_db! }
11
+ context "`clean_versions!` method" do
12
+ setup { populate_db! }
14
13
 
15
- should 'Baseline' do
14
+ should "Baseline" do
16
15
  assert_equal 9, PaperTrail::Version.count
17
16
  @animals.each { |animal| assert_equal 3, animal.versions.size }
18
17
  end
19
18
 
20
- should 'be extended by `PaperTrail` module' do
19
+ should "be extended by `PaperTrail` module" do
21
20
  assert_respond_to PaperTrail, :clean_versions!
22
21
  end
23
22
 
24
- context 'No options provided' do
25
- should 'removes extra versions for each item' do
23
+ context "No options provided" do
24
+ should "removes extra versions for each item" do
26
25
  PaperTrail.clean_versions!
27
26
  assert_equal 3, PaperTrail::Version.count
28
27
  @animals.each { |animal| assert_equal 1, animal.versions.size }
29
28
  end
30
29
 
31
- should 'removes the earliest version(s)' do
32
- most_recent_version_names = @animals.map { |animal| animal.versions.last.reify.name }
30
+ should "removes the earliest version(s)" do
31
+ before = @animals.map { |animal| animal.versions.last.reify.name }
33
32
  PaperTrail.clean_versions!
34
- assert_equal most_recent_version_names, @animals.map { |animal| animal.versions.last.reify.name }
33
+ after = @animals.map { |animal| animal.versions.last.reify.name }
34
+ assert_equal before, after
35
35
  end
36
36
  end
37
37
 
38
- context '`:keeping` option' do
39
- should 'modifies the number of versions ommitted from destruction' do
40
- PaperTrail.clean_versions!(:keeping => 2)
38
+ context "`:keeping` option" do
39
+ should "modifies the number of versions ommitted from destruction" do
40
+ PaperTrail.clean_versions!(keeping: 2)
41
41
  assert_equal 6, PaperTrail::Version.all.count
42
42
  @animals.each { |animal| assert_equal 2, animal.versions.size }
43
43
  end
44
44
  end
45
45
 
46
- context '`:date` option' do
46
+ context "`:date` option" do
47
47
  setup do
48
48
  @animal.versions.each { |ver| ver.update_attribute(:created_at, ver.created_at - 1.day) }
49
49
  @date = @animal.versions.first.created_at.to_date
50
- @animal.update_attribute(:name, Faker::Name.name)
50
+ @animal.update_attribute(:name, FFaker::Name.name)
51
51
  end
52
52
 
53
- should 'restrict the versions destroyed to those that were created on the date provided' do
53
+ should "restrict the versions destroyed to those that were created on the date provided" do
54
54
  assert_equal 10, PaperTrail::Version.count
55
55
  assert_equal 4, @animal.versions.size
56
56
  assert_equal 3, @animal.versions_between(@date, @date + 1.day).size
57
- PaperTrail.clean_versions!(:date => @date)
57
+ PaperTrail.clean_versions!(date: @date)
58
58
  assert_equal 8, PaperTrail::Version.count
59
- assert_equal 2, @animal.versions(true).size
59
+ assert_equal 2, @animal.versions.reload.size
60
60
  assert_equal @date, @animal.versions.first.created_at.to_date
61
61
  assert_not_same @date, @animal.versions.last.created_at.to_date
62
62
  end
63
63
  end
64
64
 
65
- context '`:item_id` option' do
66
- context 'single ID received' do
67
- should 'restrict the versions destroyed to the versions for the Item with that ID' do
68
- PaperTrail.clean_versions!(:item_id => @animal.id)
65
+ context "`:item_id` option" do
66
+ context "single ID received" do
67
+ should "restrict the versions destroyed to the versions for the Item with that ID" do
68
+ PaperTrail.clean_versions!(item_id: @animal.id)
69
69
  assert_equal 1, @animal.versions.size
70
70
  assert_equal 7, PaperTrail::Version.count
71
71
  end
@@ -73,7 +73,7 @@ class PaperTrailCleanerTest < ActiveSupport::TestCase
73
73
 
74
74
  context "collection of ID's received" do
75
75
  should "restrict the versions destroyed to the versions for the Item with those ID's" do
76
- PaperTrail.clean_versions!(:item_id => [@animal.id, @dog.id])
76
+ PaperTrail.clean_versions!(item_id: [@animal.id, @dog.id])
77
77
  assert_equal 1, @animal.versions.size
78
78
  assert_equal 1, @dog.versions.size
79
79
  assert_equal 5, PaperTrail::Version.count
@@ -81,72 +81,78 @@ class PaperTrailCleanerTest < ActiveSupport::TestCase
81
81
  end
82
82
  end
83
83
 
84
- context 'options combinations' do # additional tests to cover combinations of options
85
- context '`:date`' do
84
+ context "options combinations" do # additional tests to cover combinations of options
85
+ context "`:date`" do
86
86
  setup do
87
87
  [@animal, @dog].each do |animal|
88
88
  animal.versions.each { |ver| ver.update_attribute(:created_at, ver.created_at - 1.day) }
89
- animal.update_attribute(:name, Faker::Name.name)
89
+ animal.update_attribute(:name, FFaker::Name.name)
90
90
  end
91
91
  @date = @animal.versions.first.created_at.to_date
92
92
  end
93
93
 
94
- should 'Baseline' do
94
+ should "Baseline" do
95
95
  assert_equal 11, PaperTrail::Version.count
96
96
  [@animal, @dog].each do |animal|
97
97
  assert_equal 4, animal.versions.size
98
- assert_equal 3, animal.versions.between(@date, @date+1.day).size
98
+ assert_equal 3, animal.versions.between(@date, @date + 1.day).size
99
99
  end
100
100
  end
101
101
 
102
- context 'and `:keeping`' do
103
- should 'restrict cleaning properly' do
104
- PaperTrail.clean_versions!(:date => @date, :keeping => 2)
102
+ context "and `:keeping`" do
103
+ should "restrict cleaning properly" do
104
+ PaperTrail.clean_versions!(date: @date, keeping: 2)
105
105
  [@animal, @dog].each do |animal|
106
- animal.versions.reload # reload the association to pick up the destructions made by the `Cleaner`
106
+ # reload the association to pick up the destructions made by the `Cleaner`
107
+ animal.versions.reload
107
108
  assert_equal 3, animal.versions.size
108
- assert_equal 2, animal.versions.between(@date, @date+1.day).size
109
+ assert_equal 2, animal.versions.between(@date, @date + 1.day).size
109
110
  end
110
- assert_equal 9, PaperTrail::Version.count # ensure that the versions for the `@cat` instance wasn't touched
111
+ # ensure that the versions for the `@cat` instance wasn't touched
112
+ assert_equal 9, PaperTrail::Version.count
111
113
  end
112
114
  end
113
115
 
114
- context 'and `:item_id`' do
115
- should 'restrict cleaning properly' do
116
- PaperTrail.clean_versions!(:date => @date, :item_id => @dog.id)
117
- @dog.versions.reload # reload the association to pick up the destructions made by the `Cleaner`
116
+ context "and `:item_id`" do
117
+ should "restrict cleaning properly" do
118
+ PaperTrail.clean_versions!(date: @date, item_id: @dog.id)
119
+ # reload the association to pick up the destructions made by the `Cleaner`
120
+ @dog.versions.reload
118
121
  assert_equal 2, @dog.versions.size
119
- assert_equal 1, @dog.versions.between(@date, @date+1.day).size
120
- assert_equal 9, PaperTrail::Version.count # ensure the versions for other animals besides `@animal` weren't touched
122
+ assert_equal 1, @dog.versions.between(@date, @date + 1.day).size
123
+ # ensure the versions for other animals besides `@animal` weren't touched
124
+ assert_equal 9, PaperTrail::Version.count
121
125
  end
122
126
  end
123
127
 
124
- context ', `:item_id`, and `:keeping`' do
125
- should 'restrict cleaning properly' do
126
- PaperTrail.clean_versions!(:date => @date, :item_id => @dog.id, :keeping => 2)
127
- @dog.versions.reload # reload the association to pick up the destructions made by the `Cleaner`
128
+ context ", `:item_id`, and `:keeping`" do
129
+ should "restrict cleaning properly" do
130
+ PaperTrail.clean_versions!(date: @date, item_id: @dog.id, keeping: 2)
131
+ # reload the association to pick up the destructions made by the `Cleaner`
132
+ @dog.versions.reload
128
133
  assert_equal 3, @dog.versions.size
129
- assert_equal 2, @dog.versions.between(@date, @date+1.day).size
130
- assert_equal 10, PaperTrail::Version.count # ensure the versions for other animals besides `@animal` weren't touched
134
+ assert_equal 2, @dog.versions.between(@date, @date + 1.day).size
135
+ # ensure the versions for other animals besides `@animal` weren't touched
136
+ assert_equal 10, PaperTrail::Version.count
131
137
  end
132
138
  end
133
139
  end
134
140
 
135
- context '`:keeping` and `:item_id`' do
136
- should 'restrict cleaning properly' do
137
- PaperTrail.clean_versions!(:keeping => 2, :item_id => @animal.id)
141
+ context "`:keeping` and `:item_id`" do
142
+ should "restrict cleaning properly" do
143
+ PaperTrail.clean_versions!(keeping: 2, item_id: @animal.id)
138
144
  assert_equal 2, @animal.versions.size
139
- assert_equal 8, PaperTrail::Version.count # ensure the versions for other animals besides `@animal` weren't touched
145
+ # ensure the versions for other animals besides `@animal` weren't touched
146
+ assert_equal 8, PaperTrail::Version.count
140
147
  end
141
148
  end
142
149
  end
143
-
144
150
  end # clean_versions! method
145
151
 
146
152
  context "Custom timestamp field" do
147
153
  setup do
148
154
  change_schema
149
- self.populate_db!
155
+ populate_db!
150
156
  # now mess with the timestamps
151
157
  @animals.each do |animal|
152
158
  animal.versions.reverse.each_with_index do |version, index|
@@ -154,7 +160,7 @@ class PaperTrailCleanerTest < ActiveSupport::TestCase
154
160
  end
155
161
  end
156
162
  PaperTrail.timestamp_field = :custom_created_at
157
- @animals.map { |a| a.versions(true) } # reload the `versions` association for each animal
163
+ @animals.map { |a| a.versions.reload } # reload the `versions` association for each animal
158
164
  end
159
165
 
160
166
  teardown do
@@ -162,18 +168,18 @@ class PaperTrailCleanerTest < ActiveSupport::TestCase
162
168
  restore_schema
163
169
  end
164
170
 
165
- should 'Baseline' do
171
+ should "Baseline" do
166
172
  assert_equal 9, PaperTrail::Version.count
167
173
  @animals.each do |animal|
168
174
  assert_equal 3, animal.versions.size
169
- animal.versions.each_cons(2) do |a,b|
170
- a.created_at.to_date == b.created_at.to_date
171
- a.custom_created_at.to_date != b.custom_created_at.to_date
175
+ animal.versions.each_cons(2) do |a, b|
176
+ assert_equal a.created_at.to_date, b.created_at.to_date
177
+ assert_not_equal a.custom_created_at.to_date, b.custom_created_at.to_date
172
178
  end
173
179
  end
174
180
  end
175
181
 
176
- should 'group by `PaperTrail.timestamp_field` when seperating the versions by date to clean' do
182
+ should "group by `PaperTrail.timestamp_field` when seperating the versions by date to clean" do
177
183
  assert_equal 9, PaperTrail::Version.count
178
184
  PaperTrail.clean_versions!
179
185
  assert_equal 9, PaperTrail::Version.count
@@ -1,43 +1,43 @@
1
- require 'test_helper'
1
+ require "test_helper"
2
2
 
3
3
  class InheritanceColumnTest < ActiveSupport::TestCase
4
-
5
- context 'STI models' do
4
+ context "STI models" do
6
5
  setup do
7
- @animal = Animal.create :name => 'Animal'
8
- @animal.update_attributes :name => 'Animal from the Muppets'
9
- @animal.update_attributes :name => 'Animal Muppet'
6
+ @animal = Animal.create name: "Animal"
7
+ @animal.update_attributes name: "Animal from the Muppets"
8
+ @animal.update_attributes name: "Animal Muppet"
10
9
  @animal.destroy
11
10
 
12
- @dog = Dog.create :name => 'Snoopy'
13
- @dog.update_attributes :name => 'Scooby'
14
- @dog.update_attributes :name => 'Scooby Doo'
11
+ @dog = Dog.create name: "Snoopy"
12
+ @dog.update_attributes name: "Scooby"
13
+ @dog.update_attributes name: "Scooby Doo"
15
14
  @dog.destroy
16
15
 
17
- @cat = Cat.create :name => 'Garfield'
18
- @cat.update_attributes :name => 'Garfield (I hate Mondays)'
19
- @cat.update_attributes :name => 'Garfield The Cat'
16
+ @cat = Cat.create name: "Garfield"
17
+ @cat.update_attributes name: "Garfield (I hate Mondays)"
18
+ @cat.update_attributes name: "Garfield The Cat"
20
19
  @cat.destroy
21
20
  end
22
21
 
23
- should 'work with custom STI inheritance column' do
22
+ should "work with custom STI inheritance column" do
24
23
  assert_equal 12, PaperTrail::Version.count
25
24
  assert_equal 4, @animal.versions.count
26
25
  assert_nil @animal.versions.first.reify
27
- @animal.versions[1..-1].each { |v| assert_equal 'Animal', v.reify.class.name }
26
+ @animal.versions[1..-1].each { |v| assert_equal "Animal", v.reify.class.name }
28
27
 
29
28
  # For some reason `@dog.versions` doesn't include the final `destroy` version.
30
29
  # Neither do `@dog.versions.scoped` nor `@dog.versions(true)` nor `@dog.versions.reload`.
31
- dog_versions = PaperTrail::Version.where(:item_id => @dog.id)
30
+ dog_versions = PaperTrail::Version.where(item_id: @dog.id).
31
+ order(PaperTrail.timestamp_field)
32
32
  assert_equal 4, dog_versions.count
33
33
  assert_nil dog_versions.first.reify
34
- dog_versions[1..-1].each { |v| assert_equal 'Dog', v.reify.class.name }
34
+ assert_equal %w(NilClass Dog Dog Dog), dog_versions.map { |v| v.reify.class.name }
35
35
 
36
- cat_versions = PaperTrail::Version.where(:item_id => @cat.id)
36
+ cat_versions = PaperTrail::Version.where(item_id: @cat.id).
37
+ order(PaperTrail.timestamp_field)
37
38
  assert_equal 4, cat_versions.count
38
39
  assert_nil cat_versions.first.reify
39
- cat_versions[1..-1].each { |v| assert_equal 'Cat', v.reify.class.name }
40
+ assert_equal %w(NilClass Cat Cat Cat), cat_versions.map { |v| v.reify.class.name }
40
41
  end
41
42
  end
42
-
43
43
  end