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.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CONTRIBUTING.md +21 -27
  3. data/.gitignore +4 -4
  4. data/.rubocop.yml +2 -2
  5. data/CHANGELOG.md +17 -0
  6. data/README.md +31 -2
  7. data/Rakefile +4 -1
  8. data/lib/paper_trail.rb +2 -0
  9. data/lib/paper_trail/serializers/json.rb +9 -0
  10. data/lib/paper_trail/version_concern.rb +1 -1
  11. data/lib/paper_trail/version_number.rb +2 -2
  12. data/paper_trail.gemspec +2 -3
  13. data/spec/controllers/widgets_controller_spec.rb +85 -0
  14. data/{test/dummy → spec/dummy_app}/Rakefile +0 -0
  15. data/{test/dummy → spec/dummy_app}/app/controllers/application_controller.rb +0 -0
  16. data/{test/dummy → spec/dummy_app}/app/controllers/articles_controller.rb +0 -0
  17. data/{test/dummy → spec/dummy_app}/app/controllers/test_controller.rb +0 -0
  18. data/{test/dummy → spec/dummy_app}/app/controllers/widgets_controller.rb +0 -0
  19. data/{test/dummy → spec/dummy_app}/app/models/animal.rb +0 -0
  20. data/{test/dummy → spec/dummy_app}/app/models/article.rb +1 -0
  21. data/{test/dummy → spec/dummy_app}/app/models/authorship.rb +0 -0
  22. data/{test/dummy → spec/dummy_app}/app/models/bar_habtm.rb +0 -0
  23. data/{test/dummy → spec/dummy_app}/app/models/book.rb +0 -0
  24. data/{test/dummy → spec/dummy_app}/app/models/boolit.rb +0 -0
  25. data/{test/dummy → spec/dummy_app}/app/models/callback_modifier.rb +0 -0
  26. data/{test/dummy → spec/dummy_app}/app/models/car.rb +0 -0
  27. data/{test/dummy → spec/dummy_app}/app/models/cat.rb +0 -0
  28. data/{test/dummy → spec/dummy_app}/app/models/chapter.rb +0 -0
  29. data/{test/dummy → spec/dummy_app}/app/models/citation.rb +0 -0
  30. data/{test/dummy → spec/dummy_app}/app/models/custom_primary_key_record.rb +0 -0
  31. data/{test/dummy → spec/dummy_app}/app/models/customer.rb +0 -0
  32. data/spec/dummy_app/app/models/document.rb +8 -0
  33. data/{test/dummy → spec/dummy_app}/app/models/dog.rb +0 -0
  34. data/{test/dummy → spec/dummy_app}/app/models/editor.rb +0 -0
  35. data/{test/dummy → spec/dummy_app}/app/models/editorship.rb +0 -0
  36. data/{test/dummy → spec/dummy_app}/app/models/elephant.rb +0 -0
  37. data/{test/dummy → spec/dummy_app}/app/models/fluxor.rb +0 -0
  38. data/{test/dummy → spec/dummy_app}/app/models/foo_habtm.rb +0 -0
  39. data/{test/dummy → spec/dummy_app}/app/models/foo_widget.rb +0 -0
  40. data/{test/dummy → spec/dummy_app}/app/models/fruit.rb +0 -0
  41. data/{test/dummy → spec/dummy_app}/app/models/gadget.rb +0 -0
  42. data/{test/dummy → spec/dummy_app}/app/models/kitchen/banana.rb +0 -0
  43. data/spec/dummy_app/app/models/legacy_widget.rb +6 -0
  44. data/{test/dummy → spec/dummy_app}/app/models/line_item.rb +0 -0
  45. data/{test/dummy → spec/dummy_app}/app/models/not_on_update.rb +0 -0
  46. data/{test/dummy → spec/dummy_app}/app/models/on/create.rb +0 -0
  47. data/{test/dummy → spec/dummy_app}/app/models/on/destroy.rb +0 -0
  48. data/{test/dummy → spec/dummy_app}/app/models/on/empty_array.rb +0 -0
  49. data/{test/dummy → spec/dummy_app}/app/models/on/update.rb +0 -0
  50. data/{test/dummy → spec/dummy_app}/app/models/order.rb +0 -0
  51. data/{test/dummy → spec/dummy_app}/app/models/paragraph.rb +0 -0
  52. data/{test/dummy → spec/dummy_app}/app/models/person.rb +0 -0
  53. data/{test/dummy → spec/dummy_app}/app/models/post.rb +0 -0
  54. data/{test/dummy → spec/dummy_app}/app/models/post_with_status.rb +0 -0
  55. data/{test/dummy → spec/dummy_app}/app/models/quotation.rb +0 -0
  56. data/{test/dummy → spec/dummy_app}/app/models/section.rb +0 -0
  57. data/{test/dummy → spec/dummy_app}/app/models/skipper.rb +0 -0
  58. data/{test/dummy → spec/dummy_app}/app/models/song.rb +0 -0
  59. data/{test/dummy → spec/dummy_app}/app/models/thing.rb +0 -0
  60. data/spec/dummy_app/app/models/translation.rb +11 -0
  61. data/{test/dummy → spec/dummy_app}/app/models/truck.rb +0 -0
  62. data/{test/dummy → spec/dummy_app}/app/models/vehicle.rb +0 -0
  63. data/{test/dummy → spec/dummy_app}/app/models/whatchamajigger.rb +0 -0
  64. data/{test/dummy → spec/dummy_app}/app/models/widget.rb +0 -0
  65. data/{test/dummy → spec/dummy_app}/app/models/wotsit.rb +0 -0
  66. data/{test/dummy → spec/dummy_app}/app/versions/custom_primary_key_record_version.rb +0 -0
  67. data/{test/dummy → spec/dummy_app}/app/versions/joined_version.rb +0 -0
  68. data/{test/dummy → spec/dummy_app}/app/versions/json_version.rb +0 -0
  69. data/{test/dummy → spec/dummy_app}/app/versions/kitchen/banana_version.rb +0 -0
  70. data/{test/dummy → spec/dummy_app}/app/versions/post_version.rb +0 -0
  71. data/{test/dummy → spec/dummy_app}/config.ru +0 -0
  72. data/{test/dummy → spec/dummy_app}/config/application.rb +0 -0
  73. data/{test/dummy → spec/dummy_app}/config/boot.rb +0 -0
  74. data/{test/dummy → spec/dummy_app}/config/database.mysql.yml +0 -0
  75. data/{test/dummy → spec/dummy_app}/config/database.postgres.yml +0 -0
  76. data/{test/dummy → spec/dummy_app}/config/database.sqlite.yml +0 -0
  77. data/{test/dummy → spec/dummy_app}/config/environment.rb +0 -0
  78. data/{test/dummy → spec/dummy_app}/config/environments/development.rb +0 -0
  79. data/{test/dummy → spec/dummy_app}/config/environments/production.rb +0 -0
  80. data/{test/dummy → spec/dummy_app}/config/environments/test.rb +0 -0
  81. data/{test/dummy → spec/dummy_app}/config/initializers/backtrace_silencers.rb +0 -0
  82. data/{test/dummy → spec/dummy_app}/config/initializers/inflections.rb +0 -0
  83. data/{test/dummy → spec/dummy_app}/config/initializers/mime_types.rb +0 -0
  84. data/{test/dummy → spec/dummy_app}/config/initializers/paper_trail.rb +0 -0
  85. data/{test/dummy → spec/dummy_app}/config/initializers/secret_token.rb +0 -0
  86. data/{test/dummy → spec/dummy_app}/config/initializers/session_store.rb +0 -0
  87. data/{test/dummy → spec/dummy_app}/config/locales/en.yml +0 -0
  88. data/{test/dummy → spec/dummy_app}/config/routes.rb +0 -0
  89. data/{test/dummy → spec/dummy_app}/db/migrate/20110208155312_set_up_test_tables.rb +0 -0
  90. data/{test/dummy → spec/dummy_app}/db/schema.rb +0 -0
  91. data/spec/models/article_spec.rb +186 -0
  92. data/spec/models/document_spec.rb +41 -5
  93. data/spec/models/legacy_widget_spec.rb +40 -0
  94. data/spec/models/on/create_spec.rb +27 -0
  95. data/spec/models/on/destroy_spec.rb +27 -0
  96. data/spec/models/on/empty_array_spec.rb +30 -0
  97. data/spec/models/on/update_spec.rb +27 -0
  98. data/spec/models/translation_spec.rb +70 -0
  99. data/spec/models/version_spec.rb +7 -3
  100. data/spec/paper_trail/config_spec.rb +12 -0
  101. data/spec/paper_trail/model_spec.rb +0 -429
  102. data/spec/paper_trail/serializers/custom_json_serializer_spec.rb +18 -0
  103. data/spec/paper_trail/thread_safety_spec.rb +44 -0
  104. data/spec/paper_trail_spec.rb +9 -0
  105. data/spec/spec_helper.rb +6 -10
  106. metadata +178 -179
  107. data/test/dummy/app/models/document.rb +0 -6
  108. data/test/dummy/app/models/legacy_widget.rb +0 -3
  109. data/test/dummy/app/models/translation.rb +0 -6
  110. data/test/functional/controller_test.rb +0 -90
  111. data/test/functional/thread_safety_test.rb +0 -46
  112. data/test/test_helper.rb +0 -68
  113. data/test/unit/serializers/mixin_json_test.rb +0 -39
@@ -1,6 +0,0 @@
1
- class Document < ActiveRecord::Base
2
- has_paper_trail(
3
- versions: :paper_trail_versions,
4
- on: %i[create update]
5
- )
6
- end
@@ -1,3 +0,0 @@
1
- class LegacyWidget < ActiveRecord::Base
2
- has_paper_trail ignore: :version, version: "custom_version"
3
- end
@@ -1,6 +0,0 @@
1
- class Translation < ActiveRecord::Base
2
- has_paper_trail(
3
- if: proc { |t| t.language_code == "US" },
4
- unless: proc { |t| t.type == "DRAFT" }
5
- )
6
- end
@@ -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