paper_trail 6.0.2 → 7.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.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CONTRIBUTING.md +20 -0
  3. data/.rubocop.yml +30 -2
  4. data/.rubocop_todo.yml +20 -0
  5. data/.travis.yml +3 -5
  6. data/Appraisals +5 -6
  7. data/CHANGELOG.md +33 -0
  8. data/README.md +43 -81
  9. data/Rakefile +1 -1
  10. data/doc/bug_report_template.rb +4 -2
  11. data/gemfiles/ar_4.0.gemfile +7 -0
  12. data/gemfiles/ar_4.2.gemfile +0 -1
  13. data/lib/generators/paper_trail/templates/create_version_associations.rb +1 -1
  14. data/lib/generators/paper_trail/templates/create_versions.rb +1 -1
  15. data/lib/paper_trail.rb +7 -9
  16. data/lib/paper_trail/config.rb +0 -15
  17. data/lib/paper_trail/frameworks/rspec.rb +8 -2
  18. data/lib/paper_trail/model_config.rb +6 -2
  19. data/lib/paper_trail/record_trail.rb +3 -1
  20. data/lib/paper_trail/reifier.rb +43 -354
  21. data/lib/paper_trail/reifiers/belongs_to.rb +48 -0
  22. data/lib/paper_trail/reifiers/has_and_belongs_to_many.rb +50 -0
  23. data/lib/paper_trail/reifiers/has_many.rb +110 -0
  24. data/lib/paper_trail/reifiers/has_many_through.rb +90 -0
  25. data/lib/paper_trail/reifiers/has_one.rb +76 -0
  26. data/lib/paper_trail/serializers/yaml.rb +2 -25
  27. data/lib/paper_trail/version_concern.rb +5 -5
  28. data/lib/paper_trail/version_number.rb +7 -3
  29. data/paper_trail.gemspec +7 -34
  30. data/spec/controllers/articles_controller_spec.rb +1 -1
  31. data/spec/generators/install_generator_spec.rb +40 -34
  32. data/spec/models/animal_spec.rb +50 -25
  33. data/spec/models/boolit_spec.rb +8 -7
  34. data/spec/models/callback_modifier_spec.rb +13 -13
  35. data/spec/models/document_spec.rb +21 -0
  36. data/spec/models/gadget_spec.rb +35 -39
  37. data/spec/models/joined_version_spec.rb +4 -4
  38. data/spec/models/json_version_spec.rb +14 -15
  39. data/spec/models/not_on_update_spec.rb +1 -1
  40. data/spec/models/post_with_status_spec.rb +2 -2
  41. data/spec/models/skipper_spec.rb +4 -4
  42. data/spec/models/thing_spec.rb +1 -1
  43. data/spec/models/truck_spec.rb +1 -1
  44. data/spec/models/vehicle_spec.rb +1 -1
  45. data/spec/models/version_spec.rb +152 -168
  46. data/spec/models/widget_spec.rb +170 -196
  47. data/spec/modules/paper_trail_spec.rb +3 -3
  48. data/spec/modules/version_concern_spec.rb +5 -8
  49. data/spec/modules/version_number_spec.rb +11 -36
  50. data/spec/paper_trail/cleaner_spec.rb +152 -0
  51. data/spec/paper_trail/config_spec.rb +1 -1
  52. data/spec/paper_trail/serializers/custom_yaml_serializer_spec.rb +45 -0
  53. data/spec/paper_trail/serializers/json_spec.rb +57 -0
  54. data/spec/paper_trail/version_limit_spec.rb +55 -0
  55. data/spec/paper_trail_spec.rb +45 -32
  56. data/spec/requests/articles_spec.rb +4 -4
  57. data/test/dummy/app/models/custom_primary_key_record.rb +4 -2
  58. data/test/dummy/app/models/document.rb +1 -1
  59. data/test/dummy/app/models/not_on_update.rb +1 -1
  60. data/test/dummy/app/models/on/create.rb +6 -0
  61. data/test/dummy/app/models/on/destroy.rb +6 -0
  62. data/test/dummy/app/models/on/empty_array.rb +6 -0
  63. data/test/dummy/app/models/on/update.rb +6 -0
  64. data/test/dummy/app/models/person.rb +1 -0
  65. data/test/dummy/app/models/song.rb +19 -28
  66. data/test/dummy/config/application.rb +10 -43
  67. data/test/dummy/config/routes.rb +1 -1
  68. data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +25 -51
  69. data/test/dummy/db/schema.rb +29 -19
  70. data/test/test_helper.rb +0 -16
  71. data/test/unit/associations_test.rb +81 -81
  72. data/test/unit/model_test.rb +48 -131
  73. data/test/unit/serializer_test.rb +34 -45
  74. data/test/unit/serializers/mixin_json_test.rb +3 -1
  75. data/test/unit/serializers/yaml_test.rb +1 -5
  76. metadata +44 -19
  77. data/lib/paper_trail/frameworks/sinatra.rb +0 -40
  78. data/test/functional/modular_sinatra_test.rb +0 -46
  79. data/test/functional/sinatra_test.rb +0 -51
  80. data/test/unit/cleaner_test.rb +0 -151
  81. data/test/unit/inheritance_column_test.rb +0 -41
  82. data/test/unit/serializers/json_test.rb +0 -95
  83. data/test/unit/serializers/mixin_yaml_test.rb +0 -53
