paper_trail 4.2.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/{CONTRIBUTING.md → .github/CONTRIBUTING.md} +28 -9
  3. data/.github/ISSUE_TEMPLATE.md +13 -0
  4. data/.gitignore +2 -1
  5. data/.rubocop.yml +100 -0
  6. data/.rubocop_todo.yml +14 -0
  7. data/.travis.yml +8 -9
  8. data/Appraisals +41 -0
  9. data/CHANGELOG.md +49 -9
  10. data/Gemfile +1 -1
  11. data/README.md +130 -109
  12. data/Rakefile +19 -19
  13. data/doc/bug_report_template.rb +20 -14
  14. data/gemfiles/ar3.gemfile +10 -53
  15. data/gemfiles/ar4.gemfile +7 -0
  16. data/gemfiles/ar5.gemfile +13 -0
  17. data/lib/generators/paper_trail/install_generator.rb +26 -18
  18. data/lib/generators/paper_trail/templates/add_object_changes_to_versions.rb +4 -2
  19. data/lib/generators/paper_trail/templates/add_transaction_id_column_to_versions.rb +2 -0
  20. data/lib/generators/paper_trail/templates/create_version_associations.rb +9 -4
  21. data/lib/generators/paper_trail/templates/create_versions.rb +39 -5
  22. data/lib/paper_trail.rb +169 -146
  23. data/lib/paper_trail/attributes_serialization.rb +89 -17
  24. data/lib/paper_trail/cleaner.rb +15 -9
  25. data/lib/paper_trail/config.rb +28 -11
  26. data/lib/paper_trail/frameworks/active_record.rb +4 -0
  27. data/lib/paper_trail/frameworks/active_record/models/paper_trail/version.rb +5 -1
  28. data/lib/paper_trail/frameworks/active_record/models/paper_trail/version_association.rb +6 -2
  29. data/lib/paper_trail/frameworks/cucumber.rb +1 -0
  30. data/lib/paper_trail/frameworks/rails.rb +2 -7
  31. data/lib/paper_trail/frameworks/rails/controller.rb +29 -9
  32. data/lib/paper_trail/frameworks/rails/engine.rb +7 -1
  33. data/lib/paper_trail/frameworks/rspec.rb +5 -5
  34. data/lib/paper_trail/frameworks/rspec/helpers.rb +3 -1
  35. data/lib/paper_trail/frameworks/sinatra.rb +6 -4
  36. data/lib/paper_trail/has_paper_trail.rb +199 -106
  37. data/lib/paper_trail/record_history.rb +1 -3
  38. data/lib/paper_trail/reifier.rb +297 -118
  39. data/lib/paper_trail/serializers/json.rb +3 -3
  40. data/lib/paper_trail/serializers/yaml.rb +27 -8
  41. data/lib/paper_trail/version_association_concern.rb +3 -1
  42. data/lib/paper_trail/version_concern.rb +75 -35
  43. data/lib/paper_trail/version_number.rb +6 -9
  44. data/paper_trail.gemspec +44 -51
  45. data/spec/generators/install_generator_spec.rb +24 -25
  46. data/spec/generators/paper_trail/templates/create_versions_spec.rb +51 -0
  47. data/spec/models/animal_spec.rb +12 -12
  48. data/spec/models/boolit_spec.rb +8 -8
  49. data/spec/models/callback_modifier_spec.rb +47 -47
  50. data/spec/models/car_spec.rb +13 -0
  51. data/spec/models/fluxor_spec.rb +3 -3
  52. data/spec/models/gadget_spec.rb +19 -19
  53. data/spec/models/joined_version_spec.rb +3 -3
  54. data/spec/models/json_version_spec.rb +23 -24
  55. data/spec/models/kitchen/banana_spec.rb +3 -3
  56. data/spec/models/not_on_update_spec.rb +7 -4
  57. data/spec/models/post_with_status_spec.rb +13 -3
  58. data/spec/models/skipper_spec.rb +10 -10
  59. data/spec/models/thing_spec.rb +4 -4
  60. data/spec/models/truck_spec.rb +5 -0
  61. data/spec/models/vehicle_spec.rb +5 -0
  62. data/spec/models/version_spec.rb +103 -59
  63. data/spec/models/widget_spec.rb +82 -52
  64. data/spec/modules/paper_trail_spec.rb +2 -2
  65. data/spec/modules/version_concern_spec.rb +11 -12
  66. data/spec/modules/version_number_spec.rb +2 -4
  67. data/spec/paper_trail/config_spec.rb +10 -29
  68. data/spec/paper_trail_spec.rb +16 -14
  69. data/spec/rails_helper.rb +10 -9
  70. data/spec/requests/articles_spec.rb +11 -7
  71. data/spec/spec_helper.rb +41 -22
  72. data/spec/support/alt_db_init.rb +8 -13
  73. data/test/custom_json_serializer.rb +3 -3
  74. data/test/dummy/Rakefile +2 -2
  75. data/test/dummy/app/controllers/application_controller.rb +21 -8
  76. data/test/dummy/app/controllers/articles_controller.rb +11 -8
  77. data/test/dummy/app/controllers/widgets_controller.rb +13 -12
  78. data/test/dummy/app/models/animal.rb +1 -1
  79. data/test/dummy/app/models/article.rb +19 -11
  80. data/test/dummy/app/models/authorship.rb +1 -1
  81. data/test/dummy/app/models/bar_habtm.rb +4 -0
  82. data/test/dummy/app/models/book.rb +4 -4
  83. data/test/dummy/app/models/boolit.rb +1 -1
  84. data/test/dummy/app/models/callback_modifier.rb +6 -6
  85. data/test/dummy/app/models/car.rb +3 -0
  86. data/test/dummy/app/models/chapter.rb +4 -4
  87. data/test/dummy/app/models/customer.rb +1 -1
  88. data/test/dummy/app/models/document.rb +2 -2
  89. data/test/dummy/app/models/editor.rb +1 -1
  90. data/test/dummy/app/models/foo_habtm.rb +4 -0
  91. data/test/dummy/app/models/fruit.rb +2 -2
  92. data/test/dummy/app/models/gadget.rb +1 -1
  93. data/test/dummy/app/models/kitchen/banana.rb +1 -1
  94. data/test/dummy/app/models/legacy_widget.rb +2 -2
  95. data/test/dummy/app/models/line_item.rb +1 -1
  96. data/test/dummy/app/models/not_on_update.rb +1 -1
  97. data/test/dummy/app/models/person.rb +6 -6
  98. data/test/dummy/app/models/post.rb +1 -1
  99. data/test/dummy/app/models/post_with_status.rb +1 -1
  100. data/test/dummy/app/models/quotation.rb +1 -1
  101. data/test/dummy/app/models/section.rb +1 -1
  102. data/test/dummy/app/models/skipper.rb +2 -2
  103. data/test/dummy/app/models/song.rb +13 -4
  104. data/test/dummy/app/models/thing.rb +2 -2
  105. data/test/dummy/app/models/translation.rb +2 -2
  106. data/test/dummy/app/models/truck.rb +4 -0
  107. data/test/dummy/app/models/vehicle.rb +4 -0
  108. data/test/dummy/app/models/whatchamajigger.rb +1 -1
  109. data/test/dummy/app/models/widget.rb +7 -6
  110. data/test/dummy/app/versions/joined_version.rb +4 -3
  111. data/test/dummy/app/versions/json_version.rb +1 -1
  112. data/test/dummy/app/versions/kitchen/banana_version.rb +1 -1
  113. data/test/dummy/app/versions/post_version.rb +2 -2
  114. data/test/dummy/config.ru +1 -1
  115. data/test/dummy/config/application.rb +20 -9
  116. data/test/dummy/config/boot.rb +5 -5
  117. data/test/dummy/config/environment.rb +1 -1
  118. data/test/dummy/config/environments/development.rb +4 -3
  119. data/test/dummy/config/environments/production.rb +3 -2
  120. data/test/dummy/config/environments/test.rb +15 -5
  121. data/test/dummy/config/initializers/backtrace_silencers.rb +4 -2
  122. data/test/dummy/config/initializers/paper_trail.rb +1 -2
  123. data/test/dummy/config/initializers/secret_token.rb +3 -1
  124. data/test/dummy/config/initializers/session_store.rb +1 -1
  125. data/test/dummy/config/routes.rb +2 -2
  126. data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +120 -74
  127. data/test/dummy/db/schema.rb +29 -6
  128. data/test/dummy/script/rails +6 -4
  129. data/test/functional/controller_test.rb +34 -35
  130. data/test/functional/enabled_for_controller_test.rb +6 -7
  131. data/test/functional/modular_sinatra_test.rb +43 -38
  132. data/test/functional/sinatra_test.rb +49 -40
  133. data/test/functional/thread_safety_test.rb +4 -6
  134. data/test/paper_trail_test.rb +15 -14
  135. data/test/test_helper.rb +68 -44
  136. data/test/time_travel_helper.rb +1 -15
  137. data/test/unit/associations_test.rb +517 -251
  138. data/test/unit/cleaner_test.rb +66 -60
  139. data/test/unit/inheritance_column_test.rb +17 -17
  140. data/test/unit/model_test.rb +611 -504
  141. data/test/unit/protected_attrs_test.rb +16 -12
  142. data/test/unit/serializer_test.rb +44 -43
  143. data/test/unit/serializers/json_test.rb +17 -18
  144. data/test/unit/serializers/mixin_json_test.rb +15 -14
  145. data/test/unit/serializers/mixin_yaml_test.rb +20 -16
  146. data/test/unit/serializers/yaml_test.rb +12 -13
  147. data/test/unit/timestamp_test.rb +10 -12
  148. data/test/unit/version_test.rb +7 -7
  149. metadata +92 -40
