paper_trail 7.0.0 → 7.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,96 +1,92 @@
1
1
  require "rails_helper"
2
2
 
3
- describe CallbackModifier, type: :model do
4
- with_versioning do
5
- describe "callback-methods", versioning: true do
6
- describe "paper_trail_on_destroy" do
7
- it "adds :destroy to paper_trail_options[:on]" do
8
- modifier = NoArgDestroyModifier.create!(some_content: FFaker::Lorem.sentence)
9
- expect(modifier.paper_trail_options[:on]).to eq [:destroy]
10
- end
3
+ RSpec.describe CallbackModifier, type: :model, versioning: true do
4
+ describe "paper_trail_on_destroy" do
5
+ it "adds :destroy to paper_trail_options[:on]" do
6
+ modifier = NoArgDestroyModifier.create!(some_content: FFaker::Lorem.sentence)
7
+ expect(modifier.paper_trail_options[:on]).to eq([:destroy])
8
+ end
11
9
 
12
- context "when :before" do
13
- it "creates the version before destroy" do
14
- modifier = BeforeDestroyModifier.create!(some_content: FFaker::Lorem.sentence)
15
- modifier.test_destroy
16
- expect(modifier.versions.last.reify).not_to be_flagged_deleted
17
- end
18
- end
10
+ context "when :before" do
11
+ it "creates the version before destroy" do
12
+ modifier = BeforeDestroyModifier.create!(some_content: FFaker::Lorem.sentence)
13
+ modifier.test_destroy
14
+ expect(modifier.versions.last.reify).not_to be_flagged_deleted
15
+ end
16
+ end
19
17
 
20
- context "when :after" do
21
- it "creates the version after destroy" do
22
- modifier = AfterDestroyModifier.create!(some_content: FFaker::Lorem.sentence)
23
- modifier.test_destroy
24
- expect(modifier.versions.last.reify).to be_flagged_deleted
25
- end
26
- end
18
+ context "when :after" do
19
+ it "creates the version after destroy" do
20
+ modifier = AfterDestroyModifier.create!(some_content: FFaker::Lorem.sentence)
21
+ modifier.test_destroy
22
+ expect(modifier.versions.last.reify).to be_flagged_deleted
23
+ end
24
+ end
27
25
 
28
- context "when no argument" do
29
- it "defaults to before destroy" do
30
- modifier = NoArgDestroyModifier.create!(some_content: FFaker::Lorem.sentence)
31
- modifier.test_destroy
32
- expect(modifier.versions.last.reify).not_to be_flagged_deleted
33
- end
34
- end
26
+ context "when no argument" do
27
+ it "defaults to before destroy" do
28
+ modifier = NoArgDestroyModifier.create!(some_content: FFaker::Lorem.sentence)
29
+ modifier.test_destroy
30
+ expect(modifier.versions.last.reify).not_to be_flagged_deleted
35
31
  end
32
+ end
33
+ end
36
34
 
37
- describe "paper_trail_on_update" do
38
- it "adds :update to paper_trail_options[:on]" do
39
- modifier = UpdateModifier.create!(some_content: FFaker::Lorem.sentence)
40
- expect(modifier.paper_trail_options[:on]).to eq [:update]
41
- end
35
+ describe "paper_trail_on_update" do
36
+ it "adds :update to paper_trail_options[:on]" do
37
+ modifier = UpdateModifier.create!(some_content: FFaker::Lorem.sentence)
38
+ expect(modifier.paper_trail_options[:on]).to eq [:update]
39
+ end
42
40
 
43
- it "creates a version" do
44
- modifier = UpdateModifier.create!(some_content: FFaker::Lorem.sentence)
45
- modifier.update_attributes! some_content: "modified"
46
- expect(modifier.versions.last.event).to eq "update"
47
- end
48
- end
41
+ it "creates a version" do
42
+ modifier = UpdateModifier.create!(some_content: FFaker::Lorem.sentence)
43
+ modifier.update_attributes! some_content: "modified"
44
+ expect(modifier.versions.last.event).to eq "update"
45
+ end
46
+ end
49
47
 