@@ -15,19 +15,19 @@ describe JoinedVersion, type: :model, versioning: true do
15
15
  before { widget } # persist a widget
16
16
 
17
17
  describe "#subsequent" do
18
- it "shouldn't error out when there is a default_scope that joins" do
18
+ it "does not raise error when there is a default_scope that joins" do
19
19
  JoinedVersion.subsequent(version).first
20
20
  end
21
21
  end
22
22
 
23
23
  describe "#preceding" do
24
- it "shouldn't error out when there is a default scope that joins" do
24
+ it "does not raise error when there is a default scope that joins" do
25
25
  JoinedVersion.preceding(version).first
26
26
  end
27
27
  end
28
28
 
29
29
  describe "#between" do
30
- it "shouldn't error out when there is a default scope that joins" do
30
+ it "does not raise error when there is a default scope that joins" do
31
31
  JoinedVersion.between(Time.now, 1.minute.from_now).first
32
32
  end
33
33
  end
@@ -38,7 +38,7 @@ describe JoinedVersion, type: :model, versioning: true do
38
38
  describe "#index" do
39
39
  it { is_expected.to respond_to(:index) }
40
40
 
41
- it "shouldn't error out when there is a default scope that joins" do
41
+ it "does not raise error when there is a default scope that joins" do
42
42
  widget # persist a widget
43
43
  version.index
44
44
  end
@@ -3,16 +3,15 @@ require "rails_helper"
3
3
  # The `json_versions` table tests postgres' `json` data type. So, that
4
4
  # table is only created when testing against postgres and ActiveRecord >= 4.
5
5
  if JsonVersion.table_exists?
6
-
7
- describe JsonVersion, type: :model do
8
- it "should include the `VersionConcern` module to get base functionality" do
9
- expect(JsonVersion).to include(PaperTrail::VersionConcern)
6
+ RSpec.describe JsonVersion, type: :model do
7
+ it "includes the VersionConcern module" do
8
+ expect(described_class).to include(PaperTrail::VersionConcern)
10
9
  end
11
10
 
12
11
  describe "Methods" do
13
12
  describe "Class" do
14
13
  describe "#where_object" do
15
- it { expect(JsonVersion).to respond_to(:where_object) }
14
+ it { expect(described_class).to respond_to(:where_object) }
16
15
 
17
16
  it "escapes values" do
18
17
  f = Fruit.create(name: "Bobby")
@@ -25,9 +24,9 @@ if JsonVersion.table_exists?
25
24
  end
26
25
 
27
26
  context "invalid arguments" do
28
- it "should raise an error" do
29
- expect { JsonVersion.where_object(:foo) }.to raise_error(ArgumentError)
30
- expect { JsonVersion.where_object([]) }.to raise_error(ArgumentError)
27
+ it "raises an error" do
28
+ expect { described_class.where_object(:foo) }.to raise_error(ArgumentError)
29
+ expect { described_class.where_object([]) }.to raise_error(ArgumentError)
31
30
  end
32
31
  end
33
32
 
@@ -43,15 +42,15 @@ if JsonVersion.table_exists?
43
42
  fruit.update_attributes!(name: fruit_names.sample, color: FFaker::Color.name)
44
43
  end
45
44
 