@@ -1,55 +1,58 @@
1
- require 'rails_helper'
1
+ require "rails_helper"
2
2
 
3
- describe Widget, :type => :model do
4
- describe '`be_versioned` matcher' do
3
+ describe Widget, type: :model do
4
+ describe "`be_versioned` matcher" do
5
5
  it { is_expected.to be_versioned }
6
6
  end
7
7
 
8
- let(:widget) { Widget.create! :name => 'Bob', :an_integer => 1 }
8
+ let(:widget) { Widget.create! name: "Bob", an_integer: 1 }
9
9
 
10
- describe '`have_a_version_with` matcher', :versioning => true do
10
+ describe "`have_a_version_with` matcher", versioning: true do
11
11
  before do
12
- widget.update_attributes!(:name => 'Leonard', :an_integer => 1 )
13
- widget.update_attributes!(:name => 'Tom')
14
- widget.update_attributes!(:name => 'Bob')
12
+ widget.update_attributes!(name: "Leonard", an_integer: 1)
13
+ widget.update_attributes!(name: "Tom")
14
+ widget.update_attributes!(name: "Bob")
15
15
  end
16
16
 
17
17
  it "is possible to do assertions on versions" do
18
- expect(widget).to have_a_version_with :name => 'Leonard', :an_integer => 1
19
- expect(widget).to have_a_version_with :an_integer => 1
20
- expect(widget).to have_a_version_with :name => 'Tom'
18
+ expect(widget).to have_a_version_with name: "Leonard", an_integer: 1
19
+ expect(widget).to have_a_version_with an_integer: 1
20
+ expect(widget).to have_a_version_with name: "Tom"
21
21
  end