50
- describe "paper_trail_on_create" do
51
- it "adds :create to paper_trail_options[:on]" do
52
- modifier = CreateModifier.create!(some_content: FFaker::Lorem.sentence)
53
- expect(modifier.paper_trail_options[:on]).to eq [:create]
54
- end
48
+ describe "paper_trail_on_create" do
49
+ it "adds :create to paper_trail_options[:on]" do
50
+ modifier = CreateModifier.create!(some_content: FFaker::Lorem.sentence)
51
+ expect(modifier.paper_trail_options[:on]).to eq [:create]
52
+ end
55
53
 
56
- it "creates a version" do
57
- modifier = CreateModifier.create!(some_content: FFaker::Lorem.sentence)
58
- expect(modifier.versions.last.event).to eq "create"
59
- end
60
- end
54
+ it "creates a version" do
55
+ modifier = CreateModifier.create!(some_content: FFaker::Lorem.sentence)
56
+ expect(modifier.versions.last.event).to eq "create"
57
+ end
58
+ end
61
59
 
62
- context "when no callback-method used" do
63
- it "sets paper_trail_options[:on] to [:create, :update, :destroy]" do
64
- modifier = DefaultModifier.create!(some_content: FFaker::Lorem.sentence)
65
- expect(modifier.paper_trail_options[:on]).to eq %i(create update destroy)
66
- end
60
+ context "when no callback-method used" do
61
+ it "sets paper_trail_options[:on] to [:create, :update, :destroy]" do
62
+ modifier = DefaultModifier.create!(some_content: FFaker::Lorem.sentence)
63
+ expect(modifier.paper_trail_options[:on]).to eq %i(create update destroy)
64
+ end
67
65
 
68
- it "tracks destroy" do
69
- modifier = DefaultModifier.create!(some_content: FFaker::Lorem.sentence)
70
- modifier.destroy
71
- expect(modifier.versions.last.event).to eq "destroy"
72
- end
66
+ it "tracks destroy" do
67
+ modifier = DefaultModifier.create!(some_content: FFaker::Lorem.sentence)
68
+ modifier.destroy
69
+ expect(modifier.versions.last.event).to eq "destroy"
70
+ end
73
71
 
74
- it "tracks update" do
75
- modifier = DefaultModifier.create!(some_content: FFaker::Lorem.sentence)
76
- modifier.update_attributes! some_content: "modified"
77
- expect(modifier.versions.last.event).to eq "update"
78
- end
72
+ it "tracks update" do
73
+ modifier = DefaultModifier.create!(some_content: FFaker::Lorem.sentence)
74
+ modifier.update_attributes! some_content: "modified"
75
+ expect(modifier.versions.last.event).to eq "update"
76
+ end
79
77
 
80
- it "tracks create" do
81
- modifier = DefaultModifier.create!(some_content: FFaker::Lorem.sentence)
82
- expect(modifier.versions.last.event).to eq "create"
83
- end
84
- end
78
+ it "tracks create" do
79
+ modifier = DefaultModifier.create!(some_content: FFaker::Lorem.sentence)
80
+ expect(modifier.versions.last.event).to eq "create"
81
+ end
82
+ end
85
83
 
86
- context "when only one callback-method" do
87
- it "does only track the corresponding event" do
88
- modifier = CreateModifier.create!(some_content: FFaker::Lorem.sentence)
89
- modifier.update_attributes!(some_content: "modified")
90
- modifier.test_destroy
91
- expect(modifier.versions.collect(&:event)).to eq ["create"]
92
- end
93
- end
84
+ context "when only one callback-method" do
85
+ it "does only track the corresponding event" do
86
+ modifier = CreateModifier.create!(some_content: FFaker::Lorem.sentence)
87
+ modifier.update_attributes!(some_content: "modified")
88
+ modifier.test_destroy
89
+ expect(modifier.versions.collect(&:event)).to eq ["create"]
94
90
  end
95
91
  end
96
92
  end
@@ -23,41 +23,40 @@ describe Gadget, type: :model do
23
23
  end