46
- it "should be able to locate versions according to their `object` contents" do
47
- expect(JsonVersion.where_object(name: name)).to eq([fruit.versions[1]])
48
- expect(JsonVersion.where_object(color: color)).to eq([fruit.versions[2]])
45
+ it "locates versions according to their `object` contents" do
46
+ expect(described_class.where_object(name: name)).to eq([fruit.versions[1]])
47
+ expect(described_class.where_object(color: color)).to eq([fruit.versions[2]])
49
48
  end
50
49
  end
51
50
  end
52
51
 
53
52
  describe "#where_object_changes" do
54
- it { expect(JsonVersion).to respond_to(:where_object_changes) }
53
+ it { expect(described_class).to respond_to(:where_object_changes) }
55
54
 
56
55
  it "escapes values" do
57
56
  f = Fruit.create(name: "Bobby")
@@ -64,9 +63,9 @@ if JsonVersion.table_exists?
64
63
  end
65
64
 
66
65
  context "invalid arguments" do
67
- it "should raise an error" do
68
- expect { JsonVersion.where_object_changes(:foo) }.to raise_error(ArgumentError)
69
- expect { JsonVersion.where_object_changes([]) }.to raise_error(ArgumentError)
66
+ it "raises an error" do
67
+ expect { described_class.where_object_changes(:foo) }.to raise_error(ArgumentError)
68
+ expect { described_class.where_object_changes([]) }.to raise_error(ArgumentError)
70
69
  end
71
70
  end
72
71
 
@@ -4,7 +4,7 @@ describe NotOnUpdate, type: :model do
4
4
  describe "#touch_with_version", versioning: true do
5
5
  let!(:record) { described_class.create! }
6
6
 
7
- it "should create a version, regardless" do
7
+ it "creates a version, regardless" do
8
8
  expect { record.paper_trail.touch_with_version }.to change {
9
9
  PaperTrail::Version.count
10
10
  }.by(+1)
@@ -4,7 +4,7 @@ describe PostWithStatus, type: :model do
4
4
  with_versioning do
5
5
  let(:post) { described_class.create!(status: "draft") }
6
6
 
7
- it "should stash the enum value properly in versions" do
7
+ it "saves the enum value in versions" do
8
8
  post.published!
9
9
  post.archived!
10
10
  expect(post.paper_trail.previous_version.published?).to be true
@@ -23,7 +23,7 @@ describe PostWithStatus, type: :model do
23
23
  context "storing enum object_changes" do
24
24
  subject { post.versions.last }
25
25
 
26
- it "should stash the enum value properly in versions object_changes" do
26
+ it "saves the enum value properly in versions object_changes" do
27
27
  post.published!
28
28
  post.archived!
29
29
  expect(subject.changeset["status"]).to eql %w(published archived)
@@ -9,11 +9,11 @@ describe Skipper, type: :model do
9
9
  let(:t1) { Time.zone.local(2015, 7, 15, 20, 34, 0) }
10
10
  let(:t2) { Time.zone.local(2015, 7, 15, 20, 34, 30) }
11
11
 
12
- it "should not create a version" do
12
+ it "does not create a version" do
13
13
  skipper = Skipper.create!(another_timestamp: t1)
14
14
  expect {
15
15
  skipper.update_attributes!(another_timestamp: t2)
16
- }.to_not change { skipper.versions.length }
16
+ }.not_to(change { skipper.versions.length })
17
17
  end
18
18
  end
19
19
  end
@@ -24,7 +24,7 @@ describe Skipper, type: :model do
24
24
  let(:t2) { Time.zone.local(2015, 7, 15, 20, 34, 30) }
25
25
 
26
26
  context "without preserve (default)" do
27
- it "should have no timestamp" do
27
+ it "has no timestamp" do
28
28
  skipper = Skipper.create!(another_timestamp: t1)
29
29
  skipper.update_attributes!(another_timestamp: t2, name: "Foobar")
30
30
  skipper = skipper.versions.last.reify
@@ -33,7 +33,7 @@ describe Skipper, type: :model do
33
33
  end
34
34
 
35
35
  context "with preserve" do
36
- it "should preserve its timestamp" do
36
+ it "preserves its timestamp" do
37
37
  skipper = Skipper.create!(another_timestamp: t1)
38
38
  skipper.update_attributes!(another_timestamp: t2, name: "Foobar")
39
39
  skipper = skipper.versions.last.reify(unversioned_attributes: :preserve)
@@ -3,7 +3,7 @@ require "rails_helper"
3
3
  describe Thing, type: :model do
4
4
  it { is_expected.to be_versioned }
5
5
 