22
22
  end
23
23
 
24
- describe "`versioning` option" do
25
- context :enabled, :versioning => true do
26
- it 'should enable versioning for models wrapped within a block' do
24
+ describe "versioning option" do
25
+ context "enabled", versioning: true do
26
+ it "should enable versioning" do
27
27
  expect(widget.versions.size).to eq(1)
28
28
  end
29
29
  end
30
30
 
31
- context '`disabled` (default)' do
32
- it 'should not enable versioning for models wrapped within a block not marked to used versioning' do
31
+ context "disabled (default)" do
32
+ it "should not enable versioning" do
33
33
  expect(widget.versions.size).to eq(0)
34
34
  end
35
35
  end
36
36
  end
37
37
 
38
- describe "Callbacks", :versioning => true do
38
+ describe "Callbacks", versioning: true do
39
39
  describe :before_save do
40
- context ':on => :update' do
41
- before { widget.update_attributes!(:name => 'Foobar') }
40
+ context ":on => :update" do
41
+ before { widget.update_attributes!(name: "Foobar") }
42
42
 
43
43
  subject { widget.versions.last.reify }
44
44
 
45
- it "should reset the value for the timestamp attrs for update so that value gets updated properly" do
46
- expect { subject.save! }.to change(subject, :updated_at)
45
+ it "resets value for timestamp attrs for update so that value gets updated properly" do
46
+ # Travel 1 second because MySQL lacks sub-second resolution
47
+ Timecop.travel(1) do
48
+ expect { subject.save! }.to change(subject, :updated_at)
49
+ end
47
50
  end
