From c3815c8d25f47d8f2457ccfbad8660a930e32da1 Mon Sep 17 00:00:00 2001 From: Marian13 Date: Sat, 26 Nov 2022 01:34:42 +0200 Subject: [PATCH] feat(has_inspect): indroduce inspect for Service and Result --- ROADMAP.md | 2 +- lib/convenient_service/configs/standard.rb | 3 + lib/convenient_service/service/plugins.rb | 1 + .../service/plugins/has_inspect.rb | 3 + .../service/plugins/has_inspect/concern.rb | 22 +++++ .../has_result/entities/result/plugins.rb | 1 + .../entities/result/plugins/has_inspect.rb | 3 + .../result/plugins/has_inspect/concern.rb | 30 ++++++ .../configs/standard_spec.rb | 6 +- .../plugins/has_inspect/concern_spec.rb | 47 ++++++++++ .../service/plugins/has_inspect_spec.rb | 3 + .../plugins/has_inspect/concern_spec.rb | 94 +++++++++++++++++++ .../result/plugins/has_inspect_spec.rb | 3 + .../plugins/has_result_steps/concern_spec.rb | 90 +++++++++--------- 14 files changed, 260 insertions(+), 48 deletions(-) create mode 100644 lib/convenient_service/service/plugins/has_inspect.rb create mode 100644 lib/convenient_service/service/plugins/has_inspect/concern.rb create mode 100644 lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_inspect.rb create mode 100644 lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_inspect/concern.rb create mode 100644 spec/lib/convenient_service/service/plugins/has_inspect/concern_spec.rb create mode 100644 spec/lib/convenient_service/service/plugins/has_inspect_spec.rb create mode 100644 spec/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_inspect/concern_spec.rb create mode 100644 spec/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_inspect_spec.rb diff --git a/ROADMAP.md b/ROADMAP.md index 6bb4fea0f08..f3f62039171 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -32,7 +32,7 @@ | High | 🚧 | Optimize `stack.dup` in `MethodMiddlewares#call` | Core v3 | | Medium | 🚧 | Make a decision of what to do with `printable_block` in custom RSpec matchers | | | Medium | 🚧 | User-friendly exception messages | | -| High | 🚧 | Factories for POROs in specs ❗❗❗ | | +| High | 🚧 | Factories for POROs in specs ❗❗❗ | Start with `result_class`, `class self::Result`, `service_class` | | High | 🚧 | Resolve warning during specs | | | Medium | 🚧 | Consider to change/rewrite `delegate` backend to minify its interface | | | Medium | 🚧 | Same order of attr macros, delegators, initialize, class methods, attr methods, queries, actions, `to_*`, comparison, inspect | | diff --git a/lib/convenient_service/configs/standard.rb b/lib/convenient_service/configs/standard.rb index 512cb6a54b5..9b5bf6ca5f7 100644 --- a/lib/convenient_service/configs/standard.rb +++ b/lib/convenient_service/configs/standard.rb @@ -33,6 +33,7 @@ module Standard use Plugins::Common::HasCallbacks::Concern use Plugins::Common::HasAroundCallbacks::Concern + use Plugins::Service::HasInspect::Concern ## # NOTE: Optional plugins. # TODO: Specs. @@ -105,6 +106,8 @@ class self::Result use Plugins::Result::HasResultShortSyntax::Concern use Plugins::Result::CanRecalculateResult::Concern + + use Plugins::Result::HasInspect::Concern end middlewares :initialize do diff --git a/lib/convenient_service/service/plugins.rb b/lib/convenient_service/service/plugins.rb index edc8c694fef..a6f0863866d 100644 --- a/lib/convenient_service/service/plugins.rb +++ b/lib/convenient_service/service/plugins.rb @@ -4,6 +4,7 @@ # NOTE: Order matters. # require_relative "plugins/can_recalculate_result" +require_relative "plugins/has_inspect" require_relative "plugins/has_result" require_relative "plugins/has_result_method_steps" require_relative "plugins/has_result_short_syntax" diff --git a/lib/convenient_service/service/plugins/has_inspect.rb b/lib/convenient_service/service/plugins/has_inspect.rb new file mode 100644 index 00000000000..96a36825799 --- /dev/null +++ b/lib/convenient_service/service/plugins/has_inspect.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require_relative "has_inspect/concern" diff --git a/lib/convenient_service/service/plugins/has_inspect/concern.rb b/lib/convenient_service/service/plugins/has_inspect/concern.rb new file mode 100644 index 00000000000..c1ac3df04ed --- /dev/null +++ b/lib/convenient_service/service/plugins/has_inspect/concern.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module ConvenientService + module Service + module Plugins + module HasInspect + module Concern + include Support::Concern + + instance_methods do + ## + # @return [String] + # + def inspect + "<#{self.class.name}>" + end + end + end + end + end + end +end diff --git a/lib/convenient_service/service/plugins/has_result/entities/result/plugins.rb b/lib/convenient_service/service/plugins/has_result/entities/result/plugins.rb index aa7245f7393..f761eae41d8 100644 --- a/lib/convenient_service/service/plugins/has_result/entities/result/plugins.rb +++ b/lib/convenient_service/service/plugins/has_result/entities/result/plugins.rb @@ -2,6 +2,7 @@ require_relative "plugins/can_recalculate_result" require_relative "plugins/has_jsend_status_and_attributes" +require_relative "plugins/has_inspect" require_relative "plugins/has_result_short_syntax" require_relative "plugins/marks_result_status_as_checked" require_relative "plugins/raises_on_not_checked_result_status" diff --git a/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_inspect.rb b/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_inspect.rb new file mode 100644 index 00000000000..96a36825799 --- /dev/null +++ b/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_inspect.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require_relative "has_inspect/concern" diff --git a/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_inspect/concern.rb b/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_inspect/concern.rb new file mode 100644 index 00000000000..86813949fb2 --- /dev/null +++ b/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_inspect/concern.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module ConvenientService + module Service + module Plugins + module HasResult + module Entities + class Result + module Plugins + module HasInspect + module Concern + include Support::Concern + + instance_methods do + ## + # @return [String] + # + def inspect + "<#{service.class.name}::Result status: :#{status}>" + end + end + end + end + end + end + end + end + end + end +end diff --git a/spec/lib/convenient_service/configs/standard_spec.rb b/spec/lib/convenient_service/configs/standard_spec.rb index 371d18b9c1f..2335f60ff19 100644 --- a/spec/lib/convenient_service/configs/standard_spec.rb +++ b/spec/lib/convenient_service/configs/standard_spec.rb @@ -38,7 +38,8 @@ ConvenientService::Service::Plugins::CanRecalculateResult::Concern, ConvenientService::Service::Plugins::HasResultStatusCheckShortSyntax::Concern, ConvenientService::Common::Plugins::HasCallbacks::Concern, - ConvenientService::Common::Plugins::HasAroundCallbacks::Concern + ConvenientService::Common::Plugins::HasAroundCallbacks::Concern, + ConvenientService::Service::Plugins::HasInspect::Concern ] end @@ -136,7 +137,8 @@ ConvenientService::Common::Plugins::HasConstructor::Concern, ConvenientService::Service::Plugins::HasResult::Entities::Result::Plugins::HasJsendStatusAndAttributes::Concern, ConvenientService::Service::Plugins::HasResult::Entities::Result::Plugins::HasResultShortSyntax::Concern, - ConvenientService::Service::Plugins::HasResult::Entities::Result::Plugins::CanRecalculateResult::Concern + ConvenientService::Service::Plugins::HasResult::Entities::Result::Plugins::CanRecalculateResult::Concern, + ConvenientService::Service::Plugins::HasResult::Entities::Result::Plugins::HasInspect::Concern ] end diff --git a/spec/lib/convenient_service/service/plugins/has_inspect/concern_spec.rb b/spec/lib/convenient_service/service/plugins/has_inspect/concern_spec.rb new file mode 100644 index 00000000000..854cfbaaa4f --- /dev/null +++ b/spec/lib/convenient_service/service/plugins/has_inspect/concern_spec.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require "spec_helper" + +require "convenient_service" + +# rubocop:disable RSpec/NestedGroups, RSpec/MultipleMemoizedHelpers +RSpec.describe ConvenientService::Service::Plugins::HasInspect::Concern do + include ConvenientService::RSpec::Matchers::DelegateTo + + let(:service_class) do + Class.new.tap do |klass| + klass.class_exec(described_class) do |mod| + include mod + + def self.name + "Service" + end + end + end + end + + let(:service_instance) { service_class.new } + + example_group "modules" do + include ConvenientService::RSpec::Matchers::IncludeModule + + subject { described_class } + + it { is_expected.to include_module(ConvenientService::Support::Concern) } + + context "when included" do + subject { service_class } + + it { is_expected.to include_module(described_class::InstanceMethods) } + end + end + + example_group "instance methods" do + describe "#inspect" do + it "returns `inspect` representation of service" do + expect(service_instance.inspect).to eq("<#{service_class.name}>") + end + end + end +end +# rubocop:enable RSpec/NestedGroups, RSpec/MultipleMemoizedHelpers diff --git a/spec/lib/convenient_service/service/plugins/has_inspect_spec.rb b/spec/lib/convenient_service/service/plugins/has_inspect_spec.rb new file mode 100644 index 00000000000..bb0b1576b34 --- /dev/null +++ b/spec/lib/convenient_service/service/plugins/has_inspect_spec.rb @@ -0,0 +1,3 @@ +## +# TODO: Integration specs. +# diff --git a/spec/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_inspect/concern_spec.rb b/spec/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_inspect/concern_spec.rb new file mode 100644 index 00000000000..b38a791b629 --- /dev/null +++ b/spec/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_inspect/concern_spec.rb @@ -0,0 +1,94 @@ +# frozen_string_literal: true + +require "spec_helper" + +require "convenient_service" + +# rubocop:disable RSpec/NestedGroups, RSpec/MultipleMemoizedHelpers +RSpec.describe ConvenientService::Service::Plugins::HasResult::Entities::Result::Plugins::HasInspect::Concern do + include ConvenientService::RSpec::Matchers::DelegateTo + + example_group "modules" do + include ConvenientService::RSpec::Matchers::IncludeModule + + subject { described_class } + + let(:result_class) do + Class.new.tap do |klass| + klass.class_exec(described_class) do |mod| + include mod + end + end + end + + let(:result_instance) { result_class.new } + + it { is_expected.to include_module(ConvenientService::Support::Concern) } + + context "when included" do + subject { result_class } + + before { result_class } + + it { is_expected.to include_module(described_class::InstanceMethods) } + end + end + + example_group "instance methods" do + let(:service_class) do + Class.new do + def self.name + "Service" + end + end + end + + let(:service_instance) { service_class.new } + + # rubocop:disable RSpec/LeakyConstantDeclaration, Lint/ConstantDefinitionInBlock + let(:result_class) do + Class.new do + include ConvenientService::Core + + concerns do + use ConvenientService::Common::Plugins::HasInternals::Concern + use ConvenientService::Common::Plugins::HasConstructor::Concern + use ConvenientService::Service::Plugins::HasResult::Entities::Result::Plugins::HasJsendStatusAndAttributes::Concern + use ConvenientService::Service::Plugins::HasResult::Entities::Result::Plugins::HasInspect::Concern + end + + middlewares :initialize do + use ConvenientService::Common::Plugins::NormalizesEnv::Middleware + + use ConvenientService::Service::Plugins::HasResult::Entities::Result::Plugins::HasJsendStatusAndAttributes::Middleware + end + + class self::Internals + include ConvenientService::Core + + concerns do + use ConvenientService::Common::Plugins::HasInternals::Entities::Internals::Plugins::HasCache::Concern + end + end + end + end + # rubocop:enable RSpec/LeakyConstantDeclaration, Lint/ConstantDefinitionInBlock + + let(:result_instance) do + result_class.new( + status: :success, + data: {}, + message: "", + code: :default_success, + service: service_instance + ) + end + + describe "#inspect" do + it "returns `inspect` representation of result" do + expect(result_instance.inspect).to eq("<#{result_instance.service.class.name}::Result status: :#{result_instance.status}>") + end + end + end +end +# rubocop:enable RSpec/NestedGroups, RSpec/MultipleMemoizedHelpers diff --git a/spec/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_inspect_spec.rb b/spec/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_inspect_spec.rb new file mode 100644 index 00000000000..bb0b1576b34 --- /dev/null +++ b/spec/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_inspect_spec.rb @@ -0,0 +1,3 @@ +## +# TODO: Integration specs. +# diff --git a/spec/lib/convenient_service/service/plugins/has_result_steps/concern_spec.rb b/spec/lib/convenient_service/service/plugins/has_result_steps/concern_spec.rb index cd3403b8b39..cebe5b6dcea 100644 --- a/spec/lib/convenient_service/service/plugins/has_result_steps/concern_spec.rb +++ b/spec/lib/convenient_service/service/plugins/has_result_steps/concern_spec.rb @@ -6,6 +6,7 @@ # rubocop:disable RSpec/NestedGroups, RSpec/MultipleMemoizedHelpers RSpec.describe ConvenientService::Service::Plugins::HasResultSteps::Concern do + include ConvenientService::RSpec::Matchers::CacheItsValue include ConvenientService::RSpec::Matchers::DelegateTo let(:service_class) do @@ -28,7 +29,6 @@ def foo example_group "modules" do include ConvenientService::RSpec::Matchers::IncludeModule include ConvenientService::RSpec::Matchers::ExtendModule - include ConvenientService::RSpec::Matchers::CacheItsValue subject { described_class } @@ -40,65 +40,65 @@ def foo it { is_expected.to include_module(described_class::InstanceMethods) } it { is_expected.to extend_module(described_class::ClassMethods) } end + end - example_group "instance methods" do - describe "#steps" do - before do - service_class.step Class.new, in: :foo, out: :bar - end - - specify { expect { service_instance.steps }.to delegate_to(service_class.steps, :commit!) } + example_group "instance methods" do + describe "#steps" do + before do + service_class.step Class.new, in: :foo, out: :bar + end - it "returns `self.class.steps` with `organizer` set to each of them" do - expect(service_instance.steps).to eq(service_class.steps.map { |step| step.copy(overrides: {kwargs: {organizer: service_instance}}) }) - end + specify { expect { service_instance.steps }.to delegate_to(service_class.steps, :commit!) } - specify { expect { service_instance.steps }.to cache_its_value } + it "returns `self.class.steps` with `organizer` set to each of them" do + expect(service_instance.steps).to eq(service_class.steps.map { |step| step.copy(overrides: {kwargs: {organizer: service_instance}}) }) end - end - example_group "class_methods" do - describe ".step" do - it "returns `step`" do - expect(service_class.step(*args, **kwargs)).to eq(step) - end + specify { expect { service_instance.steps }.to cache_its_value } + end + end - it "adds `step` to `steps`" do - expect { service_class.step(*args, **kwargs) }.to change { service_class.steps.include?(step) }.from(false).to(true) - end + example_group "class_methods" do + describe ".step" do + it "returns `step`" do + expect(service_class.step(*args, **kwargs)).to eq(step) end - describe ".raw" do - let(:value) { :foo } - - specify { - expect { service_class.raw(value) } - .to delegate_to(ConvenientService::Service::Plugins::HasResultSteps::Entities::Method::Entities::Values::Raw, :wrap) - .with_arguments(value) - .and_return_its_value - } + it "adds `step` to `steps`" do + expect { service_class.step(*args, **kwargs) }.to change { service_class.steps.include?(step) }.from(false).to(true) end + end - describe ".steps" do - specify { - expect { service_class.steps } - .to delegate_to(ConvenientService::Service::Plugins::HasResultSteps::Entities::StepCollection, :new) - .and_return_its_value - } + describe ".raw" do + let(:value) { :foo } - specify { expect { service_class.steps }.to cache_its_value } + specify do + expect { service_class.raw(value) } + .to delegate_to(ConvenientService::Service::Plugins::HasResultSteps::Entities::Method::Entities::Values::Raw, :wrap) + .with_arguments(value) + .and_return_its_value end + end + + describe ".steps" do + specify { + expect { service_class.steps } + .to delegate_to(ConvenientService::Service::Plugins::HasResultSteps::Entities::StepCollection, :new) + .and_return_its_value + } - describe ".step_class" do - specify { - expect { service_class.step_class } - .to delegate_to(ConvenientService::Service::Plugins::HasResultSteps::Commands::CreateStepClass, :call) - .with_arguments(service_class: service_class) - .and_return_its_value - } + specify { expect { service_class.steps }.to cache_its_value } + end - specify { expect { service_class.step_class }.to cache_its_value } + describe ".step_class" do + specify do + expect { service_class.step_class } + .to delegate_to(ConvenientService::Service::Plugins::HasResultSteps::Commands::CreateStepClass, :call) + .with_arguments(service_class: service_class) + .and_return_its_value end + + specify { expect { service_class.step_class }.to cache_its_value } end end end