6
- describe "should not store object_changes", versioning: true do
6
+ describe "does not store object_changes", versioning: true do
7
7
  let(:thing) { Thing.create(name: "pencil") }
8
8
 
9
9
  it { expect(thing.versions.last.object_changes).to be_nil }
@@ -1,5 +1,5 @@
1
1
  require "rails_helper"
2
2
 
3
3
  describe Truck, type: :model do
4
- it { is_expected.to_not be_versioned }
4
+ it { is_expected.not_to be_versioned }
5
5
  end
@@ -1,5 +1,5 @@
1
1
  require "rails_helper"
2
2
 
3
3
  describe Vehicle, type: :model do
4
- it { is_expected.to_not be_versioned }
4
+ it { is_expected.not_to be_versioned }
5
5
  end
@@ -1,7 +1,7 @@
1
1
  require "rails_helper"
2
2
 
3
3
  describe PaperTrail::Version, type: :model do
4
- it "should include the `VersionConcern` module to get base functionality" do
4
+ it "includes the VersionConcern module" do
5
5
  expect(PaperTrail::Version).to include(PaperTrail::VersionConcern)
6
6
  end
7
7
 
@@ -13,7 +13,7 @@ describe PaperTrail::Version, type: :model do
13
13
  context "serializer is YAML" do
14
14
  specify { expect(PaperTrail.serializer).to be PaperTrail::Serializers::YAML }
15
15
 
16
- it "should store out as a plain hash" do
16
+ it "store out as a plain hash" do
17
17
  expect(value =~ /HashWithIndifferentAccess/).to be_nil
18
18
  end
19
19
  end
@@ -21,7 +21,7 @@ describe PaperTrail::Version, type: :model do
21
21
  context "serializer is JSON" do
22
22
  before(:all) { PaperTrail.serializer = PaperTrail::Serializers::JSON }
23
23
 
24
- it "should store out as a plain hash" do
24
+ it "store out as a plain hash" do
25
25
  expect(value =~ /HashWithIndifferentAccess/).to be_nil
26
26
  end
27
27
 
@@ -35,43 +35,41 @@ describe PaperTrail::Version, type: :model do
35
35
  subject { PaperTrail::Version.new }
36
36
 
37
37
  describe "#paper_trail_originator" do
38
- it { is_expected.to respond_to(:paper_trail_originator) }
39
-
40
38
  context "No previous versions" do
41
39
  specify { expect(subject.previous).to be_nil }
42
40
 
43
- it "should return nil" do
41
+ it "return nil" do
44
42
  expect(subject.paper_trail_originator).to be_nil
45
43
  end
46
44
  end
47
45
 
48
46
  context "Has previous version", versioning: true do
47
+ subject { widget.versions.last }
48
+
49
49
  let(:name) { FFaker::Name.name }
50
50
  let(:widget) { Widget.create!(name: FFaker::Name.name) }
51
+
51
52
  before do
52
53
  widget.versions.first.update_attributes!(whodunnit: name)
53
54
  widget.update_attributes!(name: FFaker::Name.first_name)
54
55
  end
55
- subject { widget.versions.last }
56
56
 
57
57
  specify { expect(subject.previous).to be_instance_of(PaperTrail::Version) }
58
58
 
59
- it "should return nil" do
59
+ it "return nil" do
60
60
  expect(subject.paper_trail_originator).to eq(name)
61
61
  end
62
62
  end
63
63
  end
64
64
 
65
65
  describe "#originator" do
66
- it { is_expected.to respond_to(:originator) }
67
-
68
- it "should set the invoke `paper_trail_originator`" do
66
+ it "sets the invoke `paper_trail_originator`" do
69
67
  allow(ActiveSupport::Deprecation).to receive(:warn)
70
68
  is_expected.to receive(:paper_trail_originator)
71
69
  subject.originator
72
70
  end
73
71
 
74
- it "should display a deprecation warning" do
72
+ it "displays a deprecation warning" do
75
73
  expect(ActiveSupport::Deprecation).to receive(:warn).
76
74
  with(/Use paper_trail_originator instead of originator/)
77
75
  subject.originator
@@ -79,10 +77,9 @@ describe PaperTrail::Version, type: :model do
79
77
  end
80
78
 
81
79
  describe "#terminator" do
82
- let(:attributes) { { whodunnit: FFaker::Name.first_name } }
83
80
  subject { PaperTrail::Version.new attributes }