48
51
  end
49
52
  end
50
53
 
51
54
  describe :after_create do
52
- let(:widget) { Widget.create!(:name => 'Foobar', :created_at => Time.now - 1.week) }
55
+ let(:widget) { Widget.create!(name: "Foobar", created_at: Time.now - 1.week) }
53
56
 
54
57
  it "corresponding version should use the widget's `updated_at`" do
55
58
  expect(widget.versions.last.created_at.to_i).to eq(widget.updated_at.to_i)
@@ -57,7 +60,7 @@ describe Widget, :type => :model do
57
60
  end
58
61
 
59
62
  describe :after_update do
60
- before { widget.update_attributes!(:name => 'Foobar', :updated_at => Time.now + 1.week) }
63
+ before { widget.update_attributes!(name: "Foobar", updated_at: Time.now + 1.week) }
61
64
 
62
65
  subject { widget.versions.last.reify }
63
66
 
@@ -87,13 +90,13 @@ describe Widget, :type => :model do
87
90
  end
88
91
 
89
92
  describe :after_rollback do
90
- let(:rolled_back_name) { 'Big Moo' }
93
+ let(:rolled_back_name) { "Big Moo" }
91
94
 
92
95
  before do
93
96
  begin
94
97
  widget.transaction do
95
- widget.update_attributes!(:name => rolled_back_name)
96
- widget.update_attributes!(:name => Widget::EXCLUDED_NAME)
98
+ widget.update_attributes!(name: rolled_back_name)
99
+ widget.update_attributes!(name: Widget::EXCLUDED_NAME)
97
100
  end
98
101
  rescue ActiveRecord::RecordInvalid
99
102
  widget.reload
@@ -102,15 +105,19 @@ describe Widget, :type => :model do
102
105
  end
103
106
  end
104
107
 
105
- it 'does not create an event for changes that did not happen' do
108
+ it "does not create an event for changes that did not happen" do
106
109
  widget.versions.map(&:changeset).each do |changeset|
107
- expect(changeset.fetch('name', [])).to_not include(rolled_back_name)
110
+ expect(changeset.fetch("name", [])).to_not include(rolled_back_name)
108
111
  end
109
112
  end
113
+
114
+ it "has not yet loaded the assocation" do
115
+ expect(widget.versions).to_not be_loaded
116
+ end
110
117
  end
111
118
  end
112
119
 
113
- describe "Association", :versioning => true do
120
+ describe "Association", versioning: true do
114
121
  describe "sort order" do
115
122
  it "should sort by the timestamp order from the `VersionConcern`" do
