From b8a9d8154bc0130594377ba459b8cabce43c8785 Mon Sep 17 00:00:00 2001 From: Alex Evanczuk Date: Sun, 25 Feb 2018 18:40:46 -0800 Subject: [PATCH] Add specs to request variables branch (#1052) --- .gitignore | 2 + spec/paper_trail/model_config_spec.rb | 35 +++++++ spec/paper_trail/request_spec.rb | 129 ++++++++++++++++++++++++-- spec/paper_trail_spec.rb | 47 ++++++++++ spec/spec_helper.rb | 2 + 5 files changed, 206 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 80a4d0d9a..a52ef39f4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,11 @@ *.gem +*.sqlite3-journal .bundle .byebug_history .idea .rbenv-gemsets .rbenv-version +.rspec_results .ruby-gemset .ruby-version .rvmrc diff --git a/spec/paper_trail/model_config_spec.rb b/spec/paper_trail/model_config_spec.rb index d512e0f49..3e8fbf67f 100644 --- a/spec/paper_trail/model_config_spec.rb +++ b/spec/paper_trail/model_config_spec.rb @@ -15,5 +15,40 @@ class MisconfiguredCVC < ActiveRecord::Base ) end end + + describe "deprecated methods" do + let(:config) { PaperTrail::ModelConfig.new(:some_model_class) } + + before do + allow(ActiveSupport::Deprecation).to receive(:warn) + end + + describe "disable" do + it "delegates to request" do + allow(PaperTrail.request).to receive(:disable_model) + config.disable + expect(PaperTrail.request).to have_received(:disable_model).with(:some_model_class) + expect(ActiveSupport::Deprecation).to have_received(:warn) + end + end + + describe "enable" do + it "delegates to request" do + allow(PaperTrail.request).to receive(:enable_model) + config.enable + expect(PaperTrail.request).to have_received(:enable_model).with(:some_model_class) + expect(ActiveSupport::Deprecation).to have_received(:warn) + end + end + + describe "enabled?" do + it "delegates to request" do + allow(PaperTrail.request).to receive(:enabled_for_model?) + config.enabled? + expect(PaperTrail.request).to have_received(:enabled_for_model?).with(:some_model_class) + expect(ActiveSupport::Deprecation).to have_received(:warn) + end + end + end end end diff --git a/spec/paper_trail/request_spec.rb b/spec/paper_trail/request_spec.rb index 3d045c96b..b0aa48bb9 100644 --- a/spec/paper_trail/request_spec.rb +++ b/spec/paper_trail/request_spec.rb @@ -22,6 +22,55 @@ module PaperTrail end end + describe ".enabled_for_model" do + it "sets enabled_for_model? to true" do + PaperTrail.request.enabled_for_model(Widget, false) + expect(PaperTrail.request.enabled_for_model?(Widget)).to eq(false) + PaperTrail.request.enabled_for_model(Widget, true) + expect(PaperTrail.request.enabled_for_model?(Widget)).to eq(true) + end + + after do + PaperTrail.request.enable_model(Widget) + end + end + + describe ".enabled_for_controller?" do + it "returns true" do + expect(PaperTrail.request.enabled_for_controller?).to eq(true) + end + end + + describe ".enabled_for_controller=" do + it "sets enabled_for_controller? to true" do + PaperTrail.request.enabled_for_controller = true + expect(PaperTrail.request.enabled_for_controller?).to eq(true) + PaperTrail.request.enabled_for_controller = false + expect(PaperTrail.request.enabled_for_controller?).to eq(false) + end + + after do + PaperTrail.request.enabled_for_controller = true + end + end + + describe ".controller_info" do + it "returns an empty hash" do + expect(PaperTrail.request.controller_info).to eq({}) + end + end + + describe ".controller_info=" do + it "sets controller_info" do + PaperTrail.request.controller_info = { foo: :bar } + expect(PaperTrail.request.controller_info).to eq(foo: :bar) + end + + after do + PaperTrail.request.controller_info = {} + end + end + describe ".enable_model" do it "sets enabled_for_model? to true" do PaperTrail.request.disable_model(Widget) @@ -44,23 +93,85 @@ module PaperTrail expect(described_class.whodunnit).to eq(2) end end + + context "when set to a primtive value" do + it "returns the primitive value" do + described_class.whodunnit = :some_whodunnit + expect(described_class.whodunnit).to eq(:some_whodunnit) + end + end end describe ".with" do context "block given" do - it "sets whodunnit only for the block passed" do - described_class.with(whodunnit: "foo") do - expect(described_class.whodunnit).to eq("foo") + context "all allowed options" do + it "sets options only for the block passed" do + described_class.whodunnit = "some_whodunnit" + described_class.enabled_for_model(Widget, true) + + described_class.with(whodunnit: "foo", enabled_for_Widget: false) do + expect(described_class.whodunnit).to eq("foo") + expect(described_class.enabled_for_model?(Widget)).to eq false + end + expect(described_class.whodunnit).to eq "some_whodunnit" + expect(described_class.enabled_for_model?(Widget)).to eq true + end + + it "sets options only for the current thread" do + described_class.whodunnit = "some_whodunnit" + described_class.enabled_for_model(Widget, true) + + described_class.with(whodunnit: "foo", enabled_for_Widget: false) do + expect(described_class.whodunnit).to eq("foo") + expect(described_class.enabled_for_model?(Widget)).to eq false + Thread.new { expect(described_class.whodunnit).to be_nil }.join + Thread.new { expect(described_class.enabled_for_model?(Widget)).to eq true }.join + end + expect(described_class.whodunnit).to eq "some_whodunnit" + expect(described_class.enabled_for_model?(Widget)).to eq true + end + end + + context "some invalid options" do + it "raises an invalid option error" do + subject = proc do + described_class.with(whodunnit: "blah", invalid_option: "foo") do + raise "This block should not be reached" + end + end + + expect { subject.call }.to raise_error(PaperTrail::Request::InvalidOption) do |e| + expect(e.message).to eq "Invalid option: invalid_option" + end end - expect(described_class.whodunnit).to be_nil end - it "sets whodunnit only for the current thread" do - described_class.with(whodunnit: "foo") do - expect(described_class.whodunnit).to eq("foo") - Thread.new { expect(described_class.whodunnit).to be_nil }.join + context "all invalid options" do + it "raises an invalid option error" do + subject = proc do + described_class.with(invalid_option: "foo", other_invalid_option: "blah") do + raise "This block should not be reached" + end + end + + expect { subject.call }.to raise_error(PaperTrail::Request::InvalidOption) do |e| + expect(e.message).to eq "Invalid option: invalid_option" + end + end + end + + context "private options" do + it "raises an invalid option error" do + subject = proc do + described_class.with(transaction_id: "blah") do + raise "This block should not be reached" + end + end + + expect { subject.call }.to raise_error(PaperTrail::Request::InvalidOption) do |e| + expect(e.message).to eq "Cannot set private option: transaction_id" + end end - expect(described_class.whodunnit).to be_nil end end end diff --git a/spec/paper_trail_spec.rb b/spec/paper_trail_spec.rb index 51423849b..2e3186308 100644 --- a/spec/paper_trail_spec.rb +++ b/spec/paper_trail_spec.rb @@ -98,4 +98,51 @@ expect(described_class.version).to eq(described_class::VERSION::STRING) end end + + describe "deprecated methods" do + before do + allow(ActiveSupport::Deprecation).to receive(:warn) + end + + shared_examples "it delegates to request" do |method, args| + it do + arguments = args || [no_args] + allow(described_class.request).to receive(method) + described_class.public_send(method, *args) + expect(described_class.request).to have_received(method).with(*arguments) + expect(ActiveSupport::Deprecation).to have_received(:warn) + end + end + + it_behaves_like "it delegates to request", :clear_transaction_id, nil + it_behaves_like "it delegates to request", :enabled_for_controller=, [true] + it_behaves_like "it delegates to request", :enabled_for_model, [Widget, true] + it_behaves_like "it delegates to request", :enabled_for_model?, [Widget] + it_behaves_like "it delegates to request", :whodunnit=, [:some_whodunnit] + it_behaves_like "it delegates to request", :whodunnit, nil + it_behaves_like "it delegates to request", :controller_info=, [:some_whodunnit] + it_behaves_like "it delegates to request", :controller_info, nil + it_behaves_like "it delegates to request", :transaction_id=, 123 + it_behaves_like "it delegates to request", :transaction_id, nil + + describe "whodunnit with block" do + it "delegates to request" do + allow(described_class.request).to receive(:with) + described_class.whodunnit(:some_whodunnit) { :some_block } + expect(ActiveSupport::Deprecation).to have_received(:warn) + expect(described_class.request).to have_received(:with) do |*args, &block| + expect(args).to eq([{ whodunnit: :some_whodunnit }]) + expect(block.call).to eq :some_block + end + end + end + + describe "whodunnit with invalid arguments" do + it "raises an error" do + expect { described_class.whodunnit(:some_whodunnit) }.to raise_error(ArgumentError) do |e| + expect(e.message).to eq "Invalid arguments" + end + end + end + end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index f396c3702..98fefa123 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -10,6 +10,8 @@ end RSpec.configure do |config| + config.example_status_persistence_file_path = ".rspec_results" + config.expect_with :rspec do |expectations| expectations.include_chain_clauses_in_custom_matcher_descriptions = true end