functional_interactor 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,57 @@
1
+ module Interactor
2
+ describe Organizer do
3
+ include_examples :lint
4
+
5
+ let(:organizer) { Class.new.send(:include, Organizer) }
6
+
7
+ describe ".organize" do
8
+ let(:interactor2) { double(:interactor2) }
9
+ let(:interactor3) { double(:interactor3) }
10
+
11
+ it "sets interactors given class arguments" do
12
+ expect {
13
+ organizer.organize(interactor2, interactor3)
14
+ }.to change {
15
+ organizer.organized
16
+ }.from([]).to([interactor2, interactor3])
17
+ end
18
+
19
+ it "sets interactors given an array of classes" do
20
+ expect {
21
+ organizer.organize([interactor2, interactor3])
22
+ }.to change {
23
+ organizer.organized
24
+ }.from([]).to([interactor2, interactor3])
25
+ end
26
+ end
27
+
28
+ describe ".organized" do
29
+ it "is empty by default" do
30
+ expect(organizer.organized).to eq([])
31
+ end
32
+ end
33
+
34
+ describe "#call" do
35
+ let(:instance) { organizer.new }
36
+ let(:context) { double(:context) }
37
+ let(:interactor2) { double(:interactor2) }
38
+ let(:interactor3) { double(:interactor3) }
39
+ let(:interactor4) { double(:interactor4) }
40
+
41
+ before do
42
+ allow(instance).to receive(:context) { context }
43
+ allow(organizer).to receive(:organized) {
44
+ [interactor2, interactor3, interactor4]
45
+ }
46
+ end
47
+
48
+ it "calls each interactor in order with the context" do
49
+ expect(interactor2).to receive(:call!).once.with(context).ordered
50
+ expect(interactor3).to receive(:call!).once.with(context).ordered
51
+ expect(interactor4).to receive(:call!).once.with(context).ordered
52
+
53
+ instance.call
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,3 @@
1
+ describe Interactor do
2
+ include_examples :lint
3
+ end
@@ -0,0 +1,8 @@
1
+ if ENV["CODECLIMATE_REPO_TOKEN"]
2
+ require "codeclimate-test-reporter"
3
+ CodeClimate::TestReporter.start
4
+ end
5
+
6
+ require "interactor"
7
+
8
+ Dir[File.expand_path("../support/*.rb", __FILE__)].each { |f| require f }
@@ -0,0 +1,135 @@
1
+ shared_examples :lint do
2
+ let(:interactor) { Class.new.send(:include, described_class) }
3
+
4
+ describe ".call" do
5
+ let(:context) { double(:context) }
6
+ let(:instance) { double(:instance, context: context) }
7
+
8
+ it "calls an instance with the given context" do
9
+ expect(interactor).to receive(:new).once.with(foo: "bar") { instance }
10
+ expect(instance).to receive(:run).once.with(no_args)
11
+
12
+ expect(interactor.call(foo: "bar")).to eq(context)
13
+ end
14
+
15
+ it "provides a blank context if none is given" do
16
+ expect(interactor).to receive(:new).once.with({}) { instance }
17
+ expect(instance).to receive(:run).once.with(no_args)
18
+
19
+ expect(interactor.call).to eq(context)
20
+ end
21
+ end
22
+
23
+ describe ".call!" do
24
+ let(:context) { double(:context) }
25
+ let(:instance) { double(:instance, context: context) }
26
+
27
+ it "calls an instance with the given context" do
28
+ expect(interactor).to receive(:new).once.with(foo: "bar") { instance }
29
+ expect(instance).to receive(:run!).once.with(no_args)
30
+
31
+ expect(interactor.call!(foo: "bar")).to eq(context)
32
+ end
33
+
34
+ it "provides a blank context if none is given" do
35
+ expect(interactor).to receive(:new).once.with({}) { instance }
36
+ expect(instance).to receive(:run!).once.with(no_args)
37
+
38
+ expect(interactor.call!).to eq(context)
39
+ end
40
+ end
41
+
42
+ describe ".new" do
43
+ let(:context) { double(:context) }
44
+
45
+ it "initializes a context" do
46
+ expect(Interactor::Context).to receive(:build).once.with(foo: "bar") { context }
47
+
48
+ instance = interactor.new(foo: "bar")
49
+
50
+ expect(instance).to be_a(interactor)
51
+ expect(instance.context).to eq(context)
52
+ end
53
+
54
+ it "initializes a blank context if none is given" do
55
+ expect(Interactor::Context).to receive(:build).once.with({}) { context }
56
+
57
+ instance = interactor.new
58
+
59
+ expect(instance).to be_a(interactor)
60
+ expect(instance.context).to eq(context)
61
+ end
62
+ end
63
+
64
+ describe "#run" do
65
+ let(:instance) { interactor.new }
66
+
67
+ it "runs the interactor" do
68
+ expect(instance).to receive(:run!).once.with(no_args)
69
+
70
+ instance.run
71
+ end
72
+
73
+ it "rescues failure" do
74
+ expect(instance).to receive(:run!).and_raise(Interactor::Failure)
75
+
76
+ expect {
77
+ instance.run
78
+ }.not_to raise_error
79
+ end
80
+
81
+ it "raises other errors" do
82
+ expect(instance).to receive(:run!).and_raise("foo")
83
+
84
+ expect {
85
+ instance.run
86
+ }.to raise_error("foo")
87
+ end
88
+ end
89
+
90
+ describe "#run!" do
91
+ let(:instance) { interactor.new }
92
+
93
+ it "calls the interactor" do
94
+ expect(instance).to receive(:call).once.with(no_args)
95
+
96
+ instance.run!
97
+ end
98
+
99
+ it "raises failure" do
100
+ expect(instance).to receive(:run!).and_raise(Interactor::Failure)
101
+
102
+ expect {
103
+ instance.run!
104
+ }.to raise_error(Interactor::Failure)
105
+ end
106
+
107
+ it "raises other errors" do
108
+ expect(instance).to receive(:run!).and_raise("foo")
109
+
110
+ expect {
111
+ instance.run
112
+ }.to raise_error("foo")
113
+ end
114
+ end
115
+
116
+ describe "#call" do
117
+ let(:instance) { interactor.new }
118
+
119
+ it "exists" do
120
+ expect(instance).to respond_to(:call)
121
+ expect { instance.call }.not_to raise_error
122
+ expect { instance.method(:call) }.not_to raise_error
123
+ end
124
+ end
125
+
126
+ describe "#rollback" do
127
+ let(:instance) { interactor.new }
128
+
129
+ it "exists" do
130
+ expect(instance).to respond_to(:rollback)
131
+ expect { instance.rollback }.not_to raise_error
132
+ expect { instance.method(:rollback) }.not_to raise_error
133
+ end
134
+ end
135
+ end
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: functional_interactor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ho-Sheng Hsiao
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-05-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.7'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.3'
55
+ description: Functional Interactor using Kase protocol and composition operators
56
+ email: hosh@legal.io
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - ".gitignore"
62
+ - ".rspec"
63
+ - ".travis.yml"
64
+ - CHANGELOG.md
65
+ - CONTRIBUTING.md
66
+ - Gemfile
67
+ - LICENSE.txt
68
+ - README.md
69
+ - Rakefile
70
+ - functional_interactor.gemspec
71
+ - lib/functional_interactor.rb
72
+ - lib/interactors.rb
73
+ - lib/interactors/anonymous.rb
74
+ - lib/interactors/sequence.rb
75
+ - lib/interactors/simple.rb
76
+ - spec/integration_spec.rb
77
+ - spec/interactor/context_spec.rb
78
+ - spec/interactor/hooks_spec.rb
79
+ - spec/interactor/organizer_spec.rb
80
+ - spec/interactor_spec.rb
81
+ - spec/spec_helper.rb
82
+ - spec/support/lint.rb
83
+ homepage: https://github.com/hosh/functional_interactor
84
+ licenses:
85
+ - MIT
86
+ metadata: {}
87
+ post_install_message:
88
+ rdoc_options: []
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ requirements: []
102
+ rubyforge_project:
103
+ rubygems_version: 2.4.5.1
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: Functional Interactor, composable, higher-order interactors. Complete rewrite
107
+ of collectiveideas/interactor
108
+ test_files:
109
+ - spec/integration_spec.rb
110
+ - spec/interactor/context_spec.rb
111
+ - spec/interactor/hooks_spec.rb
112
+ - spec/interactor/organizer_spec.rb
113
+ - spec/interactor_spec.rb
114
+ - spec/spec_helper.rb
115
+ - spec/support/lint.rb