24
24
 
25
25
  describe "#changed_notably?", versioning: true do
26
- subject { Gadget.new(created_at: Time.now) }
27
-
28
- context "create events" do
26
+ context "new record" do
29
27
  it "returns true" do
30
- expect(subject.paper_trail.changed_notably?).to eq(true)
28
+ g = Gadget.new(created_at: Time.now)
29
+ expect(g.paper_trail.changed_notably?).to eq(true)
31
30
  end
32
31
  end
33
32
 
34
- context "update events" do
35
- before { subject.save! }
36
-
37
- context "without update timestamps" do
38
- it "only acknowledges non-ignored attrs" do
39
- subject.name = "Wrench"
40
- expect(subject.paper_trail.changed_notably?).to be true
41
- end
33
+ context "persisted record without update timestamps" do
34
+ it "only acknowledges non-ignored attrs" do
35
+ subject = Gadget.create!(created_at: Time.now)
36
+ subject.name = "Wrench"
37
+ expect(subject.paper_trail.changed_notably?).to be true
38
+ end
42
39
 
43
- it "does not acknowledge ignored attr (brand)" do
44
- subject.brand = "Acme"
45
- expect(subject.paper_trail.changed_notably?).to be false
46
- end
40
+ it "does not acknowledge ignored attr (brand)" do
41
+ subject = Gadget.create!(created_at: Time.now)
42
+ subject.brand = "Acme"
43
+ expect(subject.paper_trail.changed_notably?).to be false
47
44
  end
45
+ end
48
46
 
49
- context "with update timestamps" do
50
- it "only acknowledges non-ignored attrs" do
51
- subject.name = "Wrench"
52
- subject.updated_at = Time.now
53
- expect(subject.paper_trail.changed_notably?).to be true
54
- end
47
+ context "persisted record with update timestamps" do
48
+ it "only acknowledges non-ignored attrs" do
49
+ subject = Gadget.create!(created_at: Time.now)
50
+ subject.name = "Wrench"
51
+ subject.updated_at = Time.now
52
+ expect(subject.paper_trail.changed_notably?).to be true
53
+ end
55
54
 
56
- it "does not acknowledge ignored attrs and timestamps only" do
57
- subject.brand = "Acme"
58
- subject.updated_at = Time.now
59
- expect(subject.paper_trail.changed_notably?).to be false
60
- end
55
+ it "does not acknowledge ignored attrs and timestamps only" do
56
+ subject = Gadget.create!(created_at: Time.now)
57
+ subject.brand = "Acme"
58
+ subject.updated_at = Time.now
59
+ expect(subject.paper_trail.changed_notably?).to be false
61
60
  end
62
61
  end
63
62
  end
@@ -1,47 +1,41 @@
1
1
  require "rails_helper"
2
2
 
3
- describe JoinedVersion, type: :model, versioning: true do
4
- it { expect(JoinedVersion.superclass).to be PaperTrail::Version }
5
-
3
+ RSpec.describe JoinedVersion, type: :model, versioning: true do
6
4
  let(:widget) { Widget.create!(name: FFaker::Name.name) }
7
5
  let(:version) { JoinedVersion.first }
8
6
 
9
- describe "Scopes" do
10
- describe "default_scope" do
11
- it { expect(JoinedVersion.default_scopes).not_to be_empty }
12
- end
7
+ describe "default_scope" do
8
+ it { expect(JoinedVersion.default_scopes).not_to be_empty }
9
+ end
13
10
 
14
- describe "VersionConcern::ClassMethods" do
15
- before { widget } # persist a widget
11
+ describe "VersionConcern::ClassMethods" do
12
+ before { widget } # persist a widget
16
13
 
17
- describe "#subsequent" do
18
- it "does not raise error when there is a default_scope that joins" do
19
- JoinedVersion.subsequent(version).first
20
- end
14
+ describe "#subsequent" do
15
+ it "does not raise error when there is a default_scope that joins" do
16
+ JoinedVersion.subsequent(version).first
21
17
  end
18
+ end
22
19
 