116
123
  expect(widget.versions.to_sql).to eq(
@@ -119,14 +126,25 @@ describe Widget, :type => :model do
119
126
  end
120
127
  end
121
128
 
129
+ if defined?(ActiveRecord::IdentityMap) && ActiveRecord::IdentityMap.respond_to?(:without)
130
+ describe "IdentityMap", versioning: true do
131
+ it "should not clobber the IdentityMap when reifying" do
132
+ widget.update_attributes name: "Henry", created_at: Time.now - 1.day
133
+ widget.update_attributes name: "Harry"
134
+ expect(ActiveRecord::IdentityMap).to receive(:without).once
135
+ widget.versions.last.reify
136
+ end
137
+ end
138
+ end
139
+
122
140
  describe "Methods" do
123
- describe "Instance", :versioning => true do
141
+ describe "Instance", versioning: true do
124
142
  describe '#paper_trail_originator' do
125
143
  it { is_expected.to respond_to(:paper_trail_originator) }
126
144
 
127
145
  describe "return value" do
128
- let(:orig_name) { Faker::Name.name }
129
- let(:new_name) { Faker::Name.name }
146
+ let(:orig_name) { FFaker::Name.name }
147
+ let(:new_name) { FFaker::Name.name }
130
148
  before { PaperTrail.whodunnit = orig_name }
131
149
 
132
150
  context "accessed from live model instance" do
@@ -134,16 +152,16 @@ describe Widget, :type => :model do
134
152
 
135
153
  it "should return the originator for the model at a given state" do
136
154
  expect(widget.paper_trail_originator).to eq(orig_name)
137
- widget.whodunnit(new_name) { |w| w.update_attributes(:name => 'Elizabeth') }
155
+ widget.whodunnit(new_name) { |w| w.update_attributes(name: "Elizabeth") }
138
156
  expect(widget.paper_trail_originator).to eq(new_name)
139
157
  end
140
158
  end
141
159
 
142
160
  context "accessed from a reified model instance" do
143
161
  before do
144
- widget.update_attributes(:name => 'Andy')
162
+ widget.update_attributes(name: "Andy")
145
163
  PaperTrail.whodunnit = new_name
146
- widget.update_attributes(:name => 'Elizabeth')
164
+ widget.update_attributes(name: "Elizabeth")
147
165
  end
148
166
 
149
167
  context "default behavior (no `options[:dup]` option passed in)" do
@@ -159,7 +177,7 @@ describe Widget, :type => :model do
159
177
  end
160
178
 
161
179
  context "creating a new instance (`options[:dup] == true`)" do
162
- let(:reified_widget) { widget.versions[1].reify(:dup => true) }
180
+ let(:reified_widget) { widget.versions[1].reify(dup: true) }
163
181
 
164
182
  it "should return the appropriate originator" do
165
183
  expect(reified_widget.paper_trail_originator).to eq(orig_name)
@@ -178,13 +196,13 @@ describe Widget, :type => :model do
178
196
 
179
197
  it { is_expected.to respond_to(:originator) }
180
198
 
181
- it 'should set the invoke `paper_trail_originator`' do
199
+ it "should set the invoke `paper_trail_originator`" do
182
200
  allow(::ActiveSupport::Deprecation).to receive(:warn)
183
201
  is_expected.to receive(:paper_trail_originator)
184
202
  subject.originator
185
203
  end
186
204
 
187
- it 'should display a deprecation warning' do
205
+ it "should display a deprecation warning" do
188
206
  expect(::ActiveSupport::Deprecation).to receive(:warn).
189
207
  with(/Use paper_trail_originator instead of originator/)
190
208
  subject.originator
@@ -196,7 +214,7 @@ describe Widget, :type => :model do
196
214
 
197
215
  context "Timestamp argument is AFTER object has been destroyed" do
198
216
  before do
199
- widget.update_attribute(:name, 'foobar')
217
+ widget.update_attribute(:name, "foobar")
200
218
  widget.destroy
201
219
  end
202
220
 
@@ -211,13 +229,15 @@ describe Widget, :type => :model do
211
229
 
212
230
  context "no block given" do
213
231
  it "should raise an error" do
214
- expect { widget.whodunnit('Ben') }.to raise_error(ArgumentError, 'expected to receive a block')
232
+ expect {
233
+ widget.whodunnit("Ben")
234
+ }.to raise_error(ArgumentError, "expected to receive a block")
215
235
  end
216
236
  end
217
237
 
218
238
  context "block given" do
219
- let(:orig_name) { Faker::Name.name }
220
- let(:new_name) { Faker::Name.name }
239
+ let(:orig_name) { FFaker::Name.name }
240
+ let(:new_name) { FFaker::Name.name }
221
241
 
222
242
  before do
223
243
  PaperTrail.whodunnit = orig_name
@@ -227,19 +247,23 @@ describe Widget, :type => :model do
227
247
  it "should modify value of `PaperTrail.whodunnit` while executing the block" do
228
248
  widget.whodunnit(new_name) do
229
249
  expect(PaperTrail.whodunnit).to eq(new_name)
230
- widget.update_attributes(:name => 'Elizabeth')
250
+ widget.update_attributes(name: "Elizabeth")
231
251
  end
232
252
  expect(widget.versions.last.whodunnit).to eq(new_name)
233
253
  end
234
254
 
235
- it "should revert the value of `PaperTrail.whodunnit` to it's previous value after executing the block" do
236
- widget.whodunnit(new_name) { |w| w.update_attributes(:name => 'Elizabeth') }
237
- expect(PaperTrail.whodunnit).to eq(orig_name)
255
+ context "after executing the block" do
256
+ it "reverts value of whodunnit to previous value" do
257
+ widget.whodunnit(new_name) { |w| w.update_attributes(name: "Elizabeth") }
258
+ expect(PaperTrail.whodunnit).to eq(orig_name)
259
+ end
238
260
  end
239
261
 
240
262
  context "error within block" do
241
- it "should ensure that the whodunnit value still reverts to it's previous value" do
242
- expect { widget.whodunnit(new_name) { raise } }.to raise_error
263
+ it "still reverts the whodunnit value to previous value" do
264
+ expect {
265
+ widget.whodunnit(new_name) { raise }
266
+ }.to raise_error(RuntimeError)
243
267
  expect(PaperTrail.whodunnit).to eq(orig_name)
244
268
  end
245
269
  end
@@ -251,13 +275,19 @@ describe Widget, :type => :model do
251
275
 
252
276
  it "creates a version" do
253
277
  count = widget.versions.size
254
- widget.touch_with_version
278
+ # Travel 1 second because MySQL lacks sub-second resolution
279
+ Timecop.travel(1) do
280
+ widget.touch_with_version
281
+ end
255
282
  expect(widget.versions.size).to eq(count + 1)
256
283
  end
257
284
 
258
285
  it "increments the `:updated_at` timestamp" do
259
286
  time_was = widget.updated_at
260
- widget.touch_with_version
287
+ # Travel 1 second because MySQL lacks sub-second resolution
288
+ Timecop.travel(1) do
289
+ widget.touch_with_version
290
+ end
261
291
  expect(widget.updated_at).to be > time_was
262
292
  end
263
293
  end
@@ -275,7 +305,7 @@ describe Widget, :type => :model do
275
305
  describe '#paper_trail_off!' do
276
306
  it { is_expected.to respond_to(:paper_trail_off!) }
277
307
 
278
- it 'should set the `paper_trail_enabled_for_model?` to `false`' do
308
+ it "should set the `paper_trail_enabled_for_model?` to `false`" do
279
309
  expect(subject.paper_trail_enabled_for_model?).to be true
280
310
  subject.paper_trail_off!
281
311
  expect(subject.paper_trail_enabled_for_model?).to be false
@@ -287,7 +317,7 @@ describe Widget, :type => :model do
287
317
 
288
318
  it { is_expected.to respond_to(:paper_trail_on!) }
289
319
 
290
- it 'should set the `paper_trail_enabled_for_model?` to `true`' do
320
+ it "should set the `paper_trail_enabled_for_model?` to `true`" do
291
321
  expect(subject.paper_trail_enabled_for_model?).to be false
292
322
  subject.paper_trail_on!
293
323
  expect(subject.paper_trail_enabled_for_model?).to be true
@@ -1,6 +1,6 @@
1
- require 'rails_helper'
1
+ require "rails_helper"
2
2
 
3
- describe PaperTrail, :type => :module, :versioning => true do
3
+ describe PaperTrail, type: :module, versioning: true do
4
4
  describe '#config' do
5
5
  it { is_expected.to respond_to(:config) }
6
6
 
@@ -1,30 +1,29 @@
1
- require 'rails_helper'
1
+ require "rails_helper"
2
2
 
3
3
  describe PaperTrail::VersionConcern do
4
+ before(:all) { require "support/alt_db_init" }
4
5
 
5
- before(:all) { require 'support/alt_db_init' }
6
-
7
- it 'allows included class to have different connections' do
6
+ it "allows included class to have different connections" do
8
7
  expect(Foo::Version.connection).not_to eq(Bar::Version.connection)
9
8
  end
10
9
 
11
- it 'allows custom version class to share connection with superclass' do
10
+ it "allows custom version class to share connection with superclass" do
12
11
  expect(Foo::Version.connection).to eq(Foo::Document.connection)
13
12
  expect(Bar::Version.connection).to eq(Bar::Document.connection)
14
13
  end
15
14
 
16
- it 'can be used with class_name option' do
17
- expect(Foo::Document.version_class_name).to eq('Foo::Version')
18
- expect(Bar::Document.version_class_name).to eq('Bar::Version')
15
+ it "can be used with class_name option" do
16
+ expect(Foo::Document.version_class_name).to eq("Foo::Version")
17
+ expect(Bar::Document.version_class_name).to eq("Bar::Version")
19
18
  end
20
19
 
21
- describe 'persistence', :versioning => true do
20
+ describe "persistence", versioning: true do
22
21
  before do
23
- @foo_doc = Foo::Document.create!(:name => 'foobar')
24
- @bar_doc = Bar::Document.create!(:name => 'raboof')
22
+ @foo_doc = Foo::Document.create!(name: "foobar")
23
+ @bar_doc = Bar::Document.create!(name: "raboof")
25
24
  end
26
25
 
27
- it 'should store versions in the correct corresponding db location' do
26
+ it "should store versions in the correct corresponding db location" do
28
27
  expect(@foo_doc.versions.first).to be_instance_of(Foo::Version)
29
28
  expect(@bar_doc.versions.first).to be_instance_of(Bar::Version)
30
29
  end
@@ -1,7 +1,6 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  describe PaperTrail::VERSION do
4
-
5
4
  describe "Constants" do
6
5
  subject { PaperTrail::VERSION }
7
6
 
@@ -29,11 +28,10 @@ describe PaperTrail::VERSION do
29
28
 
30
29
  it "should join the numbers into a period separated string" do
31
30
  expect(subject::STRING).to eq(
32
- [subject::MAJOR, subject::MINOR, subject::TINY, subject::PRE].compact.join('.'))
31
+ [subject::MAJOR, subject::MINOR, subject::TINY, subject::PRE].compact.join("."))
33
32
  end