84
81
 
85
- it { is_expected.to respond_to(:terminator) }
82
+ let(:attributes) { { whodunnit: FFaker::Name.first_name } }
86
83
 
87
84
  it "is an alias for the `whodunnit` attribute" do
88
85
  expect(subject.terminator).to eq(attributes[:whodunnit])
@@ -90,180 +87,167 @@ describe PaperTrail::Version, type: :model do
90
87
  end
91
88
 
92
89
  describe "#version_author" do
93
- it { is_expected.to respond_to(:version_author) }
94
-
95
- it "should be an alias for the `terminator` method" do
90
+ it "is an alias for the `terminator` method" do
96
91
  expect(subject.method(:version_author)).to eq(subject.method(:terminator))
97
92
  end
98
93
  end
99
94
  end
100
95
 
101
- describe "Class" do
102
- column_overrides = [false]
103
- if ENV["DB"] == "postgres" && ::ActiveRecord::VERSION::MAJOR >= 4
104
- column_overrides << "json"
105
- # 'jsonb' column types are only supported for ActiveRecord 4.2+
106
- column_overrides << "jsonb" if ::ActiveRecord::VERSION::STRING >= "4.2"
107
- end
96
+ column_overrides = [false]
97
+ if ENV["DB"] == "postgres" && ::ActiveRecord::VERSION::MAJOR >= 4
98
+ column_overrides << "json"
99
+ # 'jsonb' column types are only supported for ActiveRecord 4.2+
100
+ column_overrides << "jsonb" if ::ActiveRecord::VERSION::STRING >= "4.2"
101
+ end
102
+
103
+ column_overrides.shuffle.each do |override|
104
+ context "with a #{override || 'text'} column" do
105
+ before do
106
+ if override
107
+ ActiveRecord::Base.connection.execute("SAVEPOINT pgtest;")
108
+ %w(object object_changes).each do |column|
109
+ ActiveRecord::Base.connection.execute(
110
+ "ALTER TABLE versions DROP COLUMN #{column};"
111
+ )
112
+ ActiveRecord::Base.connection.execute(
113
+ "ALTER TABLE versions ADD COLUMN #{column} #{override};"
114
+ )
115
+ end
116
+ PaperTrail::Version.reset_column_information
117
+ end
118
+ end
119
+
120
+ after do
121
+ if override
122
+ ActiveRecord::Base.connection.execute("ROLLBACK TO SAVEPOINT pgtest;")
123
+ PaperTrail::Version.reset_column_information
124
+ end
125
+ end
126
+
127
+ describe "#where_object", versioning: true do
128
+ let(:widget) { Widget.new }
129
+ let(:name) { FFaker::Name.first_name }
130
+ let(:int) { rand(10) + 1 }
108
131
 
109
- column_overrides.shuffle.each do |override|
110
- context "with a #{override || 'text'} column" do
111
132
  before do
112
- if override
113
- ActiveRecord::Base.connection.execute("SAVEPOINT pgtest;")
114
- %w(object object_changes).each do |column|
115
- ActiveRecord::Base.connection.execute(
116
- "ALTER TABLE versions DROP COLUMN #{column};"
117
- )
118
- ActiveRecord::Base.connection.execute(
119
- "ALTER TABLE versions ADD COLUMN #{column} #{override};"
120
- )
121
- end
122
- PaperTrail::Version.reset_column_information
133
+ widget.update_attributes!(name: name, an_integer: int)
134
+ widget.update_attributes!(name: "foobar", an_integer: 100)
135
+ widget.update_attributes!(name: FFaker::Name.last_name, an_integer: 15)
136
+ end
137
+
138
+ it "requires its argument to be a Hash" do
139
+ expect {
140
+ PaperTrail::Version.where_object(:foo)
141
+ }.to raise_error(ArgumentError)
142
+ expect {
143
+ PaperTrail::Version.where_object([])
144
+ }.to raise_error(ArgumentError)
145
+ end
146
+
147
+ context "`serializer == YAML`" do
148
+ specify do
149
+ expect(PaperTrail.serializer).to be PaperTrail::Serializers::YAML
150
+ end
151
+
152
+ it "locates versions according to their `object` contents" do
153
+ expect(
154
+ PaperTrail::Version.where_object(name: name)
155
+ ).to eq([widget.versions[1]])
156
+ expect(
157
+ PaperTrail::Version.where_object(an_integer: 100)
158
+ ).to eq([widget.versions[2]])
123
159
  end
