Skip to content

Commit

Permalink
feat(result): introduce Result#from_exception?
Browse files Browse the repository at this point in the history
  • Loading branch information
marian13 committed May 12, 2024
1 parent cb6805e commit a47838a
Show file tree
Hide file tree
Showing 14 changed files with 133 additions and 5 deletions.
1 change: 1 addition & 0 deletions lib/convenient_service/service/configs/standard.rb
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ class self::Result
use ConvenientService::Plugins::Result::CanRecalculateResult::Concern

use ConvenientService::Plugins::Result::HasNegatedResult::Concern
use ConvenientService::Plugins::Result::CanBeFromException::Concern
use ConvenientService::Plugins::Result::CanBeOwnResult::Concern
use ConvenientService::Plugins::Result::CanHaveFallbacks::Concern
use ConvenientService::Plugins::Result::CanHaveParentResult::Concern
Expand Down
1 change: 1 addition & 0 deletions lib/convenient_service/service/configs/standard/v1.rb
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ class self::Result
use ConvenientService::Plugins::Common::HasJSendResultDuckShortSyntax::Concern
use ConvenientService::Plugins::Result::CanRecalculateResult::Concern

use ConvenientService::Plugins::Result::CanBeFromException::Concern
use ConvenientService::Plugins::Result::CanBeOwnResult::Concern
use ConvenientService::Plugins::Result::CanHaveParentResult::Concern
use ConvenientService::Plugins::Result::CanHaveCheckedStatus::Concern
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

require_relative "plugins/can_recalculate_result"
require_relative "plugins/has_negated_result"
require_relative "plugins/can_be_from_exception"
require_relative "plugins/can_be_own_result"
require_relative "plugins/can_be_stubbed_result"
require_relative "plugins/can_have_fallbacks"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# frozen_string_literal: true

require_relative "can_be_from_exception/concern"
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# frozen_string_literal: true

module ConvenientService
module Service
module Plugins
module HasJSendResult
module Entities
class Result
module Plugins
module CanBeFromException
module Concern
include Support::Concern

instance_methods do
##
# @api public
#
# @return [Boolean]
#
def from_exception?
Utils.to_bool(extra_kwargs[:from_exception])
end
end
end
end
end
end
end
end
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ def result_from_exception(exception, *args, **kwargs, &block)
data: {exception: exception},
message: format_exception(exception, *args, **kwargs, &block)
)
.copy(overrides: {kwargs: {from_exception: true}})
end

##
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,7 @@
ConvenientService::Common::Plugins::HasJSendResultDuckShortSyntax::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanRecalculateResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::HasNegatedResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanBeFromException::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanBeOwnResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanHaveFallbacks::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanHaveParentResult::Concern,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanHaveStep::Concern,
ConvenientService::Common::Plugins::HasJSendResultDuckShortSyntax::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanRecalculateResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanBeFromException::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanBeOwnResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanHaveParentResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanHaveCheckedStatus::Concern,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,7 @@
ConvenientService::Common::Plugins::HasJSendResultDuckShortSyntax::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanRecalculateResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::HasNegatedResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanBeFromException::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanBeOwnResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanHaveFallbacks::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanHaveParentResult::Concern,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanHaveStep::Concern,
ConvenientService::Common::Plugins::HasJSendResultDuckShortSyntax::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanRecalculateResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanBeFromException::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanBeOwnResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanHaveParentResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanHaveCheckedStatus::Concern,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,7 @@
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanHaveStep::Concern,
ConvenientService::Common::Plugins::HasJSendResultDuckShortSyntax::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanRecalculateResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanBeFromException::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanBeOwnResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanHaveParentResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanHaveCheckedStatus::Concern,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,7 @@
ConvenientService::Common::Plugins::HasJSendResultDuckShortSyntax::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanRecalculateResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::HasNegatedResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanBeFromException::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanBeOwnResult::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanHaveFallbacks::Concern,
ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanHaveParentResult::Concern,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# frozen_string_literal: true