34
33
  end
35
34
  end
36
-
37
35
  end
38
36
 
39
37
  describe PaperTrail do
@@ -14,37 +14,18 @@ module PaperTrail
14
14
  end
15
15
  end
16
16
 
17
- describe "#enabled" do
18
- context "when paper_trail_enabled is true" do
19
- it "returns true" do
20
- store = double
21
- allow(store).to receive(:fetch).
22
- with(:paper_trail_enabled, true).
23
- and_return(true)
24
- allow(PaperTrail).to receive(:paper_trail_store).and_return(store)
25
- expect(described_class.instance.enabled).to eq(true)
17
+ describe "track_associations?" do
18
+ context "@track_associations is nil" do
19
+ after do
20
+ PaperTrail.config.track_associations = true
26
21
  end
27
- end
28
-
29
- context "when paper_trail_enabled is false" do
30
- it "returns false" do
31
- store = double
32
- allow(store).to receive(:fetch).
33
- with(:paper_trail_enabled, true).
34
- and_return(false)
35
- allow(PaperTrail).to receive(:paper_trail_store).and_return(store)
36
- expect(described_class.instance.enabled).to eq(false)
37
- end
38
- end
39
22
 
40
- context "when paper_trail_enabled is nil" do
41
- it "returns true" do
42
- store = double
43
- allow(store).to receive(:fetch).
44
- with(:paper_trail_enabled, true).
45
- and_return(nil)
46
- allow(PaperTrail).to receive(:paper_trail_store).and_return(store)
47
- expect(described_class.instance.enabled).to eq(true)
23
+ it "returns false and prints a deprecation warning" do
24
+ config = described_class.instance
25
+ config.track_associations = nil
26
+ expect {
27
+ expect(config.track_associations?).to eq(false)
28
+ }.to output(/DEPRECATION WARNING/).to_stderr
48
29
  end
