rest_my_case 1.3.5 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/console +16 -0
- data/lib/rest_my_case.rb +9 -6
- data/lib/rest_my_case/base.rb +35 -16
- data/lib/rest_my_case/config/base.rb +0 -2
- data/lib/rest_my_case/config/general.rb +4 -5
- data/lib/rest_my_case/{trial_case/context.rb → context/base.rb} +10 -8
- data/lib/rest_my_case/defense_attorney/base.rb +18 -34
- data/lib/rest_my_case/judge/base.rb +12 -12
- data/lib/rest_my_case/trial/case.rb +28 -0
- data/lib/rest_my_case/trial/court.rb +19 -0
- data/lib/rest_my_case/trial/defendant.rb +8 -0
- data/lib/rest_my_case/version.rb +1 -1
- data/spec/rest_my_case/base_spec.rb +331 -52
- data/spec/rest_my_case/defense_attorney/base_spec.rb +9 -85
- data/spec/rest_my_case/trial_case/court_spec.rb +26 -0
- data/spec/support/perform.rb +35 -94
- metadata +9 -7
- data/lib/rest_my_case/config/shared.rb +0 -12
- data/lib/rest_my_case/trial_case/base.rb +0 -25
- data/spec/rest_my_case/trial_case/base_spec.rb +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4247a51223096c120fdb4055309c9fbbabd8517f
|
4
|
+
data.tar.gz: a3c6837847258f454c8cb604ceed36a1e836c1ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d7663942c2b7324ea877778295c87a19c7a18fdacb022e16136ca71b35d969b9beb473d8142a06bc9e9ef5b50540d93db4f3673232e2fd9c84700db8d6422a3
|
7
|
+
data.tar.gz: 1a39bb5b4b29d394c71179cba26052066e404d418026c3c150475cb6980a99803cb70503d5ff3542b3ea16346193db95bbb8978b51a8d31c0d9172694e007da4
|
data/console
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__))
|
4
|
+
|
5
|
+
Encoding.default_external = Encoding::UTF_8
|
6
|
+
Encoding.default_internal = Encoding::UTF_8
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
require 'bundler'
|
10
|
+
|
11
|
+
Bundler.require(:default, 'development')
|
12
|
+
|
13
|
+
|
14
|
+
require 'spec/support/perform'
|
15
|
+
|
16
|
+
binding.pry
|
data/lib/rest_my_case.rb
CHANGED
@@ -1,16 +1,19 @@
|
|
1
1
|
require 'ostruct'
|
2
2
|
|
3
|
-
require "rest_my_case/
|
3
|
+
require "rest_my_case/version"
|
4
|
+
require "rest_my_case/errors"
|
5
|
+
|
4
6
|
require "rest_my_case/config/base"
|
5
7
|
require "rest_my_case/config/general"
|
6
8
|
|
7
|
-
require "rest_my_case/judge/base"
|
8
|
-
require "rest_my_case/trial_case/base"
|
9
|
-
require "rest_my_case/trial_case/context"
|
10
9
|
require "rest_my_case/defense_attorney/base"
|
10
|
+
require "rest_my_case/context/base"
|
11
|
+
require "rest_my_case/judge/base"
|
12
|
+
|
13
|
+
require "rest_my_case/trial/defendant"
|
14
|
+
require "rest_my_case/trial/case"
|
15
|
+
require "rest_my_case/trial/court"
|
11
16
|
|
12
|
-
require "rest_my_case/version"
|
13
|
-
require "rest_my_case/errors"
|
14
17
|
require "rest_my_case/base"
|
15
18
|
|
16
19
|
module RestMyCase
|
data/lib/rest_my_case/base.rb
CHANGED
@@ -4,24 +4,24 @@ module RestMyCase
|
|
4
4
|
|
5
5
|
extend Config::Base
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
TRIAL_COURT = Trial::Court.new Judge::Base, DefenseAttorney::Base
|
8
|
+
|
9
|
+
def self.depends(*use_case_classes)
|
10
|
+
dependencies.push *use_case_classes
|
9
11
|
end
|
10
12
|
|
11
13
|
def self.dependencies
|
12
14
|
@dependencies ||= []
|
13
15
|
end
|
14
16
|
|
15
|
-
def self.perform(attributes =
|
16
|
-
|
17
|
-
attorney = DefenseAttorney::Base.new trial_case
|
18
|
-
judge = Judge::Base.new trial_case
|
19
|
-
|
20
|
-
attorney.build_case_for_the_defendant
|
17
|
+
def self.perform(attributes = nil)
|
18
|
+
attributes ||= {}
|
21
19
|
|
22
|
-
|
20
|
+
unless attributes.respond_to?(:to_hash)
|
21
|
+
raise ArgumentError.new('Must respond_to method #to_hash')
|
22
|
+
end
|
23
23
|
|
24
|
-
|
24
|
+
TRIAL_COURT.execute([self], attributes.to_hash).context
|
25
25
|
end
|
26
26
|
|
27
27
|
def self.context_accessor(*methods)
|
@@ -39,13 +39,14 @@ module RestMyCase
|
|
39
39
|
methods.each { |method| define_method(method) { context.send(method) } }
|
40
40
|
end
|
41
41
|
|
42
|
-
|
42
|
+
######################## INSTANCE METHODS BELLOW ###########################
|
43
43
|
|
44
|
-
attr_reader :context, :options
|
44
|
+
attr_reader :context, :dependent_use_case, :options
|
45
45
|
|
46
|
-
def initialize(context,
|
47
|
-
@
|
48
|
-
@
|
46
|
+
def initialize(context, dependent_use_case = nil)
|
47
|
+
@options = {}
|
48
|
+
@context = context
|
49
|
+
@dependent_use_case = dependent_use_case
|
49
50
|
end
|
50
51
|
|
51
52
|
def setup; end
|
@@ -56,8 +57,18 @@ module RestMyCase
|
|
56
57
|
|
57
58
|
def final; end
|
58
59
|
|
60
|
+
def invoke(*use_case_classes)
|
61
|
+
TRIAL_COURT.execute(use_case_classes, context.to_hash).context
|
62
|
+
end
|
63
|
+
|
64
|
+
def invoke!(*use_case_classes)
|
65
|
+
TRIAL_COURT.execute(use_case_classes, context).tap do |trial_case|
|
66
|
+
abort if trial_case.aborted
|
67
|
+
end.context
|
68
|
+
end
|
69
|
+
|
59
70
|
def abort
|
60
|
-
options[:should_abort] = true
|
71
|
+
silent_abort? ? dependent_use_case.abort : (options[:should_abort] = true)
|
61
72
|
end
|
62
73
|
|
63
74
|
def abort!
|
@@ -80,6 +91,14 @@ module RestMyCase
|
|
80
91
|
skip && raise(Errors::Skip)
|
81
92
|
end
|
82
93
|
|
94
|
+
protected ######################## PROTECTED ###############################
|
95
|
+
|
96
|
+
def silent_abort?
|
97
|
+
return false if dependent_use_case.nil?
|
98
|
+
|
99
|
+
RestMyCase.get_config :silence_dependencies_abort, dependent_use_case.class
|
100
|
+
end
|
101
|
+
|
83
102
|
end
|
84
103
|
|
85
104
|
end
|
@@ -3,15 +3,14 @@ module RestMyCase
|
|
3
3
|
|
4
4
|
class General
|
5
5
|
|
6
|
-
include
|
6
|
+
include Base
|
7
7
|
|
8
8
|
def initialize
|
9
|
-
@
|
10
|
-
@parent_dependencies_first = true
|
9
|
+
@silence_dependencies_abort = false
|
11
10
|
end
|
12
11
|
|
13
|
-
def get(attribute,
|
14
|
-
custom_config =
|
12
|
+
def get(attribute, use_case_class)
|
13
|
+
custom_config = use_case_class.send(attribute)
|
15
14
|
|
16
15
|
custom_config.nil? ? send(attribute) : custom_config
|
17
16
|
end
|
@@ -1,7 +1,15 @@
|
|
1
1
|
module RestMyCase
|
2
|
-
module
|
2
|
+
module Context
|
3
3
|
|
4
|
-
class
|
4
|
+
class Base < OpenStruct
|
5
|
+
|
6
|
+
alias :attributes :marshal_dump
|
7
|
+
|
8
|
+
include ActiveModel::Serialization if defined?(ActiveModel)
|
9
|
+
|
10
|
+
def to_hash
|
11
|
+
Marshal.load Marshal.dump(attributes)
|
12
|
+
end
|
5
13
|
|
6
14
|
def errors
|
7
15
|
@errors ||= Hash.new { |hash, key| hash[key] = [] }
|
@@ -13,12 +21,6 @@ module RestMyCase
|
|
13
21
|
|
14
22
|
alias :ok? :valid?
|
15
23
|
|
16
|
-
def serializable_hash(options = nil)
|
17
|
-
marshal_dump
|
18
|
-
end
|
19
|
-
|
20
|
-
alias :to_hash :serializable_hash
|
21
|
-
|
22
24
|
end
|
23
25
|
|
24
26
|
end
|
@@ -8,51 +8,35 @@ module RestMyCase
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def build_case_for_the_defendant
|
11
|
-
@trial_case.use_cases =
|
11
|
+
@trial_case.use_cases =
|
12
|
+
@trial_case.defendant.use_case_classes.map do |use_case_class|
|
13
|
+
all_dependencies(use_case_class)
|
14
|
+
end.flatten
|
12
15
|
end
|
13
16
|
|
14
|
-
protected
|
17
|
+
protected ######################## PROTECTED #############################
|
15
18
|
|
16
|
-
def all_dependencies(
|
17
|
-
return [] unless
|
19
|
+
def all_dependencies(use_case_class)
|
20
|
+
return [] unless use_case_class.respond_to? :dependencies
|
18
21
|
|
19
|
-
|
20
|
-
|
21
|
-
if RestMyCase.get_config(:parent_dependencies_first, use_case)
|
22
|
-
parent_dependencies | deep_dependencies(use_case, options)
|
23
|
-
else
|
24
|
-
deep_dependencies(use_case, options) | parent_dependencies
|
25
|
-
end
|
22
|
+
all_dependencies(use_case_class.superclass) |
|
23
|
+
dependencies_including_itself_last(use_case_class, nil)
|
26
24
|
end
|
27
25
|
|
28
|
-
|
29
|
-
options = build_options(use_case, options)
|
30
|
-
deep_dependencies = []
|
31
|
-
|
32
|
-
use_case.dependencies.each do |dependency|
|
33
|
-
deep_dependencies.push *all_dependencies(dependency, options)
|
34
|
-
end
|
35
|
-
|
36
|
-
include_current_use_case(deep_dependencies, use_case, options)
|
37
|
-
end
|
26
|
+
private ########################### PRIVATE ##############################
|
38
27
|
|
39
|
-
|
28
|
+
def dependencies_including_itself_last(use_case_class, dependent_use_case)
|
29
|
+
return [] unless use_case_class.superclass.respond_to? :dependencies
|
40
30
|
|
41
|
-
|
42
|
-
unless use_case.silence_dependencies_abort.nil?
|
43
|
-
options[:silent_abort] = use_case.silence_dependencies_abort
|
44
|
-
end
|
31
|
+
use_case = use_case_class.new(@trial_case.context, dependent_use_case)
|
45
32
|
|
46
|
-
|
33
|
+
dependencies(use_case).push use_case
|
47
34
|
end
|
48
35
|
|
49
|
-
def
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
RestMyCase.get_config(:dependencies_first, use_case) ? :push : :unshift
|
54
|
-
|
55
|
-
dependencies.send append_method, use_case.new(@trial_case.context, options)
|
36
|
+
def dependencies(use_case)
|
37
|
+
use_case.class.dependencies.map do |dependency|
|
38
|
+
dependencies_including_itself_last dependency, use_case
|
39
|
+
end
|
56
40
|
end
|
57
41
|
|
58
42
|
end
|
@@ -9,14 +9,16 @@ module RestMyCase
|
|
9
9
|
@use_case_that_aborted = false
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
12
|
+
def determine_the_sentence
|
13
13
|
run_setup_methods
|
14
14
|
run_perform_methods
|
15
15
|
run_rollback_methods
|
16
16
|
run_final_methods
|
17
|
+
|
18
|
+
@trial_case.aborted = !!@use_case_that_aborted
|
17
19
|
end
|
18
20
|
|
19
|
-
protected
|
21
|
+
protected ######################## PROTECTED #############################
|
20
22
|
|
21
23
|
def run_setup_methods
|
22
24
|
@trial_case.use_cases.each do |use_case|
|
@@ -36,15 +38,17 @@ module RestMyCase
|
|
36
38
|
return nil unless @use_case_that_aborted
|
37
39
|
|
38
40
|
@performed_use_cases.reverse.each do |use_case|
|
39
|
-
|
41
|
+
method_aborts?(:rollback, use_case)
|
40
42
|
end
|
41
43
|
end
|
42
44
|
|
43
45
|
def run_final_methods
|
44
|
-
@trial_case.use_cases.each
|
46
|
+
@trial_case.use_cases.each do |use_case|
|
47
|
+
method_aborts?(:final, use_case)
|
48
|
+
end
|
45
49
|
end
|
46
50
|
|
47
|
-
private
|
51
|
+
private ########################### PRIVATE ##############################
|
48
52
|
|
49
53
|
def method_setup_has_aborted(use_case)
|
50
54
|
method_aborts?(:setup, use_case)
|
@@ -60,20 +64,16 @@ module RestMyCase
|
|
60
64
|
|
61
65
|
def method_aborts?(method_name, use_case)
|
62
66
|
begin
|
63
|
-
|
67
|
+
use_case.send(method_name)
|
64
68
|
|
65
69
|
use_case.options[:should_abort] && @use_case_that_aborted = use_case
|
66
|
-
rescue Errors::Skip
|
70
|
+
rescue Errors::Skip
|
67
71
|
false
|
68
|
-
rescue Errors::Abort
|
72
|
+
rescue Errors::Abort
|
69
73
|
@use_case_that_aborted = use_case
|
70
74
|
end
|
71
75
|
end
|
72
76
|
|
73
|
-
def run_method(method_name, use_case)
|
74
|
-
use_case.send(method_name)
|
75
|
-
end
|
76
|
-
|
77
77
|
end
|
78
78
|
|
79
79
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module RestMyCase
|
2
|
+
module Trial
|
3
|
+
|
4
|
+
class Case
|
5
|
+
|
6
|
+
attr_accessor :use_cases, :aborted
|
7
|
+
|
8
|
+
attr_reader :context, :defendant
|
9
|
+
|
10
|
+
def initialize(use_case_classes, attributes)
|
11
|
+
@aborted = false
|
12
|
+
@context = build_context(attributes)
|
13
|
+
@defendant = Defendant.new use_case_classes
|
14
|
+
@use_cases = []
|
15
|
+
end
|
16
|
+
|
17
|
+
protected ######################## PROTECTED #############################
|
18
|
+
|
19
|
+
def build_context(attributes)
|
20
|
+
return attributes if attributes.is_a?(Context::Base)
|
21
|
+
|
22
|
+
Context::Base.new attributes
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module RestMyCase
|
2
|
+
module Trial
|
3
|
+
|
4
|
+
class Court < Struct.new(:judge_class, :defense_attorney_class)
|
5
|
+
|
6
|
+
def execute(use_case_classes, attributes = {})
|
7
|
+
trial_case = Case.new(use_case_classes, attributes)
|
8
|
+
|
9
|
+
defense_attorney_class.new(trial_case).build_case_for_the_defendant
|
10
|
+
|
11
|
+
judge_class.new(trial_case).determine_the_sentence
|
12
|
+
|
13
|
+
trial_case
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
data/lib/rest_my_case/version.rb
CHANGED
@@ -3,15 +3,18 @@ require 'spec_helper'
|
|
3
3
|
describe RestMyCase::Base do
|
4
4
|
|
5
5
|
describe ".dependencies" do
|
6
|
+
|
6
7
|
it "should only list the class's dependencies" do
|
7
8
|
expect(RestMyCaseBase::CreatePostWithComments.dependencies).to \
|
8
9
|
eq [RestMyCaseBase::BuildComments, RestMyCaseBase::CreateComments]
|
9
10
|
end
|
11
|
+
|
10
12
|
end
|
11
13
|
|
12
14
|
describe ".context_accessor" do
|
13
|
-
|
14
|
-
let(:
|
15
|
+
|
16
|
+
let(:context) { RestMyCase::Context::Base.new(id: 1, comment: 'my comment', session: -1) }
|
17
|
+
let(:use_case) { RestMyCaseBase::CreatePostWithComments.new(context) }
|
15
18
|
|
16
19
|
it "Should create getters targeting to context" do
|
17
20
|
expect(use_case.respond_to?(:comment)).to be true
|
@@ -29,11 +32,13 @@ describe RestMyCase::Base do
|
|
29
32
|
use_case.comment = 'your comment'
|
30
33
|
expect(use_case.context.comment).to eq 'your comment'
|
31
34
|
end
|
35
|
+
|
32
36
|
end
|
33
37
|
|
34
38
|
describe ".context_writer" do
|
35
|
-
|
36
|
-
let(:
|
39
|
+
|
40
|
+
let(:context) { RestMyCase::Context::Base.new }
|
41
|
+
let(:use_case) { RestMyCaseBase::CreatePostWithComments.new(context) }
|
37
42
|
|
38
43
|
it "Should create setters targeting to context" do
|
39
44
|
expect(use_case.respond_to?(:id)).to be false
|
@@ -45,11 +50,13 @@ describe RestMyCase::Base do
|
|
45
50
|
|
46
51
|
expect(use_case.context.id).to eq 2
|
47
52
|
end
|
53
|
+
|
48
54
|
end
|
49
55
|
|
50
56
|
describe ".context_reader" do
|
51
|
-
|
52
|
-
let(:
|
57
|
+
|
58
|
+
let(:context) { RestMyCase::Context::Base.new(id: 1, comment: 'my comment', session: -1) }
|
59
|
+
let(:use_case) { RestMyCaseBase::CreatePostWithComments.new(context) }
|
53
60
|
|
54
61
|
it "Should create getters targeting to context" do
|
55
62
|
expect(use_case.respond_to?(:session)).to be true
|
@@ -59,26 +66,40 @@ describe RestMyCase::Base do
|
|
59
66
|
it "Getter should delegate to context" do
|
60
67
|
expect(use_case.session).to eq -1
|
61
68
|
end
|
69
|
+
|
62
70
|
end
|
63
71
|
|
64
72
|
describe ".perform" do
|
65
73
|
|
66
|
-
context "When
|
67
|
-
before do
|
68
|
-
class Perform::ValidateName < RestMyCase::Base
|
69
|
-
def setup
|
70
|
-
fail('no name!')
|
71
|
-
context.setup << self.class.name
|
72
|
-
end
|
73
|
-
end
|
74
|
+
context "When something that doesn't responds to #to_hash is passed down" do
|
74
75
|
|
75
|
-
|
76
|
+
it "should raise an exception" do
|
77
|
+
expect { Perform::CreatePost.perform(Object.new) }.to \
|
78
|
+
raise_error(ArgumentError)
|
76
79
|
end
|
77
80
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
81
|
+
end
|
82
|
+
|
83
|
+
context "When nil is passed down" do
|
84
|
+
|
85
|
+
it "should NOT raise an exception" do
|
86
|
+
expect { Perform::CreatePost.perform(nil) }.not_to raise_error
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
context "When nothing is passed down" do
|
92
|
+
|
93
|
+
it "should NOT raise an exception" do
|
94
|
+
expect { Perform::CreatePost.perform }.not_to raise_error
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
context "When a use case calls #fail during the setup process" do
|
100
|
+
before do
|
101
|
+
@context = Perform::CreatePost.perform \
|
102
|
+
fail: ['Perform::ValidateName_setup', 'Perform::ValidateBody_setup']
|
82
103
|
end
|
83
104
|
|
84
105
|
it "context should reflect an invalid state" do
|
@@ -90,29 +111,17 @@ describe RestMyCase::Base do
|
|
90
111
|
end
|
91
112
|
|
92
113
|
it "context prove that only the correct method have ran" do
|
93
|
-
expect(@context.setup.length).to be
|
114
|
+
expect(@context.setup.length).to be 3
|
94
115
|
expect(@context.perform.length).to be 0
|
95
116
|
expect(@context.rollback.length).to be 0
|
96
|
-
expect(@context.final.length).to be
|
117
|
+
expect(@context.final.length).to be 7
|
97
118
|
end
|
98
119
|
end
|
99
120
|
|
100
|
-
context "When a use case #fail! during the setup process" do
|
121
|
+
context "When a use case calls #fail! during the setup process" do
|
101
122
|
before do
|
102
|
-
|
103
|
-
|
104
|
-
fail!('no name!')
|
105
|
-
context.setup << self.class.name
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
@context = Perform::CreatePost.perform
|
110
|
-
end
|
111
|
-
|
112
|
-
after do
|
113
|
-
class Perform::ValidateName < RestMyCase::Base
|
114
|
-
def setup; context.setup << self.class.name; end
|
115
|
-
end
|
123
|
+
@context = Perform::CreatePost.perform \
|
124
|
+
fail_bang: ['Perform::ValidateName_setup']
|
116
125
|
end
|
117
126
|
|
118
127
|
it "context should reflect an invalid state" do
|
@@ -124,29 +133,72 @@ describe RestMyCase::Base do
|
|
124
133
|
end
|
125
134
|
|
126
135
|
it "context prove that only the correct method have ran" do
|
127
|
-
expect(@context.setup.length).to be
|
136
|
+
expect(@context.setup.length).to be 2
|
128
137
|
expect(@context.perform.length).to be 0
|
129
138
|
expect(@context.rollback.length).to be 0
|
130
|
-
expect(@context.final.length).to be
|
139
|
+
expect(@context.final.length).to be 7
|
131
140
|
end
|
132
141
|
end
|
133
142
|
|
134
|
-
context "When a use case #
|
143
|
+
context "When a use case calls #abort! during the setup process" do
|
135
144
|
before do
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
context.setup << self.class.name
|
140
|
-
end
|
141
|
-
end
|
145
|
+
@context = Perform::CreatePost.perform \
|
146
|
+
abort_bang: ['Perform::ValidateName_setup']
|
147
|
+
end
|
142
148
|
|
143
|
-
|
149
|
+
it "context should reflect an valid state" do
|
150
|
+
expect(@context.valid?).to be true
|
144
151
|
end
|
145
152
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
153
|
+
it "context prove that only the correct method have ran" do
|
154
|
+
expect(@context.setup.length).to be 2
|
155
|
+
expect(@context.perform.length).to be 0
|
156
|
+
expect(@context.rollback.length).to be 0
|
157
|
+
expect(@context.final.length).to be 7
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
context "When a use case calls #abort! during the perform process" do
|
162
|
+
before do
|
163
|
+
@context = Perform::CreatePost.perform \
|
164
|
+
abort_bang: ['Perform::ValidateName_perform']
|
165
|
+
end
|
166
|
+
|
167
|
+
it "context should reflect an valid state" do
|
168
|
+
expect(@context.valid?).to be true
|
169
|
+
end
|
170
|
+
|
171
|
+
it "context prove that only the correct method have ran" do
|
172
|
+
expect(@context.setup.length).to be 7
|
173
|
+
expect(@context.perform.length).to be 2
|
174
|
+
expect(@context.rollback.length).to be 3
|
175
|
+
expect(@context.final.length).to be 7
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
context "When a use case calls #skip during the setup process" do
|
180
|
+
before do
|
181
|
+
@context = Perform::CreatePost.perform \
|
182
|
+
skip: ['Perform::ValidateBody_setup']
|
183
|
+
end
|
184
|
+
|
185
|
+
it "context should reflect an valid state" do
|
186
|
+
expect(@context.valid?).to be true
|
187
|
+
end
|
188
|
+
|
189
|
+
it "context prove that only the correct method have ran" do
|
190
|
+
expect(@context.setup.length).to be 7
|
191
|
+
expect(@context.perform.length).to be 6
|
192
|
+
expect(@context.rollback.length).to be 0
|
193
|
+
expect(@context.final.length).to be 7
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
context "When a use case calls #skip! during the setup process" do
|
198
|
+
|
199
|
+
before do
|
200
|
+
@context = Perform::CreatePost.perform \
|
201
|
+
skip_bang: ['Perform::ValidateBody_setup']
|
150
202
|
end
|
151
203
|
|
152
204
|
it "context should reflect an valid state" do
|
@@ -155,10 +207,237 @@ describe RestMyCase::Base do
|
|
155
207
|
|
156
208
|
it "context prove that only the correct method have ran" do
|
157
209
|
expect(@context.setup.length).to be 6
|
158
|
-
expect(@context.perform.length).to be
|
210
|
+
expect(@context.perform.length).to be 6
|
159
211
|
expect(@context.rollback.length).to be 0
|
160
|
-
expect(@context.final.length).to be
|
212
|
+
expect(@context.final.length).to be 7
|
213
|
+
end
|
214
|
+
|
215
|
+
end
|
216
|
+
|
217
|
+
context "When dependent use_case has silence_dependencies_abort = true" do
|
218
|
+
|
219
|
+
before { Perform::Validations.silence_dependencies_abort = true }
|
220
|
+
after { Perform::Validations.silence_dependencies_abort = nil }
|
221
|
+
|
222
|
+
context "When a use case calls #fail during the setup process" do
|
223
|
+
before do
|
224
|
+
@context = Perform::CreatePost.perform \
|
225
|
+
fail: ['Perform::ValidateName_setup', 'Perform::ValidateBody_setup']
|
226
|
+
end
|
227
|
+
|
228
|
+
it "context should reflect an invalid state" do
|
229
|
+
expect(@context.valid?).to be false
|
230
|
+
end
|
231
|
+
|
232
|
+
it "context should contain only 2 errors" do
|
233
|
+
expect(@context.errors.keys.length).to be 2
|
234
|
+
end
|
235
|
+
|
236
|
+
it "context prove that only the correct method have ran" do
|
237
|
+
expect(@context.setup.length).to be 5
|
238
|
+
expect(@context.perform.length).to be 0
|
239
|
+
expect(@context.rollback.length).to be 0
|
240
|
+
expect(@context.final.length).to be 7
|
241
|
+
end
|
242
|
+
|
161
243
|
end
|
244
|
+
|
245
|
+
context "When a use case calls #fail during the perform process" do
|
246
|
+
|
247
|
+
before do
|
248
|
+
@context = Perform::CreatePost.perform \
|
249
|
+
fail: ['Perform::ValidateName_perform', 'Perform::ValidateBody_perform']
|
250
|
+
end
|
251
|
+
|
252
|
+
it "context should reflect an invalid state" do
|
253
|
+
expect(@context.valid?).to be false
|
254
|
+
end
|
255
|
+
|
256
|
+
it "context should contain only 2 errors" do
|
257
|
+
expect(@context.errors.keys.length).to be 2
|
258
|
+
end
|
259
|
+
|
260
|
+
it "context prove that only the correct method have ran" do
|
261
|
+
expect(@context.setup.length).to be 7
|
262
|
+
expect(@context.perform.length).to be 5
|
263
|
+
expect(@context.rollback.length).to be 5
|
264
|
+
expect(@context.final.length).to be 7
|
265
|
+
end
|
266
|
+
|
267
|
+
end
|
268
|
+
|
269
|
+
end
|
270
|
+
|
271
|
+
context "When general config has silence_dependencies_abort = true" do
|
272
|
+
|
273
|
+
before do
|
274
|
+
RestMyCase.configure do |config|
|
275
|
+
config.silence_dependencies_abort = true
|
276
|
+
end
|
277
|
+
end
|
278
|
+
after { RestMyCase.reset_config }
|
279
|
+
|
280
|
+
context "When a use case calls #fail during the perform process" do
|
281
|
+
|
282
|
+
before do
|
283
|
+
@context = Perform::CreatePost.perform \
|
284
|
+
fail: ['Perform::ValidateName_perform', 'Perform::ValidateBody_perform', 'Perform::BuildPost_perform', 'Perform::SavePost_perform']
|
285
|
+
end
|
286
|
+
|
287
|
+
it "context should reflect an invalid state" do
|
288
|
+
expect(@context.valid?).to be false
|
289
|
+
end
|
290
|
+
|
291
|
+
it "context should contain only 4 errors" do
|
292
|
+
expect(@context.errors.keys.length).to be 4
|
293
|
+
end
|
294
|
+
|
295
|
+
it "context prove that only the correct method have ran" do
|
296
|
+
expect(@context.setup.length).to be 7
|
297
|
+
expect(@context.perform.length).to be 7
|
298
|
+
expect(@context.rollback.length).to be 7
|
299
|
+
expect(@context.final.length).to be 7
|
300
|
+
end
|
301
|
+
|
302
|
+
end
|
303
|
+
|
304
|
+
end
|
305
|
+
|
306
|
+
end
|
307
|
+
|
308
|
+
describe "#invoke" do
|
309
|
+
|
310
|
+
class Perform::Invoker < Perform::UseCaseWrapper
|
311
|
+
def perform
|
312
|
+
super
|
313
|
+
invoke Perform::BuildPost, Perform::Validations, Perform::SavePost
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
it "should invoke other use cases with the invoker's cloned context and they can't alter the invoker's context" do
|
318
|
+
context = Perform::Invoker.perform
|
319
|
+
|
320
|
+
expect(context.setup.length).to be 2
|
321
|
+
expect(context.perform.length).to be 2
|
322
|
+
expect(context.rollback.length).to be 0
|
323
|
+
expect(context.final.length).to be 2
|
324
|
+
end
|
325
|
+
|
326
|
+
end
|
327
|
+
|
328
|
+
describe "#invoke!" do
|
329
|
+
|
330
|
+
context "when the invokees don't abort" do
|
331
|
+
|
332
|
+
class Perform::ScreammingInvoker < Perform::UseCaseWrapper
|
333
|
+
def perform
|
334
|
+
super
|
335
|
+
invoke! Perform::BuildPost, Perform::Validations, Perform::SavePost
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
339
|
+
it "should invoke other use cases with the invoker's context and actually alter it" do
|
340
|
+
@context = Perform::ScreammingInvoker.perform
|
341
|
+
|
342
|
+
expect(@context.setup).to eq [
|
343
|
+
"Perform::UseCaseWrapper",
|
344
|
+
"Perform::ScreammingInvoker",
|
345
|
+
"Perform::UseCaseWrapper",
|
346
|
+
"Perform::BuildPost",
|
347
|
+
"Perform::UseCaseWrapper",
|
348
|
+
"Perform::ValidateName",
|
349
|
+
"Perform::ValidateBody",
|
350
|
+
"Perform::Validations",
|
351
|
+
"Perform::UseCaseWrapper",
|
352
|
+
"Perform::SavePost"
|
353
|
+
]
|
354
|
+
expect(@context.perform).to eq [
|
355
|
+
"Perform::UseCaseWrapper",
|
356
|
+
"Perform::ScreammingInvoker",
|
357
|
+
"Perform::UseCaseWrapper",
|
358
|
+
"Perform::BuildPost",
|
359
|
+
"Perform::UseCaseWrapper",
|
360
|
+
"Perform::ValidateName",
|
361
|
+
"Perform::ValidateBody",
|
362
|
+
"Perform::Validations",
|
363
|
+
"Perform::UseCaseWrapper",
|
364
|
+
"Perform::SavePost"
|
365
|
+
]
|
366
|
+
expect(@context.rollback).to eq []
|
367
|
+
expect(@context.final).to eq [
|
368
|
+
"Perform::UseCaseWrapper",
|
369
|
+
"Perform::BuildPost",
|
370
|
+
"Perform::UseCaseWrapper",
|
371
|
+
"Perform::ValidateName",
|
372
|
+
"Perform::ValidateBody",
|
373
|
+
"Perform::Validations",
|
374
|
+
"Perform::UseCaseWrapper",
|
375
|
+
"Perform::SavePost",
|
376
|
+
"Perform::UseCaseWrapper",
|
377
|
+
"Perform::ScreammingInvoker"
|
378
|
+
]
|
379
|
+
end
|
380
|
+
|
381
|
+
end
|
382
|
+
|
383
|
+
context "when the invokees abort" do
|
384
|
+
|
385
|
+
class Perform::Validations2 < Perform::UseCaseWrapper
|
386
|
+
def perform
|
387
|
+
super
|
388
|
+
|
389
|
+
invoke! Perform::ValidateName, Perform::ValidateBody
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
class Perform::CreatePost2 < Perform::UseCaseWrapper
|
394
|
+
depends Perform::BuildPost, Perform::Validations2, Perform::SavePost
|
395
|
+
end
|
396
|
+
|
397
|
+
before do
|
398
|
+
@context = Perform::CreatePost2.perform \
|
399
|
+
fail: ['Perform::ValidateName_perform', 'Perform::ValidateBody_perform']
|
400
|
+
end
|
401
|
+
|
402
|
+
it "invoker should abort the process it his invokees have also aborted" do
|
403
|
+
expect(@context.setup).to eq [
|
404
|
+
"Perform::UseCaseWrapper",
|
405
|
+
"Perform::BuildPost",
|
406
|
+
"Perform::Validations2",
|
407
|
+
"Perform::SavePost",
|
408
|
+
"Perform::CreatePost2",
|
409
|
+
"Perform::UseCaseWrapper",
|
410
|
+
"Perform::ValidateName",
|
411
|
+
"Perform::UseCaseWrapper",
|
412
|
+
"Perform::ValidateBody"
|
413
|
+
]
|
414
|
+
expect(@context.perform).to eq [
|
415
|
+
"Perform::UseCaseWrapper",
|
416
|
+
"Perform::BuildPost",
|
417
|
+
"Perform::Validations2",
|
418
|
+
"Perform::UseCaseWrapper",
|
419
|
+
"Perform::ValidateName"
|
420
|
+
]
|
421
|
+
expect(@context.rollback).to eq [
|
422
|
+
"Perform::ValidateName",
|
423
|
+
"Perform::UseCaseWrapper",
|
424
|
+
"Perform::Validations2",
|
425
|
+
"Perform::BuildPost",
|
426
|
+
"Perform::UseCaseWrapper"
|
427
|
+
]
|
428
|
+
expect(@context.final).to eq [
|
429
|
+
"Perform::UseCaseWrapper",
|
430
|
+
"Perform::ValidateName",
|
431
|
+
"Perform::UseCaseWrapper",
|
432
|
+
"Perform::ValidateBody",
|
433
|
+
"Perform::UseCaseWrapper",
|
434
|
+
"Perform::BuildPost",
|
435
|
+
"Perform::Validations2",
|
436
|
+
"Perform::SavePost",
|
437
|
+
"Perform::CreatePost2"
|
438
|
+
]
|
439
|
+
end
|
440
|
+
|
162
441
|
end
|
163
442
|
|
164
443
|
end
|