paper_trail 7.0.3 → 7.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/CONTRIBUTING.md +21 -27
- data/.gitignore +4 -4
- data/.rubocop.yml +2 -2
- data/CHANGELOG.md +17 -0
- data/README.md +31 -2
- data/Rakefile +4 -1
- data/lib/paper_trail.rb +2 -0
- data/lib/paper_trail/serializers/json.rb +9 -0
- data/lib/paper_trail/version_concern.rb +1 -1
- data/lib/paper_trail/version_number.rb +2 -2
- data/paper_trail.gemspec +2 -3
- data/spec/controllers/widgets_controller_spec.rb +85 -0
- data/{test/dummy → spec/dummy_app}/Rakefile +0 -0
- data/{test/dummy → spec/dummy_app}/app/controllers/application_controller.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/controllers/articles_controller.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/controllers/test_controller.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/controllers/widgets_controller.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/animal.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/article.rb +1 -0
- data/{test/dummy → spec/dummy_app}/app/models/authorship.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/bar_habtm.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/book.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/boolit.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/callback_modifier.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/car.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/cat.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/chapter.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/citation.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/custom_primary_key_record.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/customer.rb +0 -0
- data/spec/dummy_app/app/models/document.rb +8 -0
- data/{test/dummy → spec/dummy_app}/app/models/dog.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/editor.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/editorship.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/elephant.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/fluxor.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/foo_habtm.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/foo_widget.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/fruit.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/gadget.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/kitchen/banana.rb +0 -0
- data/spec/dummy_app/app/models/legacy_widget.rb +6 -0
- data/{test/dummy → spec/dummy_app}/app/models/line_item.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/not_on_update.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/on/create.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/on/destroy.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/on/empty_array.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/on/update.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/order.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/paragraph.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/person.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/post.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/post_with_status.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/quotation.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/section.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/skipper.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/song.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/thing.rb +0 -0
- data/spec/dummy_app/app/models/translation.rb +11 -0
- data/{test/dummy → spec/dummy_app}/app/models/truck.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/vehicle.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/whatchamajigger.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/widget.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/models/wotsit.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/versions/custom_primary_key_record_version.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/versions/joined_version.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/versions/json_version.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/versions/kitchen/banana_version.rb +0 -0
- data/{test/dummy → spec/dummy_app}/app/versions/post_version.rb +0 -0
- data/{test/dummy → spec/dummy_app}/config.ru +0 -0
- data/{test/dummy → spec/dummy_app}/config/application.rb +0 -0
- data/{test/dummy → spec/dummy_app}/config/boot.rb +0 -0
- data/{test/dummy → spec/dummy_app}/config/database.mysql.yml +0 -0
- data/{test/dummy → spec/dummy_app}/config/database.postgres.yml +0 -0
- data/{test/dummy → spec/dummy_app}/config/database.sqlite.yml +0 -0
- data/{test/dummy → spec/dummy_app}/config/environment.rb +0 -0
- data/{test/dummy → spec/dummy_app}/config/environments/development.rb +0 -0
- data/{test/dummy → spec/dummy_app}/config/environments/production.rb +0 -0
- data/{test/dummy → spec/dummy_app}/config/environments/test.rb +0 -0
- data/{test/dummy → spec/dummy_app}/config/initializers/backtrace_silencers.rb +0 -0
- data/{test/dummy → spec/dummy_app}/config/initializers/inflections.rb +0 -0
- data/{test/dummy → spec/dummy_app}/config/initializers/mime_types.rb +0 -0
- data/{test/dummy → spec/dummy_app}/config/initializers/paper_trail.rb +0 -0
- data/{test/dummy → spec/dummy_app}/config/initializers/secret_token.rb +0 -0
- data/{test/dummy → spec/dummy_app}/config/initializers/session_store.rb +0 -0
- data/{test/dummy → spec/dummy_app}/config/locales/en.yml +0 -0
- data/{test/dummy → spec/dummy_app}/config/routes.rb +0 -0
- data/{test/dummy → spec/dummy_app}/db/migrate/20110208155312_set_up_test_tables.rb +0 -0
- data/{test/dummy → spec/dummy_app}/db/schema.rb +0 -0
- data/spec/models/article_spec.rb +186 -0
- data/spec/models/document_spec.rb +41 -5
- data/spec/models/legacy_widget_spec.rb +40 -0
- data/spec/models/on/create_spec.rb +27 -0
- data/spec/models/on/destroy_spec.rb +27 -0
- data/spec/models/on/empty_array_spec.rb +30 -0
- data/spec/models/on/update_spec.rb +27 -0
- data/spec/models/translation_spec.rb +70 -0
- data/spec/models/version_spec.rb +7 -3
- data/spec/paper_trail/config_spec.rb +12 -0
- data/spec/paper_trail/model_spec.rb +0 -429
- data/spec/paper_trail/serializers/custom_json_serializer_spec.rb +18 -0
- data/spec/paper_trail/thread_safety_spec.rb +44 -0
- data/spec/paper_trail_spec.rb +9 -0
- data/spec/spec_helper.rb +6 -10
- metadata +178 -179
- data/test/dummy/app/models/document.rb +0 -6
- data/test/dummy/app/models/legacy_widget.rb +0 -3
- data/test/dummy/app/models/translation.rb +0 -6
- data/test/functional/controller_test.rb +0 -90
- data/test/functional/thread_safety_test.rb +0 -46
- data/test/test_helper.rb +0 -68
- data/test/unit/serializers/mixin_json_test.rb +0 -39
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
require "test_helper"
|
|
2
|
-
|
|
3
|
-
class ControllerTest < ActionController::TestCase
|
|
4
|
-
tests WidgetsController
|
|
5
|
-
|
|
6
|
-
setup do
|
|
7
|
-
@request.env["REMOTE_ADDR"] = "127.0.0.1"
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
# Mimick what RequestStore will do outside of the test env, since it is
|
|
11
|
-
# middleware, and doesn't get executed in controller / request specs
|
|
12
|
-
teardown do
|
|
13
|
-
RequestStore.store[:paper_trail] = nil
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
test "disable on create" do
|
|
17
|
-
@request.env["HTTP_USER_AGENT"] = "Disable User-Agent"
|
|
18
|
-
post :create, params_wrapper(widget: { name: "Flugel" })
|
|
19
|
-
assert_equal 0, assigns(:widget).versions.length
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
test "disable on update" do
|
|
23
|
-
@request.env["HTTP_USER_AGENT"] = "Disable User-Agent"
|
|
24
|
-
post :create, params_wrapper(widget: { name: "Flugel" })
|
|
25
|
-
w = assigns(:widget)
|
|
26
|
-
assert_equal 0, w.versions.length
|
|
27
|
-
put :update, params_wrapper(id: w.id, widget: { name: "Bugle" })
|
|
28
|
-
widget = assigns(:widget)
|
|
29
|
-
assert_equal 0, widget.versions.length
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
test "disable on destroy" do
|
|
33
|
-
@request.env["HTTP_USER_AGENT"] = "Disable User-Agent"
|
|
34
|
-
post :create, params_wrapper(widget: { name: "Flugel" })
|
|
35
|
-
w = assigns(:widget)
|
|
36
|
-
assert_equal 0, w.versions.length
|
|
37
|
-
delete :destroy, params_wrapper(id: w.id)
|
|
38
|
-
assert_equal 0, PaperTrail::Version.with_item_keys("Widget", w.id).size
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
test "create" do
|
|
42
|
-
post :create, params_wrapper(widget: { name: "Flugel" })
|
|
43
|
-
widget = assigns(:widget)
|
|
44
|
-
assert_equal 1, widget.versions.length
|
|
45
|
-
assert_equal 153, widget.versions.last.whodunnit.to_i
|
|
46
|
-
assert_equal "127.0.0.1", widget.versions.last.ip
|
|
47
|
-
assert_equal "Rails Testing", widget.versions.last.user_agent
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
test "update" do
|
|
51
|
-
w = Widget.create name: "Duvel"
|
|
52
|
-
assert_equal 1, w.versions.length
|
|
53
|
-
put :update, params_wrapper(id: w.id, widget: { name: "Bugle" })
|
|
54
|
-
widget = assigns(:widget)
|
|
55
|
-
assert_equal 2, widget.versions.length
|
|
56
|
-
assert_equal 153, widget.versions.last.whodunnit.to_i
|
|
57
|
-
assert_equal "127.0.0.1", widget.versions.last.ip
|
|
58
|
-
assert_equal "Rails Testing", widget.versions.last.user_agent
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
test "destroy" do
|
|
62
|
-
w = Widget.create name: "Roundel"
|
|
63
|
-
assert_equal 1, w.versions.length
|
|
64
|
-
delete :destroy, params_wrapper(id: w.id)
|
|
65
|
-
widget = assigns(:widget)
|
|
66
|
-
assert_equal 2, widget.versions.length
|
|
67
|
-
assert_equal "127.0.0.1", widget.versions.last.ip
|
|
68
|
-
assert_equal "Rails Testing", widget.versions.last.user_agent
|
|
69
|
-
assert_equal 153, widget.versions.last.whodunnit.to_i
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
test "controller metadata methods should get evaluated if PT enabled for controller" do
|
|
73
|
-
@request.env["HTTP_USER_AGENT"] = "User-Agent"
|
|
74
|
-
post :create, params_wrapper(widget: { name: "Flugel" })
|
|
75
|
-
assert PaperTrail.enabled_for_controller?
|
|
76
|
-
assert_equal 153, PaperTrail.whodunnit
|
|
77
|
-
assert PaperTrail.controller_info.present?
|
|
78
|
-
assert PaperTrail.controller_info.keys.include?(:ip)
|
|
79
|
-
assert PaperTrail.controller_info.keys.include?(:user_agent)
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
test "controller metadata methods should not get evaluated if PT disabled for controller" do
|
|
83
|
-
@request.env["HTTP_USER_AGENT"] = "Disable User-Agent"
|
|
84
|
-
post :create, params_wrapper(widget: { name: "Flugel" })
|
|
85
|
-
assert_equal 0, assigns(:widget).versions.length
|
|
86
|
-
assert !PaperTrail.enabled_for_controller?
|
|
87
|
-
assert PaperTrail.whodunnit.nil?
|
|
88
|
-
assert PaperTrail.controller_info.nil?
|
|
89
|
-
end
|
|
90
|
-
end
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
require "test_helper"
|
|
2
|
-
|
|
3
|
-
class ThreadSafetyTest < ActionController::TestCase
|
|
4
|
-
test "thread-safe when using #set_paper_trail_whodunnit" do
|
|
5
|
-
blocked = true
|
|
6
|
-
|
|
7
|
-
slow_thread = Thread.new do
|
|
8
|
-
controller = TestController.new
|
|
9
|
-
controller.send :set_paper_trail_whodunnit
|
|
10
|
-
sleep 0.001 while blocked
|
|
11
|
-
PaperTrail.whodunnit
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
fast_thread = Thread.new do
|
|
15
|
-
controller = TestController.new
|
|
16
|
-
controller.send :set_paper_trail_whodunnit
|
|
17
|
-
who = PaperTrail.whodunnit
|
|
18
|
-
blocked = false
|
|
19
|
-
who
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
assert_not_equal slow_thread.value, fast_thread.value
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
test "thread-safe when using #without_versioning" do
|
|
26
|
-
enabled = nil
|
|
27
|
-
|
|
28
|
-
slow_thread = Thread.new do
|
|
29
|
-
Widget.new.paper_trail.without_versioning do
|
|
30
|
-
sleep(0.01)
|
|
31
|
-
enabled = Widget.paper_trail.enabled?
|
|
32
|
-
sleep(0.01)
|
|
33
|
-
end
|
|
34
|
-
enabled
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
fast_thread = Thread.new do
|
|
38
|
-
sleep(0.005)
|
|
39
|
-
Widget.paper_trail.enabled?
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
assert_not_equal slow_thread.value, fast_thread.value
|
|
43
|
-
assert Widget.paper_trail.enabled?
|
|
44
|
-
assert PaperTrail.enabled_for_model?(Widget)
|
|
45
|
-
end
|
|
46
|
-
end
|
data/test/test_helper.rb
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
require "pry"
|
|
2
|
-
|
|
3
|
-
ENV["RAILS_ENV"] = "test"
|
|
4
|
-
ENV["DB"] ||= "sqlite"
|
|
5
|
-
|
|
6
|
-
unless File.exist?(File.expand_path("../../test/dummy/config/database.yml", __FILE__))
|
|
7
|
-
warn "WARNING: No database.yml detected for the dummy app, please run `rake prepare` first"
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def using_mysql?
|
|
11
|
-
@using_mysql ||= ActiveRecord::Base.connection_config[:adapter].to_sym == :mysql2
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
|
15
|
-
require "rails/test_help"
|
|
16
|
-
require "shoulda"
|
|
17
|
-
require "ffaker"
|
|
18
|
-
require "database_cleaner"
|
|
19
|
-
|
|
20
|
-
def active_record_gem_version
|
|
21
|
-
Gem::Version.new(ActiveRecord::VERSION::STRING)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
if active_record_gem_version >= Gem::Version.new("5.0.0.beta1")
|
|
25
|
-
# See https://github.com/rails/rails-controller-testing/issues/5
|
|
26
|
-
ActionController::TestCase.send(:include, Rails::Controller::Testing::TestProcess)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
Rails.backtrace_cleaner.remove_silencers!
|
|
30
|
-
|
|
31
|
-
# Run any available migration
|
|
32
|
-
ActiveRecord::Migrator.migrate File.expand_path("../dummy/db/migrate/", __FILE__)
|
|
33
|
-
|
|
34
|
-
# Load support files
|
|
35
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
|
36
|
-
|
|
37
|
-
# DatabaseCleaner is apparently necessary for doing proper transactions within MySQL (ugh)
|
|
38
|
-
DatabaseCleaner.strategy = :truncation
|
|
39
|
-
|
|
40
|
-
# global setup block resetting Thread.current
|
|
41
|
-
module ActiveSupport
|
|
42
|
-
class TestCase
|
|
43
|
-
if using_mysql?
|
|
44
|
-
if respond_to? :use_transactional_tests=
|
|
45
|
-
self.use_transactional_tests = false
|
|
46
|
-
else
|
|
47
|
-
self.use_transactional_fixtures = false
|
|
48
|
-
end
|
|
49
|
-
setup { DatabaseCleaner.start }
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
teardown do
|
|
53
|
-
DatabaseCleaner.clean if using_mysql?
|
|
54
|
-
Thread.current[:paper_trail] = nil
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# Wrap args in a hash to support the ActionController::TestCase and
|
|
60
|
-
# ActionDispatch::Integration HTTP request method switch to keyword args
|
|
61
|
-
# (see https://github.com/rails/rails/blob/master/actionpack/CHANGELOG.md)
|
|
62
|
-
def params_wrapper(args)
|
|
63
|
-
if defined?(::Rails) && active_record_gem_version >= Gem::Version.new("5.0.0.beta1")
|
|
64
|
-
{ params: args }
|
|
65
|
-
else
|
|
66
|
-
args
|
|
67
|
-
end
|
|
68
|
-
end
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
require "test_helper"
|
|
2
|
-
require_relative "../../../spec/support/custom_json_serializer"
|
|
3
|
-
|
|
4
|
-
class MixinJsonTest < ActiveSupport::TestCase
|
|
5
|
-
setup do
|
|
6
|
-
# Setup a hash with random values, ensuring some values are nil
|
|
7
|
-
@hash = {}
|
|
8
|
-
(1..4).each do |i|
|
|
9
|
-
@hash["key#{i}"] = [FFaker::Lorem.word, nil].sample
|
|
10
|
-
end
|
|
11
|
-
@hash["tkey"] = nil
|
|
12
|
-
@hash[""] = "foo"
|
|
13
|
-
@hash_as_json = @hash.to_json
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
context "`load` class method" do
|
|
17
|
-
should "exist" do
|
|
18
|
-
assert CustomJsonSerializer.respond_to?(:load)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
should "`deserialize` JSON to Ruby, removing pairs with `blank` keys or values" do
|
|
22
|
-
assert_equal(
|
|
23
|
-
@hash.reject { |k, v| k.blank? || v.blank? },
|
|
24
|
-
CustomJsonSerializer.load(@hash_as_json)
|
|
25
|
-
)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
context "`dump` class method" do
|
|
30
|
-
should "exist" do
|
|
31
|
-
assert CustomJsonSerializer.respond_to?(:dump)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
should "`serialize` Ruby to JSON, removing pairs with `nil` values" do
|
|
35
|
-
assert_equal @hash.reject { |_k, v| v.nil? }.to_json,
|
|
36
|
-
CustomJsonSerializer.dump(@hash)
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|