paper_trail 4.2.0 → 7.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/paper_trail/install_generator.rb +91 -17
  3. data/lib/generators/paper_trail/templates/add_object_changes_to_versions.rb.erb +12 -0
  4. data/lib/generators/paper_trail/templates/{add_transaction_id_column_to_versions.rb → add_transaction_id_column_to_versions.rb.erb} +3 -1
  5. data/lib/generators/paper_trail/templates/create_version_associations.rb.erb +22 -0
  6. data/lib/generators/paper_trail/templates/{create_versions.rb → create_versions.rb.erb} +9 -7
  7. data/lib/paper_trail.rb +180 -148
  8. data/lib/paper_trail/attribute_serializers/README.md +10 -0
  9. data/lib/paper_trail/attribute_serializers/cast_attribute_serializer.rb +80 -0
  10. data/lib/paper_trail/attribute_serializers/legacy_active_record_shim.rb +48 -0
  11. data/lib/paper_trail/attribute_serializers/object_attribute.rb +39 -0
  12. data/lib/paper_trail/attribute_serializers/object_changes_attribute.rb +42 -0
  13. data/lib/paper_trail/cleaner.rb +16 -10
  14. data/lib/paper_trail/config.rb +28 -27
  15. data/lib/paper_trail/frameworks/active_record/models/paper_trail/version.rb +5 -1
  16. data/lib/paper_trail/frameworks/active_record/models/paper_trail/version_association.rb +6 -2
  17. data/lib/paper_trail/frameworks/cucumber.rb +1 -0
  18. data/lib/paper_trail/frameworks/rails.rb +2 -7
  19. data/lib/paper_trail/frameworks/rails/controller.rb +20 -18
  20. data/lib/paper_trail/frameworks/rails/engine.rb +6 -1
  21. data/lib/paper_trail/frameworks/rspec.rb +17 -6
  22. data/lib/paper_trail/frameworks/rspec/helpers.rb +3 -1
  23. data/lib/paper_trail/has_paper_trail.rb +25 -503
  24. data/lib/paper_trail/model_config.rb +207 -0
  25. data/lib/paper_trail/queries/versions/where_object.rb +60 -0
  26. data/lib/paper_trail/queries/versions/where_object_changes.rb +68 -0
  27. data/lib/paper_trail/record_history.rb +2 -12
  28. data/lib/paper_trail/record_trail.rb +573 -0
  29. data/lib/paper_trail/reifier.rb +164 -215
  30. data/lib/paper_trail/reifiers/belongs_to.rb +48 -0
  31. data/lib/paper_trail/reifiers/has_and_belongs_to_many.rb +50 -0
  32. data/lib/paper_trail/reifiers/has_many.rb +110 -0
  33. data/lib/paper_trail/reifiers/has_many_through.rb +90 -0
  34. data/lib/paper_trail/reifiers/has_one.rb +76 -0
  35. data/lib/paper_trail/serializers/json.rb +16 -7
  36. data/lib/paper_trail/serializers/yaml.rb +9 -13
  37. data/lib/paper_trail/version_association_concern.rb +3 -5
  38. data/lib/paper_trail/version_concern.rb +138 -111
  39. data/lib/paper_trail/version_number.rb +10 -9
  40. metadata +95 -327
  41. data/.gitignore +0 -22
  42. data/.rspec +0 -2
  43. data/.travis.yml +0 -41
  44. data/CHANGELOG.md +0 -362
  45. data/CONTRIBUTING.md +0 -84
  46. data/Gemfile +0 -2
  47. data/MIT-LICENSE +0 -20
  48. data/README.md +0 -1535
  49. data/Rakefile +0 -30
  50. data/doc/bug_report_template.rb +0 -65
  51. data/gemfiles/ar3.gemfile +0 -61
  52. data/lib/generators/paper_trail/templates/add_object_changes_to_versions.rb +0 -10
  53. data/lib/generators/paper_trail/templates/create_version_associations.rb +0 -17
  54. data/lib/paper_trail/attributes_serialization.rb +0 -89
  55. data/lib/paper_trail/frameworks/sinatra.rb +0 -38
  56. data/paper_trail.gemspec +0 -59
  57. data/spec/generators/install_generator_spec.rb +0 -67
  58. data/spec/models/animal_spec.rb +0 -36
  59. data/spec/models/boolit_spec.rb +0 -48
  60. data/spec/models/callback_modifier_spec.rb +0 -96
  61. data/spec/models/fluxor_spec.rb +0 -19
  62. data/spec/models/gadget_spec.rb +0 -70
  63. data/spec/models/joined_version_spec.rb +0 -47
  64. data/spec/models/json_version_spec.rb +0 -103
  65. data/spec/models/kitchen/banana_spec.rb +0 -14
  66. data/spec/models/not_on_update_spec.rb +0 -19
  67. data/spec/models/post_with_status_spec.rb +0 -17
  68. data/spec/models/skipper_spec.rb +0 -46
  69. data/spec/models/thing_spec.rb +0 -11
  70. data/spec/models/version_spec.rb +0 -239
  71. data/spec/models/widget_spec.rb +0 -298
  72. data/spec/modules/paper_trail_spec.rb +0 -27
  73. data/spec/modules/version_concern_spec.rb +0 -32
  74. data/spec/modules/version_number_spec.rb +0 -44
  75. data/spec/paper_trail/config_spec.rb +0 -52
  76. data/spec/paper_trail_spec.rb +0 -66
  77. data/spec/rails_helper.rb +0 -34
  78. data/spec/requests/articles_spec.rb +0 -30
  79. data/spec/spec_helper.rb +0 -95
  80. data/spec/support/alt_db_init.rb +0 -59
  81. data/test/custom_json_serializer.rb +0 -13
  82. data/test/dummy/Rakefile +0 -7
  83. data/test/dummy/app/controllers/application_controller.rb +0 -20
  84. data/test/dummy/app/controllers/articles_controller.rb +0 -17
  85. data/test/dummy/app/controllers/test_controller.rb +0 -5
  86. data/test/dummy/app/controllers/widgets_controller.rb +0 -31
  87. data/test/dummy/app/helpers/application_helper.rb +0 -2
  88. data/test/dummy/app/models/animal.rb +0 -6
  89. data/test/dummy/app/models/article.rb +0 -16
  90. data/test/dummy/app/models/authorship.rb +0 -5
  91. data/test/dummy/app/models/book.rb +0 -9
  92. data/test/dummy/app/models/boolit.rb +0 -4
  93. data/test/dummy/app/models/callback_modifier.rb +0 -45
  94. data/test/dummy/app/models/cat.rb +0 -2
  95. data/test/dummy/app/models/chapter.rb +0 -9
  96. data/test/dummy/app/models/citation.rb +0 -5
  97. data/test/dummy/app/models/customer.rb +0 -4
  98. data/test/dummy/app/models/document.rb +0 -4
  99. data/test/dummy/app/models/dog.rb +0 -2
  100. data/test/dummy/app/models/editor.rb +0 -4
  101. data/test/dummy/app/models/editorship.rb +0 -5
  102. data/test/dummy/app/models/elephant.rb +0 -3
  103. data/test/dummy/app/models/fluxor.rb +0 -3
  104. data/test/dummy/app/models/foo_widget.rb +0 -2
  105. data/test/dummy/app/models/fruit.rb +0 -5
  106. data/test/dummy/app/models/gadget.rb +0 -3
  107. data/test/dummy/app/models/kitchen/banana.rb +0 -5
  108. data/test/dummy/app/models/legacy_widget.rb +0 -4
  109. data/test/dummy/app/models/line_item.rb +0 -4
  110. data/test/dummy/app/models/not_on_update.rb +0 -4
  111. data/test/dummy/app/models/order.rb +0 -5
  112. data/test/dummy/app/models/paragraph.rb +0 -5
  113. data/test/dummy/app/models/person.rb +0 -38
  114. data/test/dummy/app/models/post.rb +0 -3
  115. data/test/dummy/app/models/post_with_status.rb +0 -8
  116. data/test/dummy/app/models/protected_widget.rb +0 -3
  117. data/test/dummy/app/models/quotation.rb +0 -5
  118. data/test/dummy/app/models/section.rb +0 -6
  119. data/test/dummy/app/models/skipper.rb +0 -6
  120. data/test/dummy/app/models/song.rb +0 -32
  121. data/test/dummy/app/models/thing.rb +0 -3
  122. data/test/dummy/app/models/translation.rb +0 -4
  123. data/test/dummy/app/models/whatchamajigger.rb +0 -4
  124. data/test/dummy/app/models/widget.rb +0 -15
  125. data/test/dummy/app/models/wotsit.rb +0 -8
  126. data/test/dummy/app/versions/joined_version.rb +0 -5
  127. data/test/dummy/app/versions/json_version.rb +0 -3
  128. data/test/dummy/app/versions/kitchen/banana_version.rb +0 -5
  129. data/test/dummy/app/versions/post_version.rb +0 -3
  130. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  131. data/test/dummy/config.ru +0 -4
  132. data/test/dummy/config/application.rb +0 -69
  133. data/test/dummy/config/boot.rb +0 -10
  134. data/test/dummy/config/database.mysql.yml +0 -19
  135. data/test/dummy/config/database.postgres.yml +0 -15
  136. data/test/dummy/config/database.sqlite.yml +0 -15
  137. data/test/dummy/config/environment.rb +0 -5
  138. data/test/dummy/config/environments/development.rb +0 -40
  139. data/test/dummy/config/environments/production.rb +0 -73
  140. data/test/dummy/config/environments/test.rb +0 -41
  141. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  142. data/test/dummy/config/initializers/inflections.rb +0 -10
  143. data/test/dummy/config/initializers/mime_types.rb +0 -5
  144. data/test/dummy/config/initializers/paper_trail.rb +0 -10
  145. data/test/dummy/config/initializers/secret_token.rb +0 -7
  146. data/test/dummy/config/initializers/session_store.rb +0 -8
  147. data/test/dummy/config/locales/en.yml +0 -5
  148. data/test/dummy/config/routes.rb +0 -4
  149. data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +0 -287
  150. data/test/dummy/db/schema.rb +0 -246
  151. data/test/dummy/script/rails +0 -6
  152. data/test/functional/controller_test.rb +0 -91
  153. data/test/functional/enabled_for_controller_test.rb +0 -29
  154. data/test/functional/modular_sinatra_test.rb +0 -48
  155. data/test/functional/sinatra_test.rb +0 -49
  156. data/test/functional/thread_safety_test.rb +0 -48
  157. data/test/paper_trail_test.rb +0 -38
  158. data/test/test_helper.rb +0 -105
  159. data/test/time_travel_helper.rb +0 -15
  160. data/test/unit/associations_test.rb +0 -726
  161. data/test/unit/cleaner_test.rb +0 -182
  162. data/test/unit/inheritance_column_test.rb +0 -43
  163. data/test/unit/model_test.rb +0 -1373
  164. data/test/unit/protected_attrs_test.rb +0 -47
  165. data/test/unit/serializer_test.rb +0 -117
  166. data/test/unit/serializers/json_test.rb +0 -88
  167. data/test/unit/serializers/mixin_json_test.rb +0 -36
  168. data/test/unit/serializers/mixin_yaml_test.rb +0 -49
  169. data/test/unit/serializers/yaml_test.rb +0 -52
  170. data/test/unit/timestamp_test.rb +0 -43
  171. data/test/unit/version_test.rb +0 -119
