paper_trail 5.2.3 → 11.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/lib/generators/paper_trail/install/USAGE +3 -0
- data/lib/generators/paper_trail/install/install_generator.rb +75 -0
- data/lib/generators/paper_trail/{templates/add_object_changes_to_versions.rb → install/templates/add_object_changes_to_versions.rb.erb} +1 -1
- data/lib/generators/paper_trail/install/templates/create_versions.rb.erb +36 -0
- data/lib/generators/paper_trail/migration_generator.rb +38 -0
- data/lib/generators/paper_trail/update_item_subtype/USAGE +4 -0
- data/lib/generators/paper_trail/update_item_subtype/templates/update_versions_for_item_subtype.rb.erb +85 -0
- data/lib/generators/paper_trail/update_item_subtype/update_item_subtype_generator.rb +17 -0
- data/lib/paper_trail.rb +82 -130
- data/lib/paper_trail/attribute_serializers/attribute_serializer_factory.rb +27 -0
- data/lib/paper_trail/attribute_serializers/cast_attribute_serializer.rb +15 -44
- data/lib/paper_trail/attribute_serializers/object_attribute.rb +2 -0
- data/lib/paper_trail/attribute_serializers/object_changes_attribute.rb +2 -0
- data/lib/paper_trail/cleaner.rb +3 -1
- data/lib/paper_trail/compatibility.rb +51 -0
- data/lib/paper_trail/config.rb +11 -49
- data/lib/paper_trail/events/base.rb +323 -0
- data/lib/paper_trail/events/create.rb +32 -0
- data/lib/paper_trail/events/destroy.rb +42 -0
- data/lib/paper_trail/events/update.rb +60 -0
- data/lib/paper_trail/frameworks/active_record.rb +2 -1
- data/lib/paper_trail/frameworks/active_record/models/paper_trail/version.rb +8 -3
- data/lib/paper_trail/frameworks/cucumber.rb +5 -3
- data/lib/paper_trail/frameworks/rails.rb +2 -0
- data/lib/paper_trail/frameworks/rails/controller.rb +33 -43
- data/lib/paper_trail/frameworks/rails/engine.rb +34 -1
- data/lib/paper_trail/frameworks/rspec.rb +17 -4
- data/lib/paper_trail/frameworks/rspec/helpers.rb +2 -0
- data/lib/paper_trail/has_paper_trail.rb +22 -310
- data/lib/paper_trail/model_config.rb +157 -109
- data/lib/paper_trail/queries/versions/where_object.rb +65 -0
- data/lib/paper_trail/queries/versions/where_object_changes.rb +75 -0
- data/lib/paper_trail/record_history.rb +3 -9
- data/lib/paper_trail/record_trail.rb +169 -319
- data/lib/paper_trail/reifier.rb +53 -374
- data/lib/paper_trail/request.rb +166 -0
- data/lib/paper_trail/serializers/json.rb +9 -10
- data/lib/paper_trail/serializers/yaml.rb +15 -28
- data/lib/paper_trail/type_serializers/postgres_array_serializer.rb +48 -0
- data/lib/paper_trail/version_concern.rb +160 -155
- data/lib/paper_trail/version_number.rb +12 -4
- metadata +77 -372
- data/.github/CONTRIBUTING.md +0 -109
- data/.github/ISSUE_TEMPLATE.md +0 -13
- data/.gitignore +0 -23
- data/.rspec +0 -2
- data/.rubocop.yml +0 -99
- data/.rubocop_todo.yml +0 -22
- data/.travis.yml +0 -41
- data/Appraisals +0 -38
- data/CHANGELOG.md +0 -560
- data/Gemfile +0 -2
- data/MIT-LICENSE +0 -20
- data/README.md +0 -1654
- data/Rakefile +0 -30
- data/doc/bug_report_template.rb +0 -69
- data/doc/warning_about_not_setting_whodunnit.md +0 -32
- data/gemfiles/ar3.gemfile +0 -19
- data/gemfiles/ar4.gemfile +0 -8
- data/gemfiles/ar5.gemfile +0 -9
- data/lib/generators/paper_trail/USAGE +0 -2
- data/lib/generators/paper_trail/default_initializer.rb +0 -0
- data/lib/generators/paper_trail/install_generator.rb +0 -57
- data/lib/generators/paper_trail/templates/add_transaction_id_column_to_versions.rb +0 -13
- data/lib/generators/paper_trail/templates/create_version_associations.rb +0 -22
- data/lib/generators/paper_trail/templates/create_versions.rb +0 -80
- data/lib/paper_trail/attribute_serializers/legacy_active_record_shim.rb +0 -48
- data/lib/paper_trail/frameworks/active_record/models/paper_trail/version_association.rb +0 -11
- data/lib/paper_trail/frameworks/sinatra.rb +0 -40
- data/lib/paper_trail/version_association_concern.rb +0 -17
- data/paper_trail.gemspec +0 -56
- data/spec/generators/install_generator_spec.rb +0 -66
- data/spec/generators/paper_trail/templates/create_versions_spec.rb +0 -51
- data/spec/models/animal_spec.rb +0 -36
- data/spec/models/boolit_spec.rb +0 -48
- data/spec/models/callback_modifier_spec.rb +0 -96
- data/spec/models/car_spec.rb +0 -13
- data/spec/models/custom_primary_key_record_spec.rb +0 -18
- data/spec/models/fluxor_spec.rb +0 -17
- data/spec/models/gadget_spec.rb +0 -68
- data/spec/models/joined_version_spec.rb +0 -47
- data/spec/models/json_version_spec.rb +0 -102
- data/spec/models/kitchen/banana_spec.rb +0 -14
- data/spec/models/not_on_update_spec.rb +0 -22
- data/spec/models/post_with_status_spec.rb +0 -50
- data/spec/models/skipper_spec.rb +0 -46
- data/spec/models/thing_spec.rb +0 -11
- data/spec/models/truck_spec.rb +0 -5
- data/spec/models/vehicle_spec.rb +0 -5
- data/spec/models/version_spec.rb +0 -272
- data/spec/models/widget_spec.rb +0 -343
- data/spec/modules/paper_trail_spec.rb +0 -27
- data/spec/modules/version_concern_spec.rb +0 -31
- data/spec/modules/version_number_spec.rb +0 -43
- data/spec/paper_trail/config_spec.rb +0 -33
- data/spec/paper_trail_spec.rb +0 -79
- data/spec/rails_helper.rb +0 -34
- data/spec/requests/articles_spec.rb +0 -34
- data/spec/spec_helper.rb +0 -114
- data/spec/support/alt_db_init.rb +0 -54
- data/test/custom_json_serializer.rb +0 -13
- data/test/dummy/Rakefile +0 -7
- data/test/dummy/app/controllers/application_controller.rb +0 -33
- data/test/dummy/app/controllers/articles_controller.rb +0 -20
- data/test/dummy/app/controllers/test_controller.rb +0 -5
- data/test/dummy/app/controllers/widgets_controller.rb +0 -32
- data/test/dummy/app/helpers/application_helper.rb +0 -2
- data/test/dummy/app/models/animal.rb +0 -6
- data/test/dummy/app/models/article.rb +0 -24
- data/test/dummy/app/models/authorship.rb +0 -5
- data/test/dummy/app/models/bar_habtm.rb +0 -4
- data/test/dummy/app/models/book.rb +0 -9
- data/test/dummy/app/models/boolit.rb +0 -4
- data/test/dummy/app/models/callback_modifier.rb +0 -45
- data/test/dummy/app/models/car.rb +0 -3
- data/test/dummy/app/models/cat.rb +0 -2
- data/test/dummy/app/models/chapter.rb +0 -9
- data/test/dummy/app/models/citation.rb +0 -5
- data/test/dummy/app/models/custom_primary_key_record.rb +0 -13
- data/test/dummy/app/models/customer.rb +0 -4
- data/test/dummy/app/models/document.rb +0 -4
- data/test/dummy/app/models/dog.rb +0 -2
- data/test/dummy/app/models/editor.rb +0 -4
- data/test/dummy/app/models/editorship.rb +0 -5
- data/test/dummy/app/models/elephant.rb +0 -3
- data/test/dummy/app/models/fluxor.rb +0 -3
- data/test/dummy/app/models/foo_habtm.rb +0 -5
- data/test/dummy/app/models/foo_widget.rb +0 -2
- data/test/dummy/app/models/fruit.rb +0 -5
- data/test/dummy/app/models/gadget.rb +0 -3
- data/test/dummy/app/models/kitchen/banana.rb +0 -5
- data/test/dummy/app/models/legacy_widget.rb +0 -4
- data/test/dummy/app/models/line_item.rb +0 -4
- data/test/dummy/app/models/not_on_update.rb +0 -4
- data/test/dummy/app/models/order.rb +0 -5
- data/test/dummy/app/models/paragraph.rb +0 -5
- data/test/dummy/app/models/person.rb +0 -38
- data/test/dummy/app/models/post.rb +0 -3
- data/test/dummy/app/models/post_with_status.rb +0 -8
- data/test/dummy/app/models/protected_widget.rb +0 -3
- data/test/dummy/app/models/quotation.rb +0 -5
- data/test/dummy/app/models/section.rb +0 -6
- data/test/dummy/app/models/skipper.rb +0 -6
- data/test/dummy/app/models/song.rb +0 -41
- data/test/dummy/app/models/thing.rb +0 -3
- data/test/dummy/app/models/translation.rb +0 -4
- data/test/dummy/app/models/truck.rb +0 -4
- data/test/dummy/app/models/vehicle.rb +0 -4
- data/test/dummy/app/models/whatchamajigger.rb +0 -4
- data/test/dummy/app/models/widget.rb +0 -16
- data/test/dummy/app/models/wotsit.rb +0 -8
- data/test/dummy/app/versions/custom_primary_key_record_version.rb +0 -3
- data/test/dummy/app/versions/joined_version.rb +0 -6
- data/test/dummy/app/versions/json_version.rb +0 -3
- data/test/dummy/app/versions/kitchen/banana_version.rb +0 -5
- data/test/dummy/app/versions/post_version.rb +0 -3
- data/test/dummy/app/views/layouts/application.html.erb +0 -14
- data/test/dummy/config.ru +0 -4
- data/test/dummy/config/application.rb +0 -80
- data/test/dummy/config/boot.rb +0 -10
- data/test/dummy/config/database.mysql.yml +0 -19
- data/test/dummy/config/database.postgres.yml +0 -15
- data/test/dummy/config/database.sqlite.yml +0 -15
- data/test/dummy/config/environment.rb +0 -5
- data/test/dummy/config/environments/development.rb +0 -41
- data/test/dummy/config/environments/production.rb +0 -74
- data/test/dummy/config/environments/test.rb +0 -51
- data/test/dummy/config/initializers/backtrace_silencers.rb +0 -9
- data/test/dummy/config/initializers/inflections.rb +0 -10
- data/test/dummy/config/initializers/mime_types.rb +0 -5
- data/test/dummy/config/initializers/paper_trail.rb +0 -9
- data/test/dummy/config/initializers/secret_token.rb +0 -9
- data/test/dummy/config/initializers/session_store.rb +0 -8
- data/test/dummy/config/locales/en.yml +0 -5
- data/test/dummy/config/routes.rb +0 -4
- data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +0 -361
- data/test/dummy/db/schema.rb +0 -288
- data/test/dummy/script/rails +0 -8
- data/test/functional/controller_test.rb +0 -90
- data/test/functional/enabled_for_controller_test.rb +0 -28
- data/test/functional/modular_sinatra_test.rb +0 -46
- data/test/functional/sinatra_test.rb +0 -51
- data/test/functional/thread_safety_test.rb +0 -46
- data/test/test_helper.rb +0 -127
- data/test/time_travel_helper.rb +0 -1
- data/test/unit/associations_test.rb +0 -1016
- data/test/unit/cleaner_test.rb +0 -188
- data/test/unit/inheritance_column_test.rb +0 -43
- data/test/unit/model_test.rb +0 -1489
- data/test/unit/protected_attrs_test.rb +0 -52
- data/test/unit/serializer_test.rb +0 -119
- data/test/unit/serializers/json_test.rb +0 -95
- data/test/unit/serializers/mixin_json_test.rb +0 -37
- data/test/unit/serializers/mixin_yaml_test.rb +0 -53
- data/test/unit/serializers/yaml_test.rb +0 -54
- data/test/unit/timestamp_test.rb +0 -41
- data/test/unit/version_test.rb +0 -119
data/spec/models/widget_spec.rb
DELETED
@@ -1,343 +0,0 @@
|
|
1
|
-
require "rails_helper"
|
2
|
-
|
3
|
-
describe Widget, type: :model do
|
4
|
-
describe "`be_versioned` matcher" do
|
5
|
-
it { is_expected.to be_versioned }
|
6
|
-
end
|
7
|
-
|
8
|
-
let(:widget) { Widget.create! name: "Bob", an_integer: 1 }
|
9
|
-
|
10
|
-
describe "`have_a_version_with` matcher", versioning: true do
|
11
|
-
before do
|
12
|
-
widget.update_attributes!(name: "Leonard", an_integer: 1)
|
13
|
-
widget.update_attributes!(name: "Tom")
|
14
|
-
widget.update_attributes!(name: "Bob")
|
15
|
-
end
|
16
|
-
|
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"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
describe "versioning option" do
|
25
|
-
context "enabled", versioning: true do
|
26
|
-
it "should enable versioning" do
|
27
|
-
expect(widget.versions.size).to eq(1)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
context "disabled (default)" do
|
32
|
-
it "should not enable versioning" do
|
33
|
-
expect(widget.versions.size).to eq(0)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe "Callbacks", versioning: true do
|
39
|
-
describe :before_save do
|
40
|
-
context ":on => :update" do
|
41
|
-
before { widget.update_attributes!(name: "Foobar") }
|
42
|
-
|
43
|
-
subject { widget.versions.last.reify }
|
44
|
-
|
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
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
describe :after_create do
|
55
|
-
let(:widget) { Widget.create!(name: "Foobar", created_at: Time.now - 1.week) }
|
56
|
-
|
57
|
-
it "corresponding version should use the widget's `updated_at`" do
|
58
|
-
expect(widget.versions.last.created_at.to_i).to eq(widget.updated_at.to_i)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
describe :after_update do
|
63
|
-
before { widget.update_attributes!(name: "Foobar", updated_at: Time.now + 1.week) }
|
64
|
-
|
65
|
-
subject { widget.versions.last.reify }
|
66
|
-
|
67
|
-
it { expect(subject.paper_trail).not_to be_live }
|
68
|
-
|
69
|
-
it "should clear the `versions_association_name` virtual attribute" do
|
70
|
-
subject.save!
|
71
|
-
expect(subject.paper_trail).to be_live
|
72
|
-
end
|
73
|
-
|
74
|
-
it "corresponding version should use the widget updated_at" do
|
75
|
-
expect(widget.versions.last.created_at.to_i).to eq(widget.updated_at.to_i)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
describe :after_destroy do
|
80
|
-
it "should create a version for that event" do
|
81
|
-
expect { widget.destroy }.to change(widget.versions, :count).by(1)
|
82
|
-
end
|
83
|
-
|
84
|
-
it "should assign the version into the `versions_association_name`" do
|
85
|
-
expect(widget.version).to be_nil
|
86
|
-
widget.destroy
|
87
|
-
expect(widget.version).not_to be_nil
|
88
|
-
expect(widget.version).to eq(widget.versions.last)
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
describe :after_rollback do
|
93
|
-
let(:rolled_back_name) { "Big Moo" }
|
94
|
-
|
95
|
-
before do
|
96
|
-
begin
|
97
|
-
widget.transaction do
|
98
|
-
widget.update_attributes!(name: rolled_back_name)
|
99
|
-
widget.update_attributes!(name: Widget::EXCLUDED_NAME)
|
100
|
-
end
|
101
|
-
rescue ActiveRecord::RecordInvalid
|
102
|
-
widget.reload
|
103
|
-
widget.name = nil
|
104
|
-
widget.save
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
it "does not create an event for changes that did not happen" do
|
109
|
-
widget.versions.map(&:changeset).each do |changeset|
|
110
|
-
expect(changeset.fetch("name", [])).to_not include(rolled_back_name)
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
it "has not yet loaded the assocation" do
|
115
|
-
expect(widget.versions).to_not be_loaded
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
describe "Association", versioning: true do
|
121
|
-
describe "sort order" do
|
122
|
-
it "should sort by the timestamp order from the `VersionConcern`" do
|
123
|
-
expect(widget.versions.to_sql).to eq(
|
124
|
-
widget.versions.reorder(PaperTrail::Version.timestamp_sort_order).to_sql
|
125
|
-
)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
if defined?(ActiveRecord::IdentityMap) && ActiveRecord::IdentityMap.respond_to?(:without)
|
131
|
-
describe "IdentityMap", versioning: true do
|
132
|
-
it "should not clobber the IdentityMap when reifying" do
|
133
|
-
widget.update_attributes name: "Henry", created_at: Time.now - 1.day
|
134
|
-
widget.update_attributes name: "Harry"
|
135
|
-
expect(ActiveRecord::IdentityMap).to receive(:without).once
|
136
|
-
widget.versions.last.reify
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
describe "Methods" do
|
142
|
-
describe "Instance", versioning: true do
|
143
|
-
describe "#create" do
|
144
|
-
it "creates a version record" do
|
145
|
-
wordget = Widget.create
|
146
|
-
assert_equal 1, wordget.versions.length
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
describe "#destroy" do
|
151
|
-
it "creates a version record" do
|
152
|
-
widget = Widget.create
|
153
|
-
assert_equal 1, widget.versions.length
|
154
|
-
widget.destroy
|
155
|
-
versions_for_widget = PaperTrail::Version.with_item_keys("Widget", widget.id)
|
156
|
-
assert_equal 2, versions_for_widget.length
|
157
|
-
end
|
158
|
-
|
159
|
-
it "can have multiple destruction records" do
|
160
|
-
versions = lambda { |widget|
|
161
|
-
# Workaround for AR 3. When we drop AR 3 support, we can simply use
|
162
|
-
# the `widget.versions` association, instead of `with_item_keys`.
|
163
|
-
PaperTrail::Version.with_item_keys("Widget", widget.id)
|
164
|
-
}
|
165
|
-
widget = Widget.create
|
166
|
-
assert_equal 1, widget.versions.length
|
167
|
-
widget.destroy
|
168
|
-
assert_equal 2, versions.call(widget).length
|
169
|
-
widget = widget.version.reify
|
170
|
-
widget.save
|
171
|
-
assert_equal 3, versions.call(widget).length
|
172
|
-
widget.destroy
|
173
|
-
assert_equal 4, versions.call(widget).length
|
174
|
-
assert_equal 2, versions.call(widget).where(event: "destroy").length
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
describe "#paper_trail.originator" do
|
179
|
-
describe "return value" do
|
180
|
-
let(:orig_name) { FFaker::Name.name }
|
181
|
-
let(:new_name) { FFaker::Name.name }
|
182
|
-
before { PaperTrail.whodunnit = orig_name }
|
183
|
-
|
184
|
-
context "accessed from live model instance" do
|
185
|
-
specify { expect(widget.paper_trail).to be_live }
|
186
|
-
|
187
|
-
it "should return the originator for the model at a given state" do
|
188
|
-
expect(widget.paper_trail.originator).to eq(orig_name)
|
189
|
-
widget.paper_trail.whodunnit(new_name) { |w|
|
190
|
-
w.update_attributes(name: "Elizabeth")
|
191
|
-
}
|
192
|
-
expect(widget.paper_trail.originator).to eq(new_name)
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
context "accessed from a reified model instance" do
|
197
|
-
before do
|
198
|
-
widget.update_attributes(name: "Andy")
|
199
|
-
PaperTrail.whodunnit = new_name
|
200
|
-
widget.update_attributes(name: "Elizabeth")
|
201
|
-
end
|
202
|
-
|
203
|
-
context "default behavior (no `options[:dup]` option passed in)" do
|
204
|
-
let(:reified_widget) { widget.versions[1].reify }
|
205
|
-
|
206
|
-
it "should return the appropriate originator" do
|
207
|
-
expect(reified_widget.paper_trail.originator).to eq(orig_name)
|
208
|
-
end
|
209
|
-
|
210
|
-
it "should not create a new model instance" do
|
211
|
-
expect(reified_widget).not_to be_new_record
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
context "creating a new instance (`options[:dup] == true`)" do
|
216
|
-
let(:reified_widget) { widget.versions[1].reify(dup: true) }
|
217
|
-
|
218
|
-
it "should return the appropriate originator" do
|
219
|
-
expect(reified_widget.paper_trail.originator).to eq(orig_name)
|
220
|
-
end
|
221
|
-
|
222
|
-
it "should not create a new model instance" do
|
223
|
-
expect(reified_widget).to be_new_record
|
224
|
-
end
|
225
|
-
end
|
226
|
-
end
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|
230
|
-
describe "#version_at" do
|
231
|
-
context "Timestamp argument is AFTER object has been destroyed" do
|
232
|
-
it "should return `nil`" do
|
233
|
-
widget.update_attribute(:name, "foobar")
|
234
|
-
widget.destroy
|
235
|
-
expect(widget.paper_trail.version_at(Time.now)).to be_nil
|
236
|
-
end
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
describe "#whodunnit" do
|
241
|
-
it { is_expected.to respond_to(:whodunnit) }
|
242
|
-
|
243
|
-
context "no block given" do
|
244
|
-
it "should raise an error" do
|
245
|
-
expect {
|
246
|
-
widget.paper_trail.whodunnit("Ben")
|
247
|
-
}.to raise_error(ArgumentError, "expected to receive a block")
|
248
|
-
end
|
249
|
-
end
|
250
|
-
|
251
|
-
context "block given" do
|
252
|
-
let(:orig_name) { FFaker::Name.name }
|
253
|
-
let(:new_name) { FFaker::Name.name }
|
254
|
-
|
255
|
-
before do
|
256
|
-
PaperTrail.whodunnit = orig_name
|
257
|
-
expect(widget.versions.last.whodunnit).to eq(orig_name) # persist `widget`
|
258
|
-
end
|
259
|
-
|
260
|
-
it "should modify value of `PaperTrail.whodunnit` while executing the block" do
|
261
|
-
widget.paper_trail.whodunnit(new_name) do
|
262
|
-
expect(PaperTrail.whodunnit).to eq(new_name)
|
263
|
-
widget.update_attributes(name: "Elizabeth")
|
264
|
-
end
|
265
|
-
expect(widget.versions.last.whodunnit).to eq(new_name)
|
266
|
-
end
|
267
|
-
|
268
|
-
context "after executing the block" do
|
269
|
-
it "reverts value of whodunnit to previous value" do
|
270
|
-
widget.paper_trail.whodunnit(new_name) { |w|
|
271
|
-
w.update_attributes(name: "Elizabeth")
|
272
|
-
}
|
273
|
-
expect(PaperTrail.whodunnit).to eq(orig_name)
|
274
|
-
end
|
275
|
-
end
|
276
|
-
|
277
|
-
context "error within block" do
|
278
|
-
it "still reverts the whodunnit value to previous value" do
|
279
|
-
expect {
|
280
|
-
widget.paper_trail.whodunnit(new_name) { raise }
|
281
|
-
}.to raise_error(RuntimeError)
|
282
|
-
expect(PaperTrail.whodunnit).to eq(orig_name)
|
283
|
-
end
|
284
|
-
end
|
285
|
-
end
|
286
|
-
end
|
287
|
-
|
288
|
-
describe "#touch_with_version" do
|
289
|
-
it "creates a version" do
|
290
|
-
count = widget.versions.size
|
291
|
-
# Travel 1 second because MySQL lacks sub-second resolution
|
292
|
-
Timecop.travel(1) do
|
293
|
-
widget.paper_trail.touch_with_version
|
294
|
-
end
|
295
|
-
expect(widget.versions.size).to eq(count + 1)
|
296
|
-
end
|
297
|
-
|
298
|
-
it "increments the `:updated_at` timestamp" do
|
299
|
-
time_was = widget.updated_at
|
300
|
-
# Travel 1 second because MySQL lacks sub-second resolution
|
301
|
-
Timecop.travel(1) do
|
302
|
-
widget.paper_trail.touch_with_version
|
303
|
-
end
|
304
|
-
expect(widget.updated_at).to be > time_was
|
305
|
-
end
|
306
|
-
end
|
307
|
-
|
308
|
-
describe "#update" do
|
309
|
-
it "creates a version record" do
|
310
|
-
widget = Widget.create
|
311
|
-
assert_equal 1, widget.versions.length
|
312
|
-
widget.update_attributes(name: "Bugle")
|
313
|
-
assert_equal 2, widget.versions.length
|
314
|
-
end
|
315
|
-
end
|
316
|
-
end
|
317
|
-
|
318
|
-
describe "Class" do
|
319
|
-
describe ".paper_trail.enabled?" do
|
320
|
-
it "returns true" do
|
321
|
-
expect(Widget.paper_trail.enabled?).to eq(true)
|
322
|
-
end
|
323
|
-
end
|
324
|
-
|
325
|
-
describe ".disable" do
|
326
|
-
it "should set the `paper_trail.enabled?` to `false`" do
|
327
|
-
expect(Widget.paper_trail.enabled?).to eq(true)
|
328
|
-
Widget.paper_trail.disable
|
329
|
-
expect(Widget.paper_trail.enabled?).to eq(false)
|
330
|
-
end
|
331
|
-
end
|
332
|
-
|
333
|
-
describe ".enable" do
|
334
|
-
it "should set the `paper_trail.enabled?` to `true`" do
|
335
|
-
Widget.paper_trail.disable
|
336
|
-
expect(Widget.paper_trail.enabled?).to eq(false)
|
337
|
-
Widget.paper_trail.enable
|
338
|
-
expect(Widget.paper_trail.enabled?).to eq(true)
|
339
|
-
end
|
340
|
-
end
|
341
|
-
end
|
342
|
-
end
|
343
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require "rails_helper"
|
2
|
-
|
3
|
-
describe PaperTrail, type: :module, versioning: true do
|
4
|
-
describe "#config" do
|
5
|
-
it { is_expected.to respond_to(:config) }
|
6
|
-
|
7
|
-
it "should allow for config values to be set" do
|
8
|
-
expect(subject.config.enabled).to eq(true)
|
9
|
-
subject.config.enabled = false
|
10
|
-
expect(subject.config.enabled).to eq(false)
|
11
|
-
end
|
12
|
-
|
13
|
-
it "should accept blocks and yield the config instance" do
|
14
|
-
expect(subject.config.enabled).to eq(true)
|
15
|
-
subject.config { |c| c.enabled = false }
|
16
|
-
expect(subject.config.enabled).to eq(false)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe "#configure" do
|
21
|
-
it { is_expected.to respond_to(:configure) }
|
22
|
-
|
23
|
-
it "should be an alias for the `config` method" do
|
24
|
-
expect(subject.method(:configure)).to eq(subject.method(:config))
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
require "rails_helper"
|
2
|
-
|
3
|
-
describe PaperTrail::VersionConcern do
|
4
|
-
before(:all) { require "support/alt_db_init" }
|
5
|
-
|
6
|
-
it "allows included class to have different connections" do
|
7
|
-
expect(Foo::Version.connection).not_to eq(Bar::Version.connection)
|
8
|
-
end
|
9
|
-
|
10
|
-
it "allows custom version class to share connection with superclass" do
|
11
|
-
expect(Foo::Version.connection).to eq(Foo::Document.connection)
|
12
|
-
expect(Bar::Version.connection).to eq(Bar::Document.connection)
|
13
|
-
end
|
14
|
-
|
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")
|
18
|
-
end
|
19
|
-
|
20
|
-
describe "persistence", versioning: true do
|
21
|
-
before do
|
22
|
-
@foo_doc = Foo::Document.create!(name: "foobar")
|
23
|
-
@bar_doc = Bar::Document.create!(name: "raboof")
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should store versions in the correct corresponding db location" do
|
27
|
-
expect(@foo_doc.versions.first).to be_instance_of(Foo::Version)
|
28
|
-
expect(@bar_doc.versions.first).to be_instance_of(Bar::Version)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe PaperTrail::VERSION do
|
4
|
-
describe "Constants" do
|
5
|
-
subject { PaperTrail::VERSION }
|
6
|
-
|
7
|
-
describe :MAJOR do
|
8
|
-
it { is_expected.to be_const_defined(:MAJOR) }
|
9
|
-
it { expect(subject::MAJOR).to be_a(Integer) }
|
10
|
-
end
|
11
|
-
describe :MINOR do
|
12
|
-
it { is_expected.to be_const_defined(:MINOR) }
|
13
|
-
it { expect(subject::MINOR).to be_a(Integer) }
|
14
|
-
end
|
15
|
-
describe :TINY do
|
16
|
-
it { is_expected.to be_const_defined(:TINY) }
|
17
|
-
it { expect(subject::TINY).to be_a(Integer) }
|
18
|
-
end
|
19
|
-
describe :PRE do
|
20
|
-
it { is_expected.to be_const_defined(:PRE) }
|
21
|
-
if PaperTrail::VERSION::PRE
|
22
|
-
it { expect(subject::PRE).to be_instance_of(String) }
|
23
|
-
end
|
24
|
-
end
|
25
|
-
describe :STRING do
|
26
|
-
it { is_expected.to be_const_defined(:STRING) }
|
27
|
-
it { expect(subject::STRING).to be_instance_of(String) }
|
28
|
-
|
29
|
-
it "should join the numbers into a period separated string" do
|
30
|
-
expect(subject::STRING).to eq(
|
31
|
-
[subject::MAJOR, subject::MINOR, subject::TINY, subject::PRE].compact.join(".")
|
32
|
-
)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe PaperTrail do
|
39
|
-
describe "#version" do
|
40
|
-
it { is_expected.to respond_to(:version) }
|
41
|
-
it { expect(subject.version).to eq(PaperTrail::VERSION::STRING) }
|
42
|
-
end
|
43
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
require "rails_helper"
|
2
|
-
|
3
|
-
module PaperTrail
|
4
|
-
RSpec.describe Config do
|
5
|
-
describe ".instance" do
|
6
|
-
it "returns the singleton instance" do
|
7
|
-
expect { described_class.instance }.to_not raise_error
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
describe ".new" do
|
12
|
-
it "raises NoMethodError" do
|
13
|
-
expect { described_class.new }.to raise_error(NoMethodError)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
describe "track_associations?" do
|
18
|
-
context "@track_associations is nil" do
|
19
|
-
after do
|
20
|
-
PaperTrail.config.track_associations = true
|
21
|
-
end
|
22
|
-
|
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
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|