paper_trail 7.0.3 → 7.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|