49
30
  end
50
31
  end
@@ -1,11 +1,12 @@
1
- require 'rails_helper'
1
+ require "rails_helper"
2
2
 
3
- describe "PaperTrail RSpec Helper" do
4
- context 'default' do
5
- it 'should have versioning off by default' do
3
+ describe PaperTrail do
4
+ context "default" do
5
+ it "should have versioning off by default" do
6
6
  expect(PaperTrail).not_to be_enabled
7
7
  end
8
- it 'should turn versioning on in a `with_versioning` block' do
8
+
9
+ it "should turn versioning on in a `with_versioning` block" do
9
10
  expect(PaperTrail).not_to be_enabled
10
11
  with_versioning do
11
12
  expect(PaperTrail).to be_enabled
@@ -16,17 +17,18 @@ describe "PaperTrail RSpec Helper" do
16
17
  context "error within `with_versioning` block" do
17
18
  it "should revert the value of `PaperTrail.enabled?` to it's previous state" do
18
19
  expect(PaperTrail).not_to be_enabled
19
- expect { with_versioning { raise } }.to raise_error
20
+ expect { with_versioning { raise } }.to raise_error(RuntimeError)
20
21
  expect(PaperTrail).not_to be_enabled
21
22
  end
22
23
  end
23
24
  end
24
25
 