@@ -1,36 +0,0 @@
1
- require 'rails_helper'
2
-
3
- describe Animal, :type => :model do
4
- it { is_expected.to be_versioned }
5
-
6
- describe "STI", :versioning => true do
7
- it { expect(Animal.inheritance_column).to eq('species') }
8
-
9
- describe "updates to the `inheritance_column`" do
10
- subject { Cat.create!(:name => 'Leo') }
11
-
12
- it "should be allowed" do
13
- subject.update_attributes(:name => 'Spike', :species => 'Dog')
14
- dog = Animal.find(subject.id)
15
- expect(dog).to be_instance_of(Dog)
16
- end
17
- end
18
-
19
- context 'with callback-methods' do
20
- context 'when only has_paper_trail set in super class' do
21
- let(:callback_cat) { Cat.create(:name => 'Markus') }
22
-
23
- it 'trails all events' do
24
- callback_cat.update_attributes(:name => 'Billie')
25
- callback_cat.destroy
26
- expect(callback_cat.versions.collect(&:event)).to eq %w(create update destroy)
27
- end
28
-
29
- it 'does not break reify' do
30
- callback_cat.destroy
31
- expect { callback_cat.versions.last.reify }.not_to raise_error
32
- end
33
- end
34
- end
35
- end
36
- end
@@ -1,48 +0,0 @@
1
- require 'rails_helper'
2
- require Rails.root.join('..', 'custom_json_serializer')
3
-
4
- describe Boolit, :type => :model do
5
- it { is_expected.to be_versioned }
6
-
7
- it "has a default scope" do
8
- expect(subject.default_scopes).to_not be_empty
9
- end
10
-
11
- describe "Versioning", :versioning => true do
12
- subject { Boolit.create! }
13
- before { subject.update_attributes!(:name => Faker::Name.name) }
14
-
15
- it "should have versions" do
16
- expect(subject.versions.size).to eq(2)
17
- end
18
-
19
- it "should be able to be reified and persisted" do
20
- expect { subject.versions.last.reify.save! }.to_not raise_error
21
- end
22
-
23
- context "Instance falls out of default scope" do
24
- before { subject.update_attributes!(:scoped => false) }
25
-
26
- it "is NOT scoped" do
27
- expect(Boolit.first).to be_nil
28
- end
29
-
30
- it "should still be able to be reified and persisted" do
31
- expect { subject.previous_version.save! }.to_not raise_error
32
- end
33
-
34
- context "with `nil` attributes on the live instance" do
35
- before do
36
- PaperTrail.serializer = CustomJsonSerializer
37
- subject.update_attributes!(:name => nil)
38
- subject.update_attributes!(:name => Faker::Name.name)
39
- end
40
- after { PaperTrail.serializer = PaperTrail::Serializers::YAML }
41
-
42
- it "should not overwrite that attribute during the reification process" do
43
- expect(subject.previous_version.name).to be_nil
44
- end
45
- end
46
- end
47
- end
48
- end
@@ -1,96 +0,0 @@
1
- require 'rails_helper'
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 'should add :destroy to paper_trail_options[:on]' do
8
- modifier = NoArgDestroyModifier.create!(:some_content => Faker::Lorem.sentence)
9
- expect(modifier.paper_trail_options[:on]).to eq [:destroy]
10
- end
11
-
12
- context 'when :before' do
13
- it 'should create the version before destroy' do
14
- modifier = BeforeDestroyModifier.create!(:some_content => Faker::Lorem.sentence)
15
- modifier.test_destroy
16
- expect(modifier.versions.last.reify).not_to be_flagged_deleted
17
- end
18
- end
19
-
20
- context 'when :after' do
21
- it 'should create the version after destroy' do
22
- modifier = AfterDestroyModifier.create!(:some_content => Faker::Lorem.sentence)
23
- modifier.test_destroy
24
- expect(modifier.versions.last.reify).to be_flagged_deleted
25
- end
26
- end
27
-
28
- context 'when no argument' do
29
- it 'should default to after destroy' do
30
- modifier = NoArgDestroyModifier.create!(:some_content => Faker::Lorem.sentence)
31
- modifier.test_destroy
32
- expect(modifier.versions.last.reify).to be_flagged_deleted
33
- end
34
- end
35
- end
36
-
37
- describe 'paper_trail_on_update' do
38
- it 'should add :update to paper_trail_options[:on]' do
39
- modifier = UpdateModifier.create!(:some_content => Faker::Lorem.sentence)
40
- expect(modifier.paper_trail_options[:on]).to eq [:update]
41
- end
42
-
43
- it 'should create a version' do
44
- modifier = UpdateModifier.create!(:some_content => Faker::Lorem.sentence)
45
- modifier.update_attributes! :some_content => 'modified'
46
- expect(modifier.versions.last.event).to eq 'update'
47
- end
48
- end
49
-
50
- describe 'paper_trail_on_create' do
51
- it 'should add :create to paper_trail_options[:on]' do
52
- modifier = CreateModifier.create!(:some_content => Faker::Lorem.sentence)
53
- expect(modifier.paper_trail_options[:on]).to eq [:create]
54
- end
55
-
56
- it 'should create a version' do
57
- modifier = CreateModifier.create!(:some_content => Faker::Lorem.sentence)
58
- expect(modifier.versions.last.event).to eq 'create'
59
- end
60
- end
61
-
62
- context 'when no callback-method used' do
63
- it 'should set paper_trail_options[:on] to [:create, :update, :destroy]' do
64
- modifier = DefaultModifier.create!(:some_content => Faker::Lorem.sentence)
65
- expect(modifier.paper_trail_options[:on]).to eq [:create, :update, :destroy]
66
- end
67
-
68
- it 'should default to track destroy' do
69
- modifier = DefaultModifier.create!(:some_content => Faker::Lorem.sentence)
70
- modifier.destroy
71
- expect(modifier.versions.last.event).to eq 'destroy'
72
- end
73
-
74
- it 'should default to track update' do
75
- modifier = DefaultModifier.create!(:some_content => Faker::Lorem.sentence)
76
- modifier.update_attributes! :some_content => 'modified'
77
- expect(modifier.versions.last.event).to eq 'update'
78
- end
79
-
80
- it 'should default to track create' do
81
- modifier = DefaultModifier.create!(:some_content => Faker::Lorem.sentence)
82
- expect(modifier.versions.last.event).to eq 'create'
83
- end
84
- end
85
-
86
- context 'when only one callback-method' do
87
- it 'does only track the corresponding event' do
88
- modifier = CreateModifier.create!(:some_content => Faker::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
94
- end
95
- end
96
- end
@@ -1,19 +0,0 @@
1
- require 'rails_helper'
2
-
3
- describe Fluxor, :type => :model do
4
- describe '`be_versioned` matcher' do
5
- it { is_expected.to_not be_versioned }
6
- end
7
-
8
- describe "Methods" do
9
- describe "Class" do
10
- subject { Fluxor }
11
-
12
- describe "#paper_trail_enabled_for_model?" do
13
- it { is_expected.to respond_to(:paper_trail_enabled_for_model?) }
14
-
15
- it { expect(subject.paper_trail_enabled_for_model?).to be false }
16
- end
17
- end
18
- end
19
- end
@@ -1,70 +0,0 @@
1
- require 'rails_helper'
2
-
3
- describe Gadget, :type => :model do
4
- it { is_expected.to be_versioned }
5
-
6
- let(:gadget) { Gadget.create!(:name => 'Wrench', :brand => 'Acme') }
7
-
8
- describe "updates", :versioning => true do
9
- it "should generate a version for updates to `name` attribute" do
10
- expect { gadget.update_attribute(:name, 'Hammer').to change{gadget.versions.size}.by(1) }
11
- end
12
-
13
- it "should ignore for updates to `brand` attribute" do
14
- expect { gadget.update_attribute(:brand, 'Stanley') }.to_not change{gadget.versions.size}
15
- end
16
-
17
- it "should still generate a version when only the `updated_at` attribute is updated" do
18
- expect { gadget.update_attribute(:updated_at, Time.now) }.to change{gadget.versions.size}.by(1)
19
- end
20
- end
21
-
22
- describe "Methods" do
23
- describe "Instance", :versioning => true do
24
- describe "private" do
25
- describe '#changed_notably?' do
26
- subject { Gadget.new(:created_at => Time.now) }
27
-
28
- # apparently the private methods list in Ruby18 is different than in Ruby19+
29
- if RUBY_VERSION >= '1.9'
30
- it { expect(subject.private_methods).to include(:changed_notably?) }
31
- else
32
- it { expect(subject.private_methods).to include('changed_notably?') }
33
- end
34
-
35
- context "create events" do
36
- it { expect(subject.send(:changed_notably?)).to be true }
37
- end
38
-
39
- context "update events" do
40
- before { subject.save! }
41
-
42
- context "without update timestamps" do
43
- it "should only acknowledge non-ignored attrs" do
44
- subject.name = 'Wrench'
45
- expect(subject.send(:changed_notably?)).to be true
46
- end
47
-
48
- it "should not acknowledge ignored attr (brand)" do
49
- subject.brand = 'Acme'
50
- expect(subject.send(:changed_notably?)).to be false
51
- end
52
- end
53
-
54
- context "with update timestamps" do
55
- it "should only acknowledge non-ignored attrs" do
56
- subject.name, subject.updated_at = 'Wrench', Time.now
57
- expect(subject.send(:changed_notably?)).to be true
58
- end
59
-
60
- it "should not acknowledge ignored attrs and timestamps only" do
61
- subject.brand, subject.updated_at = 'Acme', Time.now
62
- expect(subject.send(:changed_notably?)).to be false
63
- end
64
- end
65
- end
66
- end
67
- end
68
- end
69
- end
70
- end
@@ -1,47 +0,0 @@
1
- require 'rails_helper'
2
-
3
- describe JoinedVersion, :type => :model, :versioning => true do
4
- it { expect(JoinedVersion.superclass).to be PaperTrail::Version }
5
-
6
- let(:widget) { Widget.create!(:name => Faker::Name.name) }
7
- let(:version) { JoinedVersion.first }
8
-
9
- describe "Scopes" do
10
- describe "default_scope" do
11
- it { expect(JoinedVersion.default_scopes).not_to be_empty }
12
- end
13
-
14
- describe "VersionConcern::ClassMethods" do
15
- before { widget } # persist a widget
16
-
17
- describe '#subsequent' do
18
- it "shouldn't error out when there is a default_scope that joins" do
19
- JoinedVersion.subsequent(version).first
20
- end
21
- end
22
-
23
- describe '#preceding' do
24
- it "shouldn't error out when there is a default scope that joins" do
25
- JoinedVersion.preceding(version).first
26
- end
27
- end
28
-
29
- describe '#between' do
30
- it "shouldn't error out when there is a default scope that joins" do
31
- JoinedVersion.between(Time.now, 1.minute.from_now).first
32
- end
33
- end
34
- end
35
- end
36
-
37
- describe "Methods" do
38
- describe '#index' do
39
- it { is_expected.to respond_to(:index) }
40
-
41
- it "shouldn't error out when there is a default scope that joins" do
42
- widget # persist a widget
43
- version.index
44
- end
45
- end
46
- end
47
- end
@@ -1,103 +0,0 @@
1
- require 'rails_helper'
2
-
3
- # The `json_versions` table tests postgres' `json` data type. So, that
4
- # table is only created when testing against postgres and ActiveRecord >= 4.
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)
10
- end
11
-
12
- describe "Methods" do
13
- describe "Class" do
14
-
15
- describe '#where_object' do
16
- it { expect(JsonVersion).to respond_to(:where_object) }
17
-
18
- it "escapes values" do
19
- f = Fruit.create(:name => 'Bobby')
20
- expect(
21
- f.
22
- versions.
23
- where_object(:name => "Robert'; DROP TABLE Students;--").
24
- count
25
- ).to eq(0)
26
- end
27
-
28
- context "invalid arguments" do
29
- it "should raise an error" do
30
- expect { JsonVersion.where_object(:foo) }.to raise_error(ArgumentError)
31
- expect { JsonVersion.where_object([]) }.to raise_error(ArgumentError)
32
- end
33
- end
34
-
35
- context "valid arguments", :versioning => true do
36
- let(:fruit_names) { %w(apple orange lemon banana lime coconut strawberry blueberry) }
37
- let(:fruit) { Fruit.new }
38
- let(:name) { 'pomegranate' }
39
- let(:color) { Faker::Color.name }
40
-
41
- before do
42
- fruit.update_attributes!(:name => name)
43
- fruit.update_attributes!(:name => fruit_names.sample, :color => color)
44
- fruit.update_attributes!(:name => fruit_names.sample, :color => Faker::Color.name)
45
- end
46
-
47
- it "should be able to locate versions according to their `object` contents" do
48
- expect(JsonVersion.where_object(:name => name)).to eq([fruit.versions[1]])
49
- expect(JsonVersion.where_object(:color => color)).to eq([fruit.versions[2]])
50
- end
51
- end
52
- end
53
-
54
- describe '#where_object_changes' do
55
- it { expect(JsonVersion).to respond_to(:where_object_changes) }
56
-
57
- it "escapes values" do
58
- f = Fruit.create(:name => 'Bobby')
59
- expect(
60
- f.
61
- versions.
62
- where_object_changes(:name => "Robert'; DROP TABLE Students;--").
63
- count
64
- ).to eq(0)
65
- end
66
-
67
- context "invalid arguments" do
68
- it "should raise an error" do
69
- expect { JsonVersion.where_object_changes(:foo) }.to raise_error(ArgumentError)
70
- expect { JsonVersion.where_object_changes([]) }.to raise_error(ArgumentError)
71
- end
72
- end
73
-
74
- context "valid arguments", :versioning => true do
75
- let(:color) { %w[red green] }
76
- let(:fruit) { Fruit.create!(:name => name[0]) }
77
- let(:name) { %w[banana kiwi mango] }
78
-
79
- before do
80
- fruit.update_attributes!(:name => name[1], :color => color[0])
81
- fruit.update_attributes!(:name => name[2], :color => color[1])
82
- end
83
-
84
- it "finds versions according to their `object_changes` contents" do
85
- expect(
86
- fruit.versions.where_object_changes(:name => name[0])
87
- ).to match_array(fruit.versions[0..1])
88
- expect(
89
- fruit.versions.where_object_changes(:color => color[0])
90
- ).to match_array(fruit.versions[1..2])
91
- end
92
-
93
- it "finds versions with multiple attributes changed" do
94
- expect(
95
- fruit.versions.where_object_changes(:color => color[0], :name => name[0])
96
- ).to match_array([fruit.versions[1]])
97
- end
98
- end
99
- end
100
- end
101
- end
102
- end
103
- end
@@ -1,14 +0,0 @@
1
- require 'rails_helper'
2
-
3
- module Kitchen
4
- describe Banana, :type => :model do
5
- it { is_expected.to be_versioned }
6
-
7
- describe '#versions' do
8
- it "returns instances of Kitchen::BananaVersion", :versioning => true do
9
- banana = described_class.create!
10
- expect(banana.versions.first).to be_a(Kitchen::BananaVersion)
11
- end
12
- end
13
- end
14
- end
@@ -1,19 +0,0 @@
1
- require 'rails_helper'
2
-
3
- describe NotOnUpdate, :type => :model do
4
- describe "#touch_with_version", :versioning => true do
5
- let!(:record) { described_class.create! }
6
-
7
- it "should create a version, regardless" do
8
- expect { record.touch_with_version }.to change {
9
- PaperTrail::Version.count
10
- }.by(+1)
11
- end
12
-
13
- it "increments the `:updated_at` timestamp" do
14
- before = record.updated_at
15
- record.touch_with_version
16
- expect(record.updated_at).to be > before
17
- end
18
- end
19
- end