124
160
  end
125
- after do
126
- if override
127
- ActiveRecord::Base.connection.execute("ROLLBACK TO SAVEPOINT pgtest;")
128
- PaperTrail::Version.reset_column_information
161
+
162
+ context "JSON serializer" do
163
+ before(:all) do
164
+ PaperTrail.serializer = PaperTrail::Serializers::JSON
165
+ end
166
+
167
+ specify do
168
+ expect(PaperTrail.serializer).to be PaperTrail::Serializers::JSON
169
+ end
170
+
171
+ it "locates versions according to their `object` contents" do
172
+ expect(
173
+ PaperTrail::Version.where_object(name: name)
174
+ ).to eq([widget.versions[1]])
175
+ expect(
176
+ PaperTrail::Version.where_object(an_integer: 100)
177
+ ).to eq([widget.versions[2]])
129
178
  end
179
+
180
+ after(:all) do
181
+ PaperTrail.serializer = PaperTrail::Serializers::YAML
182
+ end
183
+ end
184
+ end
185
+
186
+ describe "#where_object_changes", versioning: true do
187
+ let(:widget) { Widget.new }
188
+ let(:name) { FFaker::Name.first_name }
189
+ let(:int) { rand(5) + 2 }
190
+
191
+ before do
192
+ widget.update_attributes!(name: name, an_integer: 0)
193
+ widget.update_attributes!(name: "foobar", an_integer: 77)
194
+ widget.update_attributes!(name: FFaker::Name.last_name, an_integer: int)
130
195
  end
131
196
 
132
- describe "#where_object" do
133
- it { expect(PaperTrail::Version).to respond_to(:where_object) }
134
-
135
- context "invalid arguments" do
136
- it "should raise an error" do
137
- expect {
138
- PaperTrail::Version.where_object(:foo)
139
- }.to raise_error(ArgumentError)
140
- expect {
141
- PaperTrail::Version.where_object([])
142
- }.to raise_error(ArgumentError)
143
- end
197
+ it "requires its argument to be a Hash" do
198
+ expect {
199
+ PaperTrail::Version.where_object_changes(:foo)
200
+ }.to raise_error(ArgumentError)
201
+ expect {
202
+ PaperTrail::Version.where_object_changes([])
203
+ }.to raise_error(ArgumentError)
204
+ end
205
+
206
+ context "YAML serializer" do
207
+ specify { expect(PaperTrail.serializer).to be PaperTrail::Serializers::YAML }
208
+
209
+ it "locates versions according to their `object_changes` contents" do
210
+ expect(
211
+ widget.versions.where_object_changes(name: name)
212
+ ).to eq(widget.versions[0..1])
213
+ expect(
214
+ widget.versions.where_object_changes(an_integer: 77)
215
+ ).to eq(widget.versions[1..2])
216
+ expect(
217
+ widget.versions.where_object_changes(an_integer: int)
218
+ ).to eq([widget.versions.last])
144
219
  end
145
220
 
146
- context "valid arguments", versioning: true do
147
- let(:widget) { Widget.new }
148
- let(:name) { FFaker::Name.first_name }
149
- let(:int) { rand(10) + 1 }
150
-
151
- before do
152
- widget.update_attributes!(name: name, an_integer: int)
153
- widget.update_attributes!(name: "foobar", an_integer: 100)
154
- widget.update_attributes!(name: FFaker::Name.last_name, an_integer: 15)
155
- end
156
-
157
- context "`serializer == YAML`" do
158
- specify do
159
- expect(PaperTrail.serializer).to be PaperTrail::Serializers::YAML
160
- end
161
-
162
- it "should be able to locate versions according to their `object` contents" do
163
- expect(
164
- PaperTrail::Version.where_object(name: name)
165
- ).to eq([widget.versions[1]])
166
- expect(
167
- PaperTrail::Version.where_object(an_integer: 100)
168
- ).to eq([widget.versions[2]])
169
- end
170
- end
171
-
172
- context "JSON serializer" do
173
- before(:all) do
174
- PaperTrail.serializer = PaperTrail::Serializers::JSON
175
- end
176
-
177
- specify do
178
- expect(PaperTrail.serializer).to be PaperTrail::Serializers::JSON
179
- end
180
-
181
- it "should be able to locate versions according to their `object` contents" do
182
- expect(
183
- PaperTrail::Version.where_object(name: name)
184
- ).to eq([widget.versions[1]])
185
- expect(
186
- PaperTrail::Version.where_object(an_integer: 100)
187
- ).to eq([widget.versions[2]])
188
- end
189
-
190
- after(:all) do
191
- PaperTrail.serializer = PaperTrail::Serializers::YAML
192
- end
193
- end
221
+ it "handles queries for multiple attributes" do
222
+ expect(
223
+ widget.versions.where_object_changes(an_integer: 77, name: "foobar")
224
+ ).to eq(widget.versions[1..2])
194
225
  end