require "spec_helper"

require "convenient_service"

# rubocop:disable RSpec/NestedGroups, RSpec/MultipleMemoizedHelpers
RSpec.describe ConvenientService::Service::Plugins::HasJSendResult::Entities::Result::Plugins::CanBeFromException::Concern, type: :standard do
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 { result_class }

let(:result_class) do
Class.new.tap do |klass|
klass.class_exec(described_class) do |mod|
include mod
end
end
end

it { is_expected.to include_module(described_class::InstanceMethods) }
end
end

example_group "instance methods" do
include ConvenientService::RSpec::Helpers::StubService

describe "#from_exception?" do
let(:result) { service.result }

let(:service) do
Class.new do
include ConvenientService::Service::Configs::Standard

def result
success
end
end
end

context "when result is NOT created by `stub_service`" do
it "returns `false`" do
expect(result.from_exception?).to eq(false)
end
end

context "when result is created by `stub_service`" do
let(:service) do
Class.new do
include ConvenientService::Service::Configs::Standard

middlewares :result do
use ConvenientService::Plugins::Service::RescuesResultUnhandledExceptions::Middleware
end

def result
16 / 0
end
end
end

it "returns `true`" do
expect(result.from_exception?).to eq(true)
end
end
end
end
end
# rubocop:enable RSpec/NestedGroups, RSpec/MultipleMemoizedHelpers
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@
let(:service_class) do
Class.new.tap do |klass|
klass.class_exec(middleware, scope, max_backtrace_size) do |middleware, scope, max_backtrace_size|
include ConvenientService::Service::Configs::Essential
include ConvenientService::Service::Configs::Standard

middlewares :result, scope: scope do
use_and_observe middleware.with(max_backtrace_size: max_backtrace_size)
Expand All @@ -91,7 +91,7 @@ def result
let(:service_class) do
Class.new.tap do |klass|
klass.class_exec(middleware, scope) do |middleware, scope|
include ConvenientService::Service::Configs::Essential
include ConvenientService::Service::Configs::Standard

middlewares :result, scope: scope do
use_and_observe middleware
Expand All @@ -117,7 +117,7 @@ def result
let(:service_class) do
Class.new.tap do |klass|
klass.class_exec(middleware, scope, status, max_backtrace_size) do |middleware, scope, status, max_backtrace_size|
include ConvenientService::Service::Configs::Essential
include ConvenientService::Service::Configs::Standard

middlewares :result, scope: scope do
use_and_observe middleware.with(status: status, max_backtrace_size: max_backtrace_size)
Expand Down Expand Up @@ -145,9 +145,13 @@ def result
.with_arguments(exception: exception, args: result_arguments.args, kwargs: result_arguments.kwargs, block: result_arguments.block, max_backtrace_size: max_backtrace_size)
end

it "returns failure with formatted exception" do
it "returns `failure` with formatted exception" do
expect(method_value).to be_failure.with_data(exception: exception).and_message(formatted_exception)
end

it "returns `failure` from exception" do
expect(method_value.from_exception?).to eq(true)
end
end

context "when `status` is `:error`" do
Expand All @@ -168,14 +172,18 @@ def result
it "returns `error` with formatted exception" do
expect(method_value).to be_error.with_data(exception: exception).and_message(formatted_exception)
end

it "returns `error` from exception" do
expect(method_value.from_exception?).to eq(true)
end
end
end

context "when `max_backtrace_size` is NOT passed" do
let(:service_class) do
Class.new.tap do |klass|
klass.class_exec(middleware, scope) do |middleware, scope|
include ConvenientService::Service::Configs::Essential
include ConvenientService::Service::Configs::Standard

middlewares :result, scope: scope do
use_and_observe middleware
Expand Down

0 comments on commit a47838a

Please sign in to comment.