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.
- checksums.yaml +4 -4
- data/lib/generators/paper_trail/install_generator.rb +91 -17
- data/lib/generators/paper_trail/templates/add_object_changes_to_versions.rb.erb +12 -0
- data/lib/generators/paper_trail/templates/{add_transaction_id_column_to_versions.rb → add_transaction_id_column_to_versions.rb.erb} +3 -1
- data/lib/generators/paper_trail/templates/create_version_associations.rb.erb +22 -0
- data/lib/generators/paper_trail/templates/{create_versions.rb → create_versions.rb.erb} +9 -7
- data/lib/paper_trail.rb +180 -148
- data/lib/paper_trail/attribute_serializers/README.md +10 -0
- data/lib/paper_trail/attribute_serializers/cast_attribute_serializer.rb +80 -0
- data/lib/paper_trail/attribute_serializers/legacy_active_record_shim.rb +48 -0
- data/lib/paper_trail/attribute_serializers/object_attribute.rb +39 -0
- data/lib/paper_trail/attribute_serializers/object_changes_attribute.rb +42 -0
- data/lib/paper_trail/cleaner.rb +16 -10
- data/lib/paper_trail/config.rb +28 -27
- data/lib/paper_trail/frameworks/active_record/models/paper_trail/version.rb +5 -1
- data/lib/paper_trail/frameworks/active_record/models/paper_trail/version_association.rb +6 -2
- data/lib/paper_trail/frameworks/cucumber.rb +1 -0
- data/lib/paper_trail/frameworks/rails.rb +2 -7
- data/lib/paper_trail/frameworks/rails/controller.rb +20 -18
- data/lib/paper_trail/frameworks/rails/engine.rb +6 -1
- data/lib/paper_trail/frameworks/rspec.rb +17 -6
- data/lib/paper_trail/frameworks/rspec/helpers.rb +3 -1
- data/lib/paper_trail/has_paper_trail.rb +25 -503
- data/lib/paper_trail/model_config.rb +207 -0
- data/lib/paper_trail/queries/versions/where_object.rb +60 -0
- data/lib/paper_trail/queries/versions/where_object_changes.rb +68 -0
- data/lib/paper_trail/record_history.rb +2 -12
- data/lib/paper_trail/record_trail.rb +573 -0
- data/lib/paper_trail/reifier.rb +164 -215
- data/lib/paper_trail/reifiers/belongs_to.rb +48 -0
- data/lib/paper_trail/reifiers/has_and_belongs_to_many.rb +50 -0
- data/lib/paper_trail/reifiers/has_many.rb +110 -0
- data/lib/paper_trail/reifiers/has_many_through.rb +90 -0
- data/lib/paper_trail/reifiers/has_one.rb +76 -0
- data/lib/paper_trail/serializers/json.rb +16 -7
- data/lib/paper_trail/serializers/yaml.rb +9 -13
- data/lib/paper_trail/version_association_concern.rb +3 -5
- data/lib/paper_trail/version_concern.rb +138 -111
- data/lib/paper_trail/version_number.rb +10 -9
- metadata +95 -327
- data/.gitignore +0 -22
- data/.rspec +0 -2
- data/.travis.yml +0 -41
- data/CHANGELOG.md +0 -362
- data/CONTRIBUTING.md +0 -84
- data/Gemfile +0 -2
- data/MIT-LICENSE +0 -20
- data/README.md +0 -1535
- data/Rakefile +0 -30
- data/doc/bug_report_template.rb +0 -65
- data/gemfiles/ar3.gemfile +0 -61
- data/lib/generators/paper_trail/templates/add_object_changes_to_versions.rb +0 -10
- data/lib/generators/paper_trail/templates/create_version_associations.rb +0 -17
- data/lib/paper_trail/attributes_serialization.rb +0 -89
- data/lib/paper_trail/frameworks/sinatra.rb +0 -38
- data/paper_trail.gemspec +0 -59
- data/spec/generators/install_generator_spec.rb +0 -67
- data/spec/models/animal_spec.rb +0 -36
- data/spec/models/boolit_spec.rb +0 -48
- data/spec/models/callback_modifier_spec.rb +0 -96
- data/spec/models/fluxor_spec.rb +0 -19
- data/spec/models/gadget_spec.rb +0 -70
- data/spec/models/joined_version_spec.rb +0 -47
- data/spec/models/json_version_spec.rb +0 -103
- data/spec/models/kitchen/banana_spec.rb +0 -14
- data/spec/models/not_on_update_spec.rb +0 -19
- data/spec/models/post_with_status_spec.rb +0 -17
- data/spec/models/skipper_spec.rb +0 -46
- data/spec/models/thing_spec.rb +0 -11
- data/spec/models/version_spec.rb +0 -239
- data/spec/models/widget_spec.rb +0 -298
- data/spec/modules/paper_trail_spec.rb +0 -27
- data/spec/modules/version_concern_spec.rb +0 -32
- data/spec/modules/version_number_spec.rb +0 -44
- data/spec/paper_trail/config_spec.rb +0 -52
- data/spec/paper_trail_spec.rb +0 -66
- data/spec/rails_helper.rb +0 -34
- data/spec/requests/articles_spec.rb +0 -30
- data/spec/spec_helper.rb +0 -95
- data/spec/support/alt_db_init.rb +0 -59
- data/test/custom_json_serializer.rb +0 -13
- data/test/dummy/Rakefile +0 -7
- data/test/dummy/app/controllers/application_controller.rb +0 -20
- data/test/dummy/app/controllers/articles_controller.rb +0 -17
- data/test/dummy/app/controllers/test_controller.rb +0 -5
- data/test/dummy/app/controllers/widgets_controller.rb +0 -31
- data/test/dummy/app/helpers/application_helper.rb +0 -2
- data/test/dummy/app/models/animal.rb +0 -6
- data/test/dummy/app/models/article.rb +0 -16
- data/test/dummy/app/models/authorship.rb +0 -5
- data/test/dummy/app/models/book.rb +0 -9
- data/test/dummy/app/models/boolit.rb +0 -4
- data/test/dummy/app/models/callback_modifier.rb +0 -45
- data/test/dummy/app/models/cat.rb +0 -2
- data/test/dummy/app/models/chapter.rb +0 -9
- data/test/dummy/app/models/citation.rb +0 -5
- data/test/dummy/app/models/customer.rb +0 -4
- data/test/dummy/app/models/document.rb +0 -4
- data/test/dummy/app/models/dog.rb +0 -2
- data/test/dummy/app/models/editor.rb +0 -4
- data/test/dummy/app/models/editorship.rb +0 -5
- data/test/dummy/app/models/elephant.rb +0 -3
- data/test/dummy/app/models/fluxor.rb +0 -3
- data/test/dummy/app/models/foo_widget.rb +0 -2
- data/test/dummy/app/models/fruit.rb +0 -5
- data/test/dummy/app/models/gadget.rb +0 -3
- data/test/dummy/app/models/kitchen/banana.rb +0 -5
- data/test/dummy/app/models/legacy_widget.rb +0 -4
- data/test/dummy/app/models/line_item.rb +0 -4
- data/test/dummy/app/models/not_on_update.rb +0 -4
- data/test/dummy/app/models/order.rb +0 -5
- data/test/dummy/app/models/paragraph.rb +0 -5
- data/test/dummy/app/models/person.rb +0 -38
- data/test/dummy/app/models/post.rb +0 -3
- data/test/dummy/app/models/post_with_status.rb +0 -8
- data/test/dummy/app/models/protected_widget.rb +0 -3
- data/test/dummy/app/models/quotation.rb +0 -5
- data/test/dummy/app/models/section.rb +0 -6
- data/test/dummy/app/models/skipper.rb +0 -6
- data/test/dummy/app/models/song.rb +0 -32
- data/test/dummy/app/models/thing.rb +0 -3
- data/test/dummy/app/models/translation.rb +0 -4
- data/test/dummy/app/models/whatchamajigger.rb +0 -4
- data/test/dummy/app/models/widget.rb +0 -15
- data/test/dummy/app/models/wotsit.rb +0 -8
- data/test/dummy/app/versions/joined_version.rb +0 -5
- data/test/dummy/app/versions/json_version.rb +0 -3
- data/test/dummy/app/versions/kitchen/banana_version.rb +0 -5
- data/test/dummy/app/versions/post_version.rb +0 -3
- data/test/dummy/app/views/layouts/application.html.erb +0 -14
- data/test/dummy/config.ru +0 -4
- data/test/dummy/config/application.rb +0 -69
- data/test/dummy/config/boot.rb +0 -10
- data/test/dummy/config/database.mysql.yml +0 -19
- data/test/dummy/config/database.postgres.yml +0 -15
- data/test/dummy/config/database.sqlite.yml +0 -15
- data/test/dummy/config/environment.rb +0 -5
- data/test/dummy/config/environments/development.rb +0 -40
- data/test/dummy/config/environments/production.rb +0 -73
- data/test/dummy/config/environments/test.rb +0 -41
- data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/test/dummy/config/initializers/inflections.rb +0 -10
- data/test/dummy/config/initializers/mime_types.rb +0 -5
- data/test/dummy/config/initializers/paper_trail.rb +0 -10
- data/test/dummy/config/initializers/secret_token.rb +0 -7
- data/test/dummy/config/initializers/session_store.rb +0 -8
- data/test/dummy/config/locales/en.yml +0 -5
- data/test/dummy/config/routes.rb +0 -4
- data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +0 -287
- data/test/dummy/db/schema.rb +0 -246
- data/test/dummy/script/rails +0 -6
- data/test/functional/controller_test.rb +0 -91
- data/test/functional/enabled_for_controller_test.rb +0 -29
- data/test/functional/modular_sinatra_test.rb +0 -48
- data/test/functional/sinatra_test.rb +0 -49
- data/test/functional/thread_safety_test.rb +0 -48
- data/test/paper_trail_test.rb +0 -38
- data/test/test_helper.rb +0 -105
- data/test/time_travel_helper.rb +0 -15
- data/test/unit/associations_test.rb +0 -726
- data/test/unit/cleaner_test.rb +0 -182
- data/test/unit/inheritance_column_test.rb +0 -43
- data/test/unit/model_test.rb +0 -1373
- data/test/unit/protected_attrs_test.rb +0 -47
- data/test/unit/serializer_test.rb +0 -117
- data/test/unit/serializers/json_test.rb +0 -88
- data/test/unit/serializers/mixin_json_test.rb +0 -36
- data/test/unit/serializers/mixin_yaml_test.rb +0 -49
- data/test/unit/serializers/yaml_test.rb +0 -52
- data/test/unit/timestamp_test.rb +0 -43
- 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
|
data/test/unit/timestamp_test.rb
DELETED
@@ -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
|
data/test/unit/version_test.rb
DELETED
@@ -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
|