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,47 +0,0 @@
1
- require 'test_helper'
2
-
3
- class ProtectedAttrsTest < ActiveSupport::TestCase
4
- subject { ProtectedWidget.new }
5
-
6
- if ActiveRecord::VERSION::MAJOR < 4 # these ActiveModel matchers (provided by shoulda-matchers) only work for Rails 3
7
- accessible_attrs = ProtectedWidget.accessible_attributes.to_a
8
- accessible_attrs.each do |attr_name|
9
- should allow_mass_assignment_of(attr_name.to_sym)
10
- end
11
- ProtectedWidget.column_names.reject { |column_name| accessible_attrs.include?(column_name) }.each do |attr_name|
12
- should_not allow_mass_assignment_of(attr_name.to_sym)
13
- end
14
- end
15
-
16
- context 'A model with `attr_accessible` created' do
17
- setup do
18
- @widget = ProtectedWidget.create! :name => 'Henry'
19
- @initial_attributes = @widget.attributes
20
- end
21
-
22
- should 'be `nil` in its previous version' do
23
- assert_nil @widget.previous_version
24
- end
25
-
26
- context 'which is then updated' do
27
- setup do
28
- @widget.assign_attributes(:name => 'Jeff', :a_text => 'Short statement')
29
- @widget.an_integer = 42
30
- @widget.save!
31
- end
32
-
33
- should 'not be `nil` in its previous version' do
34
- assert_not_nil @widget.previous_version
35
- end
36
-
37
- should 'the previous version should contain right attributes' do
38
- # For some reason this test seems to be broken in JRuby 1.9 mode in the
39
- # test env even though it works in the console. WTF?
40
- unless ActiveRecord::VERSION::MAJOR >= 4 && defined?(JRUBY_VERSION) && RUBY_VERSION >= '1.9'
41
- assert_attributes_equal @widget.previous_version.attributes, @initial_attributes
42
- end
43
- end
44
- end
45
-
46
- end
47
- end
@@ -1,117 +0,0 @@
1
- require 'test_helper'
2
- require 'custom_json_serializer'
3
-
4
- class SerializerTest < ActiveSupport::TestCase
5
-
6
- context 'YAML Serializer' do
7
- setup do
8
- Fluxor.instance_eval <<-END
9
- has_paper_trail
10
- END
11
-
12
- @fluxor = Fluxor.create :name => 'Some text.'
13
- @original_fluxor_attributes = @fluxor.send(:attributes_before_change) # this is exactly what PaperTrail serializes
14
- @fluxor.update_attributes :name => 'Some more text.'
15
- end
16
-
17
- should 'work with the default `YAML` serializer' do
18
- # Normal behaviour
19
- assert_equal 2, @fluxor.versions.length
20
- assert_nil @fluxor.versions[0].reify
21
- assert_equal 'Some text.', @fluxor.versions[1].reify.name
22
-
23
- # Check values are stored as `YAML`.
24
- assert_equal @original_fluxor_attributes, YAML.load(@fluxor.versions[1].object)
25
- # This test can't consistently pass in Ruby1.8 because hashes do no preserve order, which means the order of the
26
- # attributes in the `YAML` can't be ensured.
27
- if RUBY_VERSION >= '1.9'
28
- assert_equal YAML.dump(@original_fluxor_attributes), @fluxor.versions[1].object
29
- end
30
- end
31
- end
32
-
33
- context 'JSON Serializer' do
34
- setup do
35
- PaperTrail.configure do |config|
36
- config.serializer = PaperTrail::Serializers::JSON
37
- end
38
-
39
- Fluxor.instance_eval <<-END
40
- has_paper_trail
41
- END
42
-
43
- @fluxor = Fluxor.create :name => 'Some text.'
44
- @original_fluxor_attributes = @fluxor.send(:attributes_before_change) # this is exactly what PaperTrail serializes
45
- @fluxor.update_attributes :name => 'Some more text.'
46
- end
47
-
48
- teardown do
49
- PaperTrail.config.serializer = PaperTrail::Serializers::YAML
50
- end
51
-
52
- should 'reify with JSON serializer' do
53
- # Normal behaviour
54
- assert_equal 2, @fluxor.versions.length
55
- assert_nil @fluxor.versions[0].reify
56
- assert_equal 'Some text.', @fluxor.versions[1].reify.name
57
-
58
- # Check values are stored as JSON.
59
- assert_equal @original_fluxor_attributes, ActiveSupport::JSON.decode(@fluxor.versions[1].object)
60
- # This test can't consistently pass in Ruby1.8 because hashes do no preserve order, which means the order of the
61
- # attributes in the JSON can't be ensured.
62
- if RUBY_VERSION >= '1.9'
63
- assert_equal ActiveSupport::JSON.encode(@original_fluxor_attributes), @fluxor.versions[1].object
64
- end
65
- end
66
-
67
- should 'store object_changes' do
68
- initial_changeset = {"name" => [nil, "Some text."], "id" => [nil, @fluxor.id]}
69
- second_changeset = {"name"=>["Some text.", "Some more text."]}
70
- assert_equal initial_changeset, @fluxor.versions[0].changeset
71
- assert_equal second_changeset, @fluxor.versions[1].changeset
72
- end
73
- end
74
-
75
- context 'Custom Serializer' do
76
- setup do
77
- PaperTrail.configure do |config|
78
- config.serializer = CustomJsonSerializer
79
- end
80
-
81
- Fluxor.instance_eval <<-END
82
- has_paper_trail
83
- END
84
-
85
- @fluxor = Fluxor.create
86
- @original_fluxor_attributes = @fluxor.send(:attributes_before_change).reject { |k,v| v.nil? } # this is exactly what PaperTrail serializes
87
- @fluxor.update_attributes :name => 'Some more text.'
88
- end
89
-
90
- teardown do
91
- PaperTrail.config.serializer = PaperTrail::Serializers::YAML
92
- end
93
-
94
- should 'reify with custom serializer' do
95
- # Normal behaviour
96
- assert_equal 2, @fluxor.versions.length
97
- assert_nil @fluxor.versions[0].reify
98
- assert_nil @fluxor.versions[1].reify.name
99
-
100
- # Check values are stored as JSON.
101
- assert_equal @original_fluxor_attributes, ActiveSupport::JSON.decode(@fluxor.versions[1].object)
102
- # This test can't consistently pass in Ruby1.8 because hashes do no preserve order, which means the order of the
103
- # attributes in the JSON can't be ensured.
104
- if RUBY_VERSION >= '1.9'
105
- assert_equal ActiveSupport::JSON.encode(@original_fluxor_attributes), @fluxor.versions[1].object
106
- end
107
- end
108
-
109
- should 'store object_changes' do
110
- initial_changeset = {"id" => [nil, @fluxor.id]}
111
- second_changeset = {"name"=>[nil, "Some more text."]}
112
- assert_equal initial_changeset, @fluxor.versions[0].changeset
113
- assert_equal second_changeset, @fluxor.versions[1].changeset
114
- end
115
- end
116
-
117
- end
@@ -1,88 +0,0 @@
1
- require 'test_helper'
2
-
3
- class JSONTest < ActiveSupport::TestCase
4
-
5
- setup do
6
- # Setup a hash with random values
7
- @hash = {}
8
- (1..4).each do |i|
9
- @hash["key#{i}"] = Faker::Lorem.word
10
- end
11
- @hash_as_json = @hash.to_json
12
- # Setup an array of random words
13
- @array = []
14
- (rand(5) + 4).times { @array << Faker::Lorem.word }
15
- @array_as_json = @array.to_json
16
- end
17
-
18
- context '`load` class method' do
19
- should 'exist' do
20
- assert PaperTrail::Serializers::JSON.respond_to?(:load)
21
- end
22
-
23
- should '`deserialize` JSON to Ruby' do
24
- assert_equal @hash, PaperTrail::Serializers::JSON.load(@hash_as_json)
25
- assert_equal @array, PaperTrail::Serializers::JSON.load(@array_as_json)
26
- end
27
- end
28
-
29
- context '`dump` class method' do
30
- should 'exist' do
31
- assert PaperTrail::Serializers::JSON.respond_to?(:dump)
32
- end
33
-
34
- should '`serialize` Ruby to JSON' do
35
- assert_equal @hash_as_json, PaperTrail::Serializers::JSON.dump(@hash)
36
- assert_equal @array_as_json, PaperTrail::Serializers::JSON.dump(@array)
37
- end
38
- end
39
-
40
- context '`where_object` class method' do
41
- context "when value is a string" do
42
- should 'construct correct WHERE query' do
43
- matches = PaperTrail::Serializers::JSON.where_object_condition(
44
- PaperTrail::Version.arel_table[:object], :arg1, "Val 1")
45
-
46
- assert matches.instance_of?(Arel::Nodes::Matches)
47
- if Arel::VERSION >= '6'
48
- assert_equal matches.right.val, "%\"arg1\":\"Val 1\"%"
49
- else
50
- assert_equal matches.right, "%\"arg1\":\"Val 1\"%"
51
- end
52
- end
53
- end
54
-
55
- context "when value is `null`" do
56
- should 'construct correct WHERE query' do
57
- matches = PaperTrail::Serializers::JSON.where_object_condition(
58
- PaperTrail::Version.arel_table[:object], :arg1, nil)
59
-
60
- assert matches.instance_of?(Arel::Nodes::Matches)
61
- if Arel::VERSION >= '6'
62
- assert_equal matches.right.val, "%\"arg1\":null%"
63
- else
64
- assert_equal matches.right, "%\"arg1\":null%"
65
- end
66
- end
67
- end
68
-
69
- context "when value is a number" do
70
- should 'construct correct WHERE query' do
71
- grouping = PaperTrail::Serializers::JSON.where_object_condition(
72
- PaperTrail::Version.arel_table[:object], :arg1, -3.5)
73
-
74
- assert grouping.instance_of?(Arel::Nodes::Grouping)
75
- matches = grouping.select { |v| v.instance_of?(Arel::Nodes::Matches) }
76
- # Numeric arguments need to ensure that they match for only the number, not the beginning
77
- # of a #, so it uses an Grouping matcher (See notes on `PaperTrail::Serializers::JSON`)
78
- if Arel::VERSION >= '6'
79
- assert_equal matches.first.right.val, "%\"arg1\":-3.5,%"
80
- assert_equal matches.last.right.val, "%\"arg1\":-3.5}%"
81
- else
82
- assert_equal matches.first.right, "%\"arg1\":-3.5,%"
83
- assert_equal matches.last.right, "%\"arg1\":-3.5}%"
84
- end
85
- end
86
- end
87
- end
88
- end
@@ -1,36 +0,0 @@
1
- require 'test_helper'
2
- require 'custom_json_serializer'
3
-
4
- class MixinJsonTest < ActiveSupport::TestCase
5
-
6
- setup do
7
- # Setup a hash with random values, ensuring some values are nil
8
- @hash = {}
9
- (1..4).each do |i|
10
- @hash["key#{i}"] = [Faker::Lorem.word, nil].sample
11
- end
12
- @hash['tkey'] = nil
13
- @hash[''] = 'foo'
14
- @hash_as_json = @hash.to_json
15
- end
16
-
17
- context '`load` class method' do
18
- should 'exist' do
19
- assert CustomJsonSerializer.respond_to?(:load)
20
- end
21
-
22
- should '`deserialize` JSON to Ruby, removing pairs with `blank` keys or values' do
23
- assert_equal @hash.reject { |k,v| k.blank? || v.blank? }, CustomJsonSerializer.load(@hash_as_json)
24
- end
25
- end
26
-
27
- context '`dump` class method' do
28
- should 'exist' do
29
- assert CustomJsonSerializer.respond_to?(:dump)
30
- end
31
-
32
- should '`serialize` Ruby to JSON, removing pairs with `nil` values' do
33
- assert_equal @hash.reject { |k,v| v.nil? }.to_json, CustomJsonSerializer.dump(@hash)
34
- end
35
- end
36
- end
@@ -1,49 +0,0 @@
1
- require 'test_helper'
2
-
3
- module CustomYamlSerializer
4
- extend PaperTrail::Serializers::YAML
5
-
6
- def self.load(string)
7
- parsed_value = super(string)
8
- parsed_value.is_a?(Hash) ? parsed_value.reject { |k,v| k.blank? || v.blank? } : parsed_value
9
- end
10
-
11
- def self.dump(object)
12
- object.is_a?(Hash) ? super(object.reject { |k,v| v.nil? }) : super
13
- end
14
- end
15
-
16
- class MixinYamlTest < ActiveSupport::TestCase
17
-
18
- setup do
19
- # Setup a hash with random values, ensuring some values are nil
20
- @hash = {}
21
- (1..4).each do |i|
22
- @hash["key#{i}"] = [Faker::Lorem.word, nil].sample
23
- end
24
- @hash['tkey'] = nil
25
- @hash[''] = 'foo'
26
- @hash_as_yaml = @hash.to_yaml
27
- end
28
-
29
- context '`load` class method' do
30
- should 'exist' do
31
- assert CustomYamlSerializer.respond_to?(:load)
32
- end
33
-
34
- should '`deserialize` YAML to Ruby, removing pairs with `blank` keys or values' do
35
- assert_equal @hash.reject { |k,v| k.blank? || v.blank? }, CustomYamlSerializer.load(@hash_as_yaml)
36
- end
37
- end
38
-
39
- context '`dump` class method' do
40
- should 'exist' do
41
- assert CustomYamlSerializer.respond_to?(:dump)
42
- end
43
-
44
- should '`serialize` Ruby to YAML, removing pairs with `nil` values' do
45
- assert_equal @hash.reject { |k,v| v.nil? }.to_yaml, CustomYamlSerializer.dump(@hash)
46
- end
47
- end
48
-
49
- end
@@ -1,52 +0,0 @@
1
- require 'test_helper'
2
-
3
- class YamlTest < ActiveSupport::TestCase
4
-
5
- setup do
6
- # Setup a hash with random values
7
- @hash = {}
8
- (1..4).each do |i|
9
- @hash["key#{i}".to_sym] = Faker::Lorem.word
10
- end
11
- @hash_as_yaml = @hash.to_yaml
12
- # Setup an array of random words
13
- @array = []
14
- (rand(5) + 4).times { @array << Faker::Lorem.word }
15
- @array_as_yaml = @array.to_yaml
16
- end
17
-
18
- context '`load` class method' do
19
- should 'exist' do
20
- assert PaperTrail::Serializers::YAML.respond_to?(:load)
21
- end
22
-
23
- should 'deserialize `YAML` to Ruby' do
24
- assert_equal @hash, PaperTrail::Serializers::YAML.load(@hash_as_yaml)
25
- assert_equal @array, PaperTrail::Serializers::YAML.load(@array_as_yaml)
26
- end
27
- end
28
-
29
- context '`dump` class method' do
30
- should 'exist' do
31
- assert PaperTrail::Serializers::YAML.respond_to?(:dump)
32
- end
33
-
34
- should 'serialize Ruby to `YAML`' do
35
- assert_equal @hash_as_yaml, PaperTrail::Serializers::YAML.dump(@hash)
36
- assert_equal @array_as_yaml, PaperTrail::Serializers::YAML.dump(@array)
37
- end
38
- end
39
-
40
- context '`where_object` class method' do
41
- should 'construct correct WHERE query' do
42
- matches = PaperTrail::Serializers::YAML.where_object_condition(
43
- PaperTrail::Version.arel_table[:object], :arg1, "Val 1")
44
- assert matches.instance_of?(Arel::Nodes::Matches)
45
- if Arel::VERSION >= '6'
46
- assert_equal matches.right.val, "%\narg1: Val 1\n%"
47
- else
48
- assert_equal matches.right, "%\narg1: Val 1\n%"
49
- end
50
- end
51
- end
52
- end
@@ -1,43 +0,0 @@
1
- require 'test_helper'
2
-
3
- class TimestampTest < ActiveSupport::TestCase
4
-
5
- setup do
6
- PaperTrail.timestamp_field = :custom_created_at
7
- change_schema
8
-
9
- Fluxor.instance_eval <<-END
10
- has_paper_trail
11
- END
12
-
13
- @fluxor = Fluxor.create :name => 'Some text.'
14
- @fluxor.update_attributes :name => 'Some more text.'
15
- @fluxor.update_attributes :name => 'Even more text.'
16
- end
17
-
18
- teardown do
19
- PaperTrail.timestamp_field = :created_at
20
- restore_schema
21
- end
22
-
23
- test 'versions works with custom timestamp field' do
24
- # Normal behaviour
25
- assert_equal 3, @fluxor.versions.length
26
- assert_nil @fluxor.versions[0].reify
27
- assert_equal 'Some text.', @fluxor.versions[1].reify.name
28
- assert_equal 'Some more text.', @fluxor.versions[2].reify.name
29
-
30
- # Tinker with custom timestamps.
31
- now = Time.now.utc
32
- @fluxor.versions.reverse.each_with_index do |version, index|
33
- version.update_attribute :custom_created_at, (now + index.seconds)
34
- end
35
-
36
- # Test we are ordering by custom timestamps.
37
- @fluxor.versions true # reload association
38
- assert_nil @fluxor.versions[2].reify
39
- assert_equal 'Some text.', @fluxor.versions[1].reify.name
40
- assert_equal 'Some more text.', @fluxor.versions[0].reify.name
41
- end
42
-
43
- end
@@ -1,119 +0,0 @@
1
- require 'test_helper'
2
-
3
- module PaperTrail
4
- class VersionTest < ActiveSupport::TestCase
5
- setup do
6
- change_schema
7
- @animal = Animal.create
8
- assert Version.creates.present?
9
- end
10
-
11
- teardown do
12
- restore_schema
13
- Animal.connection.schema_cache.clear!
14
- Animal.reset_column_information
15
- end
16
-
17
- context ".creates" do
18
- should "return only create events" do
19
- Version.creates.each do |version|
20
- assert_equal "create", version.event
21
- end
22
- end
23
- end
24
-
25
- context ".updates" do
26
- setup {
27
- @animal.update_attributes(:name => 'Animal')
28
- assert Version.updates.present?
29
- }
30
-
31
- should "return only update events" do
32
- Version.updates.each do |version|
33
- assert_equal "update", version.event
34
- end
35
- end
36
- end
37
-
38
- context ".destroys" do
39
- setup {
40
- @animal.destroy
41
- assert Version.destroys.present?
42
- }
43
-
44
- should "return only destroy events" do
45
- Version.destroys.each do |version|
46
- assert_equal "destroy", version.event
47
- end
48
- end
49
- end
50
-
51
- context ".not_creates" do
52
- setup {
53
- @animal.update_attributes(:name => 'Animal')
54
- @animal.destroy
55
- assert Version.not_creates.present?
56
- }
57
-
58
- should "return all versions except create events" do
59
- Version.not_creates.each do |version|
60
- assert_not_equal "create", version.event
61
- end
62
- end
63
- end
64
-
65
- context ".subsequent" do
66
- setup do
67
- 2.times do
68
- @animal.update_attributes(:name => Faker::Lorem.word)
69
- end
70
- end
71
-
72
- context "given a timestamp" do
73
- should "return all versions that were created after the timestamp" do
74
- value = Version.subsequent(1.hour.ago, true)
75
- assert_equal @animal.versions.to_a, value
76
- assert_match(
77
- /ORDER BY #{Version.arel_table[:created_at].asc.to_sql}/,
78
- value.to_sql
79
- )
80
- end
81
- end
82
-
83
- context "given a Version" do
84
- should "grab the timestamp from the version and use that as the value" do
85
- expected = @animal.versions.to_a.tap { |assoc| assoc.shift }
86
- actual = Version.subsequent(@animal.versions.first)
87
- assert_equal expected, actual
88
- end
89
- end
90
- end
91
-
92
- context ".preceding" do
93
- setup do
94
- 2.times do
95
- @animal.update_attributes(:name => Faker::Lorem.word)
96
- end
97
- end
98
-
99
- context "given a timestamp" do
100
- should "return all versions that were created before the timestamp" do
101
- value = Version.preceding(5.seconds.from_now, true)
102
- assert_equal @animal.versions.reverse, value
103
- assert_match(
104
- /ORDER BY #{Version.arel_table[:created_at].desc.to_sql}/,
105
- value.to_sql
106
- )
107
- end
108
- end
109
-
110
- context "given a Version" do
111
- should "grab the timestamp from the version and use that as the value" do
112
- expected = @animal.versions.to_a.tap { |assoc| assoc.pop }.reverse
113
- actual = Version.preceding(@animal.versions.last)
114
- assert_equal expected, actual
115
- end
116
- end
117
- end
118
- end
119
- end