25
- context '`versioning: true`', :versioning => true do
26
- it 'should have versioning on by default' do
26
+ context "`versioning: true`", versioning: true do
27
+ it "should have versioning on by default" do
27
28
  expect(PaperTrail).to be_enabled
28
29
  end
29
- it 'should keep versioning on after a with_versioning block' do
30
+
31
+ it "should keep versioning on after a with_versioning block" do
30
32
  expect(PaperTrail).to be_enabled
31
33
  with_versioning do
32
34
  expect(PaperTrail).to be_enabled
@@ -35,21 +37,21 @@ describe "PaperTrail RSpec Helper" do
35
37
  end
36
38
  end
37
39
 
38
- context '`with_versioning` block at class level' do
40
+ context "`with_versioning` block at class level" do
39
41
  it { expect(PaperTrail).not_to be_enabled }
40
42
 
41
43
  with_versioning do
42
- it 'should have versioning on by default' do
44
+ it "should have versioning on by default" do
43
45
  expect(PaperTrail).to be_enabled
44
46
  end
45
47
  end
46
- it 'should not leak the `enabled?` state into successive tests' do
48
+ it "should not leak the `enabled?` state into successive tests" do
47
49
  expect(PaperTrail).not_to be_enabled
48
50
  end
49
51
  end
50
52
 
51
53
  describe :whodunnit do
52
- before(:all) { PaperTrail.whodunnit = 'foobar' }
54
+ before(:all) { PaperTrail.whodunnit = "foobar" }
53
55
 
54
56
  it "should get set to `nil` by default" do
55
57
  expect(PaperTrail.whodunnit).to be_nil
@@ -57,7 +59,7 @@ describe "PaperTrail RSpec Helper" do
57
59
  end
58
60
 
59
61
  describe :controller_info do
60
- before(:all) { ::PaperTrail.controller_info = {:foo => 'bar'} }
62
+ before(:all) { ::PaperTrail.controller_info = { foo: "bar" } }
61
63
 
62
64
  it "should get set to an empty hash before each test" do
63
65
  expect(PaperTrail.controller_info).to eq({})