195
226
  end
196
227
 
197
- describe "#where_object_changes" do
198
- context "invalid arguments" do
199
- it "should raise an error" do
200
- expect {
201
- PaperTrail::Version.where_object_changes(:foo)
202
- }.to raise_error(ArgumentError)
203
- expect {
204
- PaperTrail::Version.where_object_changes([])
205
- }.to raise_error(ArgumentError)
206
- end
228
+ context "JSON serializer" do
229
+ before(:all) { PaperTrail.serializer = PaperTrail::Serializers::JSON }
230
+ specify { expect(PaperTrail.serializer).to be PaperTrail::Serializers::JSON }
231
+
232
+ it "locates versions according to their `object_changes` contents" do
233
+ expect(
234
+ widget.versions.where_object_changes(name: name)
235
+ ).to eq(widget.versions[0..1])
236
+ expect(
237
+ widget.versions.where_object_changes(an_integer: 77)
238
+ ).to eq(widget.versions[1..2])
239
+ expect(
240
+ widget.versions.where_object_changes(an_integer: int)
241
+ ).to eq([widget.versions.last])
207
242
  end
208
243
 
209
- context "valid arguments", versioning: true do
210
- let(:widget) { Widget.new }
211
- let(:name) { FFaker::Name.first_name }
212
- let(:int) { rand(5) + 2 }
213
-
214
- before do
215
- widget.update_attributes!(name: name, an_integer: 0)
216
- widget.update_attributes!(name: "foobar", an_integer: 77)
217
- widget.update_attributes!(name: FFaker::Name.last_name, an_integer: int)
218
- end
219
-
220
- context "YAML serializer" do
221
- specify { expect(PaperTrail.serializer).to be PaperTrail::Serializers::YAML }
222
-
223
- it "locates versions according to their `object_changes` contents" do
224
- expect(
225
- widget.versions.where_object_changes(name: name)
226
- ).to eq(widget.versions[0..1])
227
- expect(
228
- widget.versions.where_object_changes(an_integer: 77)
229
- ).to eq(widget.versions[1..2])
230
- expect(
231
- widget.versions.where_object_changes(an_integer: int)
232
- ).to eq([widget.versions.last])
233
- end
234
-
235
- it "handles queries for multiple attributes" do
236
- expect(
237
- widget.versions.where_object_changes(an_integer: 77, name: "foobar")
238
- ).to eq(widget.versions[1..2])
239
- end
240
- end
241
-
242
- context "JSON serializer" do
243
- before(:all) { PaperTrail.serializer = PaperTrail::Serializers::JSON }
244
- specify { expect(PaperTrail.serializer).to be PaperTrail::Serializers::JSON }
245
-
246
- it "locates versions according to their `object_changes` contents" do
247
- expect(
248
- widget.versions.where_object_changes(name: name)
249
- ).to eq(widget.versions[0..1])
250
- expect(
251
- widget.versions.where_object_changes(an_integer: 77)
252
- ).to eq(widget.versions[1..2])
253
- expect(
254
- widget.versions.where_object_changes(an_integer: int)
255
- ).to eq([widget.versions.last])
256
- end
257
-
258
- it "handles queries for multiple attributes" do
259
- expect(
260
- widget.versions.where_object_changes(an_integer: 77, name: "foobar")
261
- ).to eq(widget.versions[1..2])
262
- end
263
-
264
- after(:all) { PaperTrail.serializer = PaperTrail::Serializers::YAML }
265
- end
244
+ it "handles queries for multiple attributes" do
245
+ expect(
246
+ widget.versions.where_object_changes(an_integer: 77, name: "foobar")
247
+ ).to eq(widget.versions[1..2])
266
248
  end
249
+
250
+ after(:all) { PaperTrail.serializer = PaperTrail::Serializers::YAML }
267
251
  end
268
252
  end
269
253
  end