From cf99fb33589351bc2ff4393b33489704f6a9c631 Mon Sep 17 00:00:00 2001 From: Jared Beck Date: Sat, 1 Apr 2017 20:13:08 -0400 Subject: [PATCH] Lint: Finish fixing RSpec/NestedGroups --- .rubocop_todo.yml | 3 - spec/models/boolit_spec.rb | 54 ++++----- spec/models/callback_modifier_spec.rb | 166 +++++++++++++------------- spec/models/gadget_spec.rb | 55 +++++---- spec/models/joined_version_spec.rb | 54 ++++----- spec/models/skipper_spec.rb | 66 +++++----- 6 files changed, 186 insertions(+), 212 deletions(-) diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 7a6cd2ac..040abf32 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -27,8 +27,5 @@ RSpec/MessageSpies: RSpec/NamedSubject: Enabled: false -RSpec/NestedGroups: - Max: 4 # goal: 3 - Security/YAMLLoad: Enabled: false diff --git a/spec/models/boolit_spec.rb b/spec/models/boolit_spec.rb index ce8c6dcf..eafccfb4 100644 --- a/spec/models/boolit_spec.rb +++ b/spec/models/boolit_spec.rb @@ -1,48 +1,40 @@ require "rails_helper" require Rails.root.join("..", "custom_json_serializer") -describe Boolit, type: :model do - it { is_expected.to be_versioned } +RSpec.describe Boolit, type: :model, versioning: true do + subject { Boolit.create! } - it "has a default scope" do - expect(subject.default_scopes).not_to be_empty + before { subject.update_attributes!(name: FFaker::Name.name) } + + it "has two versions" do + expect(subject.versions.size).to eq(2) end - describe "Versioning", versioning: true do - subject { Boolit.create! } + it "can be reified and persisted" do + expect { subject.versions.last.reify.save! }.not_to raise_error + end - before { subject.update_attributes!(name: FFaker::Name.name) } + context "Instance falls out of default scope" do + before { subject.update_attributes!(scoped: false) } - it "has two versions" do - expect(subject.versions.size).to eq(2) + it "is NOT scoped" do + expect(Boolit.first).to be_nil end - it "can be reified and persisted" do - expect { subject.versions.last.reify.save! }.not_to raise_error + it "still can be reified and persisted" do + expect { subject.paper_trail.previous_version.save! }.not_to raise_error end - context "Instance falls out of default scope" do - before { subject.update_attributes!(scoped: false) } - - it "is NOT scoped" do - expect(Boolit.first).to be_nil + context "with `nil` attributes on the live instance" do + before do + PaperTrail.serializer = CustomJsonSerializer + subject.update_attributes!(name: nil) + subject.update_attributes!(name: FFaker::Name.name) end + after { PaperTrail.serializer = PaperTrail::Serializers::YAML } - it "still can be reified and persisted" do - expect { subject.paper_trail.previous_version.save! }.not_to raise_error - end - - context "with `nil` attributes on the live instance" do - before do - PaperTrail.serializer = CustomJsonSerializer - subject.update_attributes!(name: nil) - subject.update_attributes!(name: FFaker::Name.name) - end - after { PaperTrail.serializer = PaperTrail::Serializers::YAML } - - it "does not overwrite that attribute during the reification process" do - expect(subject.paper_trail.previous_version.name).to be_nil - end + it "does not overwrite that attribute during the reification process" do + expect(subject.paper_trail.previous_version.name).to be_nil end end end diff --git a/spec/models/callback_modifier_spec.rb b/spec/models/callback_modifier_spec.rb index 87c1ebde..bfcf93ed 100644 --- a/spec/models/callback_modifier_spec.rb +++ b/spec/models/callback_modifier_spec.rb @@ -1,96 +1,92 @@ require "rails_helper" -describe CallbackModifier, type: :model do - with_versioning do - describe "callback-methods", versioning: true do - describe "paper_trail_on_destroy" do - it "adds :destroy to paper_trail_options[:on]" do - modifier = NoArgDestroyModifier.create!(some_content: FFaker::Lorem.sentence) - expect(modifier.paper_trail_options[:on]).to eq [:destroy] - end +RSpec.describe CallbackModifier, type: :model, versioning: true do + describe "paper_trail_on_destroy" do + it "adds :destroy to paper_trail_options[:on]" do + modifier = NoArgDestroyModifier.create!(some_content: FFaker::Lorem.sentence) + expect(modifier.paper_trail_options[:on]).to eq([:destroy]) + end - context "when :before" do - it "creates the version before destroy" do - modifier = BeforeDestroyModifier.create!(some_content: FFaker::Lorem.sentence) - modifier.test_destroy - expect(modifier.versions.last.reify).not_to be_flagged_deleted - end - end - - context "when :after" do - it "creates the version after destroy" do - modifier = AfterDestroyModifier.create!(some_content: FFaker::Lorem.sentence) - modifier.test_destroy - expect(modifier.versions.last.reify).to be_flagged_deleted - end - end - - context "when no argument" do - it "defaults to before destroy" do - modifier = NoArgDestroyModifier.create!(some_content: FFaker::Lorem.sentence) - modifier.test_destroy - expect(modifier.versions.last.reify).not_to be_flagged_deleted - end - end + context "when :before" do + it "creates the version before destroy" do + modifier = BeforeDestroyModifier.create!(some_content: FFaker::Lorem.sentence) + modifier.test_destroy + expect(modifier.versions.last.reify).not_to be_flagged_deleted end + end - describe "paper_trail_on_update" do - it "adds :update to paper_trail_options[:on]" do - modifier = UpdateModifier.create!(some_content: FFaker::Lorem.sentence) - expect(modifier.paper_trail_options[:on]).to eq [:update] - end - - it "creates a version" do - modifier = UpdateModifier.create!(some_content: FFaker::Lorem.sentence) - modifier.update_attributes! some_content: "modified" - expect(modifier.versions.last.event).to eq "update" - end + context "when :after" do + it "creates the version after destroy" do + modifier = AfterDestroyModifier.create!(some_content: FFaker::Lorem.sentence) + modifier.test_destroy + expect(modifier.versions.last.reify).to be_flagged_deleted end + end - describe "paper_trail_on_create" do - it "adds :create to paper_trail_options[:on]" do - modifier = CreateModifier.create!(some_content: FFaker::Lorem.sentence) - expect(modifier.paper_trail_options[:on]).to eq [:create] - end - - it "creates a version" do - modifier = CreateModifier.create!(some_content: FFaker::Lorem.sentence) - expect(modifier.versions.last.event).to eq "create" - end - end - - context "when no callback-method used" do - it "sets paper_trail_options[:on] to [:create, :update, :destroy]" do - modifier = DefaultModifier.create!(some_content: FFaker::Lorem.sentence) - expect(modifier.paper_trail_options[:on]).to eq %i(create update destroy) - end - - it "tracks destroy" do - modifier = DefaultModifier.create!(some_content: FFaker::Lorem.sentence) - modifier.destroy - expect(modifier.versions.last.event).to eq "destroy" - end - - it "tracks update" do - modifier = DefaultModifier.create!(some_content: FFaker::Lorem.sentence) - modifier.update_attributes! some_content: "modified" - expect(modifier.versions.last.event).to eq "update" - end - - it "tracks create" do - modifier = DefaultModifier.create!(some_content: FFaker::Lorem.sentence) - expect(modifier.versions.last.event).to eq "create" - end - end - - context "when only one callback-method" do - it "does only track the corresponding event" do - modifier = CreateModifier.create!(some_content: FFaker::Lorem.sentence) - modifier.update_attributes!(some_content: "modified") - modifier.test_destroy - expect(modifier.versions.collect(&:event)).to eq ["create"] - end + context "when no argument" do + it "defaults to before destroy" do + modifier = NoArgDestroyModifier.create!(some_content: FFaker::Lorem.sentence) + modifier.test_destroy + expect(modifier.versions.last.reify).not_to be_flagged_deleted end end end + + describe "paper_trail_on_update" do + it "adds :update to paper_trail_options[:on]" do + modifier = UpdateModifier.create!(some_content: FFaker::Lorem.sentence) + expect(modifier.paper_trail_options[:on]).to eq [:update] + end + + it "creates a version" do + modifier = UpdateModifier.create!(some_content: FFaker::Lorem.sentence) + modifier.update_attributes! some_content: "modified" + expect(modifier.versions.last.event).to eq "update" + end + end + + describe "paper_trail_on_create" do + it "adds :create to paper_trail_options[:on]" do + modifier = CreateModifier.create!(some_content: FFaker::Lorem.sentence) + expect(modifier.paper_trail_options[:on]).to eq [:create] + end + + it "creates a version" do + modifier = CreateModifier.create!(some_content: FFaker::Lorem.sentence) + expect(modifier.versions.last.event).to eq "create" + end + end + + context "when no callback-method used" do + it "sets paper_trail_options[:on] to [:create, :update, :destroy]" do + modifier = DefaultModifier.create!(some_content: FFaker::Lorem.sentence) + expect(modifier.paper_trail_options[:on]).to eq %i(create update destroy) + end + + it "tracks destroy" do + modifier = DefaultModifier.create!(some_content: FFaker::Lorem.sentence) + modifier.destroy + expect(modifier.versions.last.event).to eq "destroy" + end + + it "tracks update" do + modifier = DefaultModifier.create!(some_content: FFaker::Lorem.sentence) + modifier.update_attributes! some_content: "modified" + expect(modifier.versions.last.event).to eq "update" + end + + it "tracks create" do + modifier = DefaultModifier.create!(some_content: FFaker::Lorem.sentence) + expect(modifier.versions.last.event).to eq "create" + end + end + + context "when only one callback-method" do + it "does only track the corresponding event" do + modifier = CreateModifier.create!(some_content: FFaker::Lorem.sentence) + modifier.update_attributes!(some_content: "modified") + modifier.test_destroy + expect(modifier.versions.collect(&:event)).to eq ["create"] + end + end end diff --git a/spec/models/gadget_spec.rb b/spec/models/gadget_spec.rb index 5f2a217d..55d924a5 100644 --- a/spec/models/gadget_spec.rb +++ b/spec/models/gadget_spec.rb @@ -23,41 +23,40 @@ describe Gadget, type: :model do end describe "#changed_notably?", versioning: true do - subject { Gadget.new(created_at: Time.now) } - - context "create events" do + context "new record" do it "returns true" do - expect(subject.paper_trail.changed_notably?).to eq(true) + g = Gadget.new(created_at: Time.now) + expect(g.paper_trail.changed_notably?).to eq(true) end end - context "update events" do - before { subject.save! } - - context "without update timestamps" do - it "only acknowledges non-ignored attrs" do - subject.name = "Wrench" - expect(subject.paper_trail.changed_notably?).to be true - end - - it "does not acknowledge ignored attr (brand)" do - subject.brand = "Acme" - expect(subject.paper_trail.changed_notably?).to be false - end + context "persisted record without update timestamps" do + it "only acknowledges non-ignored attrs" do + subject = Gadget.create!(created_at: Time.now) + subject.name = "Wrench" + expect(subject.paper_trail.changed_notably?).to be true end - context "with update timestamps" do - it "only acknowledges non-ignored attrs" do - subject.name = "Wrench" - subject.updated_at = Time.now - expect(subject.paper_trail.changed_notably?).to be true - end + it "does not acknowledge ignored attr (brand)" do + subject = Gadget.create!(created_at: Time.now) + subject.brand = "Acme" + expect(subject.paper_trail.changed_notably?).to be false + end + end - it "does not acknowledge ignored attrs and timestamps only" do - subject.brand = "Acme" - subject.updated_at = Time.now - expect(subject.paper_trail.changed_notably?).to be false - end + context "persisted record with update timestamps" do + it "only acknowledges non-ignored attrs" do + subject = Gadget.create!(created_at: Time.now) + subject.name = "Wrench" + subject.updated_at = Time.now + expect(subject.paper_trail.changed_notably?).to be true + end + + it "does not acknowledge ignored attrs and timestamps only" do + subject = Gadget.create!(created_at: Time.now) + subject.brand = "Acme" + subject.updated_at = Time.now + expect(subject.paper_trail.changed_notably?).to be false end end end diff --git a/spec/models/joined_version_spec.rb b/spec/models/joined_version_spec.rb index 70ea8157..14e3e9b6 100644 --- a/spec/models/joined_version_spec.rb +++ b/spec/models/joined_version_spec.rb @@ -1,47 +1,41 @@ require "rails_helper" -describe JoinedVersion, type: :model, versioning: true do - it { expect(JoinedVersion.superclass).to be PaperTrail::Version } - +RSpec.describe JoinedVersion, type: :model, versioning: true do let(:widget) { Widget.create!(name: FFaker::Name.name) } let(:version) { JoinedVersion.first } - describe "Scopes" do - describe "default_scope" do - it { expect(JoinedVersion.default_scopes).not_to be_empty } + describe "default_scope" do + it { expect(JoinedVersion.default_scopes).not_to be_empty } + end + + describe "VersionConcern::ClassMethods" do + before { widget } # persist a widget + + describe "#subsequent" do + it "does not raise error when there is a default_scope that joins" do + JoinedVersion.subsequent(version).first + end end - describe "VersionConcern::ClassMethods" do - before { widget } # persist a widget - - describe "#subsequent" do - it "does not raise error when there is a default_scope that joins" do - JoinedVersion.subsequent(version).first - end + describe "#preceding" do + it "does not raise error when there is a default scope that joins" do + JoinedVersion.preceding(version).first end + end - describe "#preceding" do - it "does not raise error when there is a default scope that joins" do - JoinedVersion.preceding(version).first - end - end - - describe "#between" do - it "does not raise error when there is a default scope that joins" do - JoinedVersion.between(Time.now, 1.minute.from_now).first - end + describe "#between" do + it "does not raise error when there is a default scope that joins" do + JoinedVersion.between(Time.now, 1.minute.from_now).first end end end - describe "Methods" do - describe "#index" do - it { is_expected.to respond_to(:index) } + describe "#index" do + it { is_expected.to respond_to(:index) } - it "does not raise error when there is a default scope that joins" do - widget # persist a widget - version.index - end + it "does not raise error when there is a default scope that joins" do + widget # persist a widget + version.index end end end diff --git a/spec/models/skipper_spec.rb b/spec/models/skipper_spec.rb index 02b48b0f..7353ea10 100644 --- a/spec/models/skipper_spec.rb +++ b/spec/models/skipper_spec.rb @@ -1,45 +1,41 @@ require "rails_helper" -describe Skipper, type: :model do - with_versioning do - it { is_expected.to be_versioned } +RSpec.describe Skipper, type: :model, versioning: true do + it { is_expected.to be_versioned } - describe "#update_attributes!", versioning: true do - context "updating a skipped attribute" do - let(:t1) { Time.zone.local(2015, 7, 15, 20, 34, 0) } - let(:t2) { Time.zone.local(2015, 7, 15, 20, 34, 30) } + describe "#update_attributes!", versioning: true do + context "updating a skipped attribute" do + let(:t1) { Time.zone.local(2015, 7, 15, 20, 34, 0) } + let(:t2) { Time.zone.local(2015, 7, 15, 20, 34, 30) } - it "does not create a version" do - skipper = Skipper.create!(another_timestamp: t1) - expect { - skipper.update_attributes!(another_timestamp: t2) - }.not_to(change { skipper.versions.length }) - end + it "does not create a version" do + skipper = Skipper.create!(another_timestamp: t1) + expect { + skipper.update_attributes!(another_timestamp: t2) + }.not_to(change { skipper.versions.length }) + end + end + end + + describe "#reify" do + let(:t1) { Time.zone.local(2015, 7, 15, 20, 34, 0) } + let(:t2) { Time.zone.local(2015, 7, 15, 20, 34, 30) } + + context "without preserve (default)" do + it "has no timestamp" do + skipper = Skipper.create!(another_timestamp: t1) + skipper.update_attributes!(another_timestamp: t2, name: "Foobar") + skipper = skipper.versions.last.reify + expect(skipper.another_timestamp).to be(nil) end end - describe "reify" do - context "reifying a with a skipped attribute" do - let(:t1) { Time.zone.local(2015, 7, 15, 20, 34, 0) } - let(:t2) { Time.zone.local(2015, 7, 15, 20, 34, 30) } - - context "without preserve (default)" do - it "has no timestamp" do - skipper = Skipper.create!(another_timestamp: t1) - skipper.update_attributes!(another_timestamp: t2, name: "Foobar") - skipper = skipper.versions.last.reify - expect(skipper.another_timestamp).to be(nil) - end - end - - context "with preserve" do - it "preserves its timestamp" do - skipper = Skipper.create!(another_timestamp: t1) - skipper.update_attributes!(another_timestamp: t2, name: "Foobar") - skipper = skipper.versions.last.reify(unversioned_attributes: :preserve) - expect(skipper.another_timestamp).to eq(t2) - end - end + context "with preserve" do + it "preserves its timestamp" do + skipper = Skipper.create!(another_timestamp: t1) + skipper.update_attributes!(another_timestamp: t2, name: "Foobar") + skipper = skipper.versions.last.reify(unversioned_attributes: :preserve) + expect(skipper.another_timestamp).to eq(t2) end end end