23
- describe "#preceding" do
24
- it "does not raise error when there is a default scope that joins" do
25
- JoinedVersion.preceding(version).first
26
- end
20
+ describe "#preceding" do
21
+ it "does not raise error when there is a default scope that joins" do
22
+ JoinedVersion.preceding(version).first
27
23
  end
24
+ end
28
25
 
29
- describe "#between" do
30
- it "does not raise error when there is a default scope that joins" do
31
- JoinedVersion.between(Time.now, 1.minute.from_now).first
32
- end
26
+ describe "#between" do
27
+ it "does not raise error when there is a default scope that joins" do
28
+ JoinedVersion.between(Time.now, 1.minute.from_now).first
33
29
  end
34
30
  end
35
31
  end
36
32
 
37
- describe "Methods" do
38
- describe "#index" do
39
- it { is_expected.to respond_to(:index) }
33
+ describe "#index" do
34
+ it { is_expected.to respond_to(:index) }
40
35
 
41
- it "does not raise error when there is a default scope that joins" do
42
- widget # persist a widget
43
- version.index
44
- end
36
+ it "does not raise error when there is a default scope that joins" do
37
+ widget # persist a widget
38
+ version.index
45
39
  end
46
40
  end
47
41
  end
@@ -1,45 +1,41 @@
1
1
  require "rails_helper"
2
2
 
3
- describe Skipper, type: :model do
4
- with_versioning do
5
- it { is_expected.to be_versioned }
3
+ RSpec.describe Skipper, type: :model, versioning: true do
4
+ it { is_expected.to be_versioned }
6
5
 
7
- describe "#update_attributes!", versioning: true do
8
- context "updating a skipped attribute" do
9
- let(:t1) { Time.zone.local(2015, 7, 15, 20, 34, 0) }
10
- let(:t2) { Time.zone.local(2015, 7, 15, 20, 34, 30) }
6
+ describe "#update_attributes!", versioning: true do
7
+ context "updating a skipped attribute" do
8
+ let(:t1) { Time.zone.local(2015, 7, 15, 20, 34, 0) }
9
+ let(:t2) { Time.zone.local(2015, 7, 15, 20, 34, 30) }
11
10
 
12
- it "does not create a version" do
13
- skipper = Skipper.create!(another_timestamp: t1)
14
- expect {
15
- skipper.update_attributes!(another_timestamp: t2)
16
- }.not_to(change { skipper.versions.length })
17
- end
11
+ it "does not create a version" do
12
+ skipper = Skipper.create!(another_timestamp: t1)
13
+ expect {
14
+ skipper.update_attributes!(another_timestamp: t2)
15
+ }.not_to(change { skipper.versions.length })
18
16
  end
19
17
  end
18
+ end
20
19
 
21
- describe "reify" do
22
- context "reifying a with a skipped attribute" do
23
- let(:t1) { Time.zone.local(2015, 7, 15, 20, 34, 0) }
24
- let(:t2) { Time.zone.local(2015, 7, 15, 20, 34, 30) }
20
+ describe "#reify" do
21
+ let(:t1) { Time.zone.local(2015, 7, 15, 20, 34, 0) }
22
+ let(:t2) { Time.zone.local(2015, 7, 15, 20, 34, 30) }
25
23
 
26
- context "without preserve (default)" do
27
- it "has no timestamp" do
28
- skipper = Skipper.create!(another_timestamp: t1)
29
- skipper.update_attributes!(another_timestamp: t2, name: "Foobar")
30
- skipper = skipper.versions.last.reify
31
- expect(skipper.another_timestamp).to be(nil)
32
- end
33
- end
24
+ context "without preserve (default)" do
25
+ it "has no timestamp" do
26
+ skipper = Skipper.create!(another_timestamp: t1)
27
+ skipper.update_attributes!(another_timestamp: t2, name: "Foobar")
28
+ skipper = skipper.versions.last.reify
29
+ expect(skipper.another_timestamp).to be(nil)
30
+ end
31
+ end
34
32
 
35
- context "with preserve" do
36
- it "preserves its timestamp" do
37
- skipper = Skipper.create!(another_timestamp: t1)
38
- skipper.update_attributes!(another_timestamp: t2, name: "Foobar")
39
- skipper = skipper.versions.last.reify(unversioned_attributes: :preserve)
40
- expect(skipper.another_timestamp).to eq(t2)
41
- end
42
- end
33
+ context "with preserve" do
34
+ it "preserves its timestamp" do
35
+ skipper = Skipper.create!(another_timestamp: t1)
36
+ skipper.update_attributes!(another_timestamp: t2, name: "Foobar")
37
+ skipper = skipper.versions.last.reify(unversioned_attributes: :preserve)
38
+ expect(skipper.another_timestamp).to eq(t2)
43
39
  end
44
40
  end
45
41
  end
@@ -1,11 +1,7 @@
1
1
  require "rails_helper"
2
2
 
3
- describe PaperTrail::Version, type: :model do
4
- it "includes the VersionConcern module" do
5
- expect(PaperTrail::Version).to include(PaperTrail::VersionConcern)
6
- end
7
-
8
- describe "Attributes" do
3
+ module PaperTrail
4
+ describe Version, type: :model do
9
5
  describe "object_changes column", versioning: true do
10
6
  let(:widget) { Widget.create!(name: "Dashboard") }
11
7
  let(:value) { widget.versions.last.object_changes }
@@ -28,226 +24,231 @@ describe PaperTrail::Version, type: :model do
28
24
  after(:all) { PaperTrail.serializer = PaperTrail::Serializers::YAML }
29
25
  end
30
26
  end
31
- end
32
27
 
33
- describe "Methods" do
34
- describe "Instance" do
35
- subject { PaperTrail::Version.new }
36
-
37
- describe "#paper_trail_originator" do
38
- context "No previous versions" do
39
- specify { expect(subject.previous).to be_nil }
40
-
41
- it "return nil" do
42
- expect(subject.paper_trail_originator).to be_nil
43
- end
28
+ describe "#paper_trail_originator" do
29
+ context "no previous versions" do
30
+ it "returns nil" do
31
+ expect(PaperTrail::Version.new.paper_trail_originator).to be_nil
44
32
  end
33
+ end
45
34
 
46
- context "Has previous version", versioning: true do
47
- subject { widget.versions.last }
48
-
49
- let(:name) { FFaker::Name.name }
50
- let(:widget) { Widget.create!(name: FFaker::Name.name) }
51
-
52
- before do
53
- widget.versions.first.update_attributes!(whodunnit: name)
54
- widget.update_attributes!(name: FFaker::Name.first_name)
55
- end
56
-
57
- specify { expect(subject.previous).to be_instance_of(PaperTrail::Version) }
58
-
59
- it "return nil" do
60
- expect(subject.paper_trail_originator).to eq(name)
61
- end
35
+ context "has previous version", versioning: true do
36
+ it "returns name of whodunnit" do
37
+ name = FFaker::Name.name
38
+ widget = Widget.create!(name: FFaker::Name.name)
39
+ widget.versions.first.update_attributes!(whodunnit: name)
40
+ widget.update_attributes!(name: FFaker::Name.first_name)
41
+ expect(widget.versions.last.paper_trail_originator).to eq(name)
62
42
  end
63
43
  end
44
+ end
64
45
 
65
- describe "#originator" do
66
- it "sets the invoke `paper_trail_originator`" do
67
- allow(ActiveSupport::Deprecation).to receive(:warn)
68
- is_expected.to receive(:paper_trail_originator)
69
- subject.originator
46
+ describe "#previous" do
47
+ context "no previous versions" do
48
+ it "returns nil" do
49
+ expect(PaperTrail::Version.new.previous).to be_nil
70
50
  end
51
+ end
71
52
 
72
- it "displays a deprecation warning" do
73
- expect(ActiveSupport::Deprecation).to receive(:warn).
74
- with(/Use paper_trail_originator instead of originator/)
75
- subject.originator
53
+ context "has previous version", versioning: true do
54
+ it "returns a PaperTrail::Version" do
55
+ name = FFaker::Name.name
56
+ widget = Widget.create!(name: FFaker::Name.name)
57
+ widget.versions.first.update_attributes!(whodunnit: name)
58
+ widget.update_attributes!(name: FFaker::Name.first_name)
59
+ expect(widget.versions.last.previous).to be_instance_of(PaperTrail::Version)
76
60
  end
77
61
  end
62
+ end
78
63
 
79
- describe "#terminator" do
80
- subject { PaperTrail::Version.new attributes }
81
-
82
- let(:attributes) { { whodunnit: FFaker::Name.first_name } }
83
-
84
- it "is an alias for the `whodunnit` attribute" do
85
- expect(subject.terminator).to eq(attributes[:whodunnit])
86
- end
64
+ describe "#originator" do
65
+ it "sets the invoke `paper_trail_originator`" do
66
+ allow(ActiveSupport::Deprecation).to receive(:warn)
67
+ subject = PaperTrail::Version.new
68
+ expect(subject).to receive(:paper_trail_originator)
69
+ subject.originator
87
70
  end
88
71
 
89
- describe "#version_author" do
90
- it "is an alias for the `terminator` method" do
91
- expect(subject.method(:version_author)).to eq(subject.method(:terminator))
92
- end
72
+ it "displays a deprecation warning" do
73
+ expect(ActiveSupport::Deprecation).to receive(:warn).
74
+ with(/Use paper_trail_originator instead of originator/)
75
+ subject = PaperTrail::Version.new
76
+ subject.originator
93
77
  end
94
78
  end
95
79
 
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"
80
+ describe "#terminator" do
81
+ it "is an alias for the `whodunnit` attribute" do
82
+ attributes = { whodunnit: FFaker::Name.first_name }
83
+ subject = PaperTrail::Version.new(attributes)
84
+ expect(subject.terminator).to eq(attributes[:whodunnit])
85
+ end
101
86
  end
102
87
 
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
88
+ describe "#version_author" do
89
+ it "is an alias for the `terminator` method" do
90
+ subject = PaperTrail::Version.new
91
+ expect(subject.method(:version_author)).to eq(subject.method(:terminator))
92
+ end
93
+ end
126
94
 
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 }
95
+ describe "Methods" do
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
131
102
 
103
+ column_overrides.shuffle.each do |override|
104
+ context "with a #{override || 'text'} column" do
132
105
  before do
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
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
150
117
  end
118
+ end
151
119
 
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]])
120
+ after do
121
+ if override
122
+ ActiveRecord::Base.connection.execute("ROLLBACK TO SAVEPOINT pgtest;")
123
+ PaperTrail::Version.reset_column_information
159
124
  end
160
125
  end
161
126
 
162
- context "JSON serializer" do
163
- before(:all) do
164
- PaperTrail.serializer = PaperTrail::Serializers::JSON
165
- end
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 }
166
131
 
167
- specify do
168
- expect(PaperTrail.serializer).to be PaperTrail::Serializers::JSON
132
+ before do
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)
169
136
  end
170
137
 
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]])
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)
178
145
  end
179
146
 
180
- after(:all) do
181
- PaperTrail.serializer = PaperTrail::Serializers::YAML
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]])
159
+ end
182
160
  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
161
 
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)
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]])
178
+ end
179
+
180
+ after(:all) do
181
+ PaperTrail.serializer = PaperTrail::Serializers::YAML
182
+ end
183
+ end
195
184
  end
196
185
 
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
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 }
205
190
 
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])
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)
219
195
  end
220
196
 
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])
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)
225
204
  end
226
- end
227
205
 
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])
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])
219
+ end
220
+
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])
225
+ end
242
226
  end
243
227
 
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])
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])
242
+ end
243
+
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])
248
+ end
249
+
250
+ after(:all) { PaperTrail.serializer = PaperTrail::Serializers::YAML }
248
251
  end
249
-
250
- after(:all) { PaperTrail.serializer = PaperTrail::Serializers::YAML }
251
252
  end
252
253
  end
253
254
  end