trailblazer-macro-contract 2.1.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,31 @@
1
+ require "test_helper"
2
+ require "dry/container"
3
+
4
+ class DryContainerTest < Minitest::Spec
5
+ Song = Struct.new(:id, :title)
6
+
7
+ class MyContract < Reform::Form
8
+ property :title
9
+ validates :title, length: 2..33
10
+ end
11
+
12
+ my_container = Dry::Container.new
13
+ my_container.register("contract.default.class", MyContract)
14
+ # my_container.namespace("contract") do
15
+ # register("create") { Array }
16
+ # end
17
+
18
+ #---
19
+ #- dependency injection
20
+ #- with Dry-container
21
+ class Create < Trailblazer::Operation
22
+ step Model( Song, :new )
23
+ step Contract::Build()
24
+ step Contract::Validate()
25
+ step Contract::Persist( method: :sync )
26
+ end
27
+ #:key end
28
+
29
+ it { Create.({ params: { title: "A" } }, my_container).inspect(:model).must_equal %{<Result:false [#<struct DryContainerTest::Song id=nil, title=nil>] >} }
30
+ it { Create.({ params: { title: "Anthony's Song" } }, my_container).inspect(:model).must_equal %{<Result:true [#<struct DryContainerTest::Song id=nil, title="Anthony's Song">] >} }
31
+ end
@@ -0,0 +1,84 @@
1
+ require "test_helper"
2
+
3
+ class ContractTest < Minitest::Spec
4
+ Song = Struct.new(:title)
5
+ #---
6
+ #- validate
7
+ class ValidateTest < Minitest::Spec
8
+ #---
9
+ # Contract::Validate[]
10
+ class Update < Trailblazer::Operation
11
+ class Form < Reform::Form
12
+ property :title
13
+ validates :title, presence: true
14
+ end
15
+
16
+ step Model( Song, :new )
17
+ step Contract::Build( constant: Form )
18
+ step Contract::Validate() # generic validate call for you.
19
+
20
+ # include Procedural::Validate
21
+ ->(*) { validate(options["params"][:song]) } # <-- TODO
22
+ end
23
+
24
+ # success
25
+ it do
26
+ result = Update.(params: {title: "SVG"})
27
+ result.success?.must_equal true
28
+ result["result.contract.default"].success?.must_equal true
29
+ result["result.contract.default"].errors.messages.must_equal({})
30
+ end
31
+
32
+ # failure
33
+ it do
34
+ result = Update.(params: {title: nil})
35
+ result.success?.must_equal false
36
+ result["result.contract.default"].success?.must_equal false
37
+ result["result.contract.default"].errors.messages.must_equal({:title=>["can't be blank"]})
38
+ end
39
+
40
+ #---
41
+ # Contract::Validate[key: :song]
42
+ class Upsert < Trailblazer::Operation
43
+ class Form < Reform::Form
44
+ property :title
45
+ validates :title, presence: true
46
+ end
47
+
48
+ step Model( Song, :new ) # FIXME.
49
+ step Contract::Build( constant: Form )
50
+ step Contract::Validate( key: :song) # generic validate call for you.
51
+ # ->(*) { validate(options["params"][:song]) } # <-- TODO
52
+ step Contract::Persist( method: :sync )
53
+ end
54
+
55
+ # success
56
+ it { Upsert.(params: {song: { title: "SVG" }}).success?.must_equal true }
57
+ # failure
58
+ it { Upsert.(params: {song: { title: nil }}).success?.must_equal false }
59
+ # key not found
60
+ it { Upsert.(params: {}).success?.must_equal false }
61
+
62
+ #---
63
+ # contract.default.params gets set (TODO: change in 2.1)
64
+ it { Upsert.( params: {song: { title: "SVG" }})[:params].must_equal({:song=>{:title=>"SVG"}} ) }
65
+ it { Upsert.( params: {song: { title: "SVG" }})["contract.default.params"].must_equal({:title=>"SVG"} ) }
66
+
67
+ #---
68
+ #- inheritance
69
+ class New < Upsert
70
+ end
71
+
72
+ it { Trailblazer::Operation::Inspect.(New).must_equal %{[>model.build,>contract.build,>contract.default.validate,>persist.save]} }
73
+
74
+ #- overwriting Validate
75
+ class NewHit < Upsert
76
+ step Contract::Validate( key: :hit ), override: true
77
+ end
78
+
79
+ it { Trailblazer::Operation::Inspect.(NewHit).must_equal %{[>model.build,>contract.build,>contract.default.validate,>persist.save]} }
80
+ it { NewHit.(params: {:hit => { title: "Hooray For Me" }}).inspect(:model).must_equal %{<Result:true [#<struct ContractTest::Song title=\"Hooray For Me\">] >} }
81
+ end
82
+ end
83
+
84
+ # TODO: full stack test with validate, process, save, etc.
@@ -0,0 +1,51 @@
1
+ require "test_helper"
2
+
3
+ class PersistTest < Minitest::Spec
4
+ Song = Struct.new(:title, :saved) do
5
+ def save; title=="Fail!" ? false : self.saved = true; end
6
+ end
7
+
8
+ class Create < Trailblazer::Operation
9
+ class Form < Reform::Form
10
+ property :title
11
+ end
12
+
13
+ class Fail1
14
+ def self.call(options, **); options["1. fail"] = "Validate" end
15
+ end
16
+
17
+ class Fail2
18
+ def self.call(options, **); options["2. fail"] = "Persist" end
19
+ end
20
+
21
+ step Model( Song, :new )
22
+ step Contract::Build( constant: Form )
23
+ step Contract::Validate()
24
+ fail Fail1
25
+ step Contract::Persist()
26
+ fail Fail2
27
+ end
28
+
29
+ it { Create.(params: { title: "In Recital" })[:model].title.must_equal "In Recital" }
30
+ it { Create.(params: { title: "In Recital" })[:model].saved.must_equal true }
31
+ # failure
32
+ it do
33
+ result = Create.(params: { title: "Fail!" })
34
+ result[:model].saved.must_be_nil
35
+ result[:model].title.must_equal "Fail!"
36
+ result["2. fail"].must_equal "Persist"
37
+ result.success?.must_equal false
38
+ end
39
+
40
+ #---
41
+ #- inheritance
42
+ class Update < Create
43
+ end
44
+
45
+ it { Operation::Inspect.( Update ).must_equal %{[>model.build,>contract.build,>contract.default.validate,<<PersistTest::Create::Fail1,>persist.save,<<PersistTest::Create::Fail2]} }
46
+
47
+ #---
48
+ it do
49
+ skip "show how save! could be applied and how we could rescue and deviate to left track"
50
+ end
51
+ end
@@ -0,0 +1,40 @@
1
+ require "pp"
2
+ require 'delegate'
3
+ require "trailblazer/macro"
4
+ require "trailblazer/macro/contract"
5
+ require "minitest/autorun"
6
+
7
+ # TODO: convert tests to non-rails.
8
+ require "reform"
9
+ require "reform/form/active_model/validations"
10
+ Reform::Form.class_eval do
11
+ include Reform::Form::ActiveModel::Validations
12
+ end
13
+
14
+ module Mock
15
+ class Result
16
+ def initialize(bool); @bool = bool end
17
+ def success?; @bool end
18
+ def errors; ["hihi"] end
19
+ end
20
+ end
21
+
22
+ module Test
23
+ module ReturnCall
24
+ def self.included(includer)
25
+ includer._insert :_insert, ReturnResult, {replace: Trailblazer::Operation::Result::Build}, ReturnResult, ""
26
+ end
27
+ end
28
+ ReturnResult = ->(last, input, options) { input }
29
+ end
30
+
31
+ require "pp"
32
+
33
+ Minitest::Spec::Operation = Trailblazer::Operation
34
+
35
+ Memo = Struct.new(:id, :body) do
36
+ def self.find(id)
37
+ return new(id, "Yo!") if id
38
+ nil
39
+ end
40
+ end
@@ -0,0 +1,39 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'trailblazer/macro/contract/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "trailblazer-macro-contract"
7
+ spec.version = Trailblazer::Macro::Contract::VERSION
8
+ spec.authors = ["Nick Sutterer"]
9
+ spec.email = ["apotonick@gmail.com"]
10
+ spec.description = 'Trailblazer operation macros to integrate Reform'
11
+ spec.summary = 'Trailblazer operation macros to integrate Reform forms and DRY.rb schemas.'
12
+ spec.homepage = "http://trailblazer.to"
13
+ spec.license = "LGPL-3.0"
14
+
15
+ spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency "declarative"
21
+ spec.add_dependency "reform", ">= 2.2.0", "< 3.0.0"
22
+ spec.add_dependency "trailblazer-operation", ">= 0.2.4", "< 0.3.0"
23
+
24
+ spec.add_development_dependency "bundler"
25
+ spec.add_development_dependency "trailblazer-macro", ">= 2.1.0.beta2", "< 2.2.0"
26
+
27
+ spec.add_development_dependency "reform-rails"
28
+ spec.add_development_dependency "dry-validation"
29
+ spec.add_development_dependency "activemodel"
30
+
31
+ spec.add_development_dependency "minitest"
32
+ spec.add_development_dependency "nokogiri"
33
+ spec.add_development_dependency "rake"
34
+
35
+ spec.add_development_dependency "roar"
36
+ spec.add_development_dependency "multi_json"
37
+
38
+ spec.required_ruby_version = '>= 2.0.0'
39
+ end
metadata ADDED
@@ -0,0 +1,270 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: trailblazer-macro-contract
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.1.0.beta2
5
+ platform: ruby
6
+ authors:
7
+ - Nick Sutterer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-03-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: declarative
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: reform
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.2.0
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: 3.0.0
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 2.2.0
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: 3.0.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: trailblazer-operation
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.2.4
54
+ - - "<"
55
+ - !ruby/object:Gem::Version
56
+ version: 0.3.0
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: 0.2.4
64
+ - - "<"
65
+ - !ruby/object:Gem::Version
66
+ version: 0.3.0
67
+ - !ruby/object:Gem::Dependency
68
+ name: bundler
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ - !ruby/object:Gem::Dependency
82
+ name: trailblazer-macro
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: 2.1.0.beta2
88
+ - - "<"
89
+ - !ruby/object:Gem::Version
90
+ version: 2.2.0
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: 2.1.0.beta2
98
+ - - "<"
99
+ - !ruby/object:Gem::Version
100
+ version: 2.2.0
101
+ - !ruby/object:Gem::Dependency
102
+ name: reform-rails
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ type: :development
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ - !ruby/object:Gem::Dependency
116
+ name: dry-validation
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ - !ruby/object:Gem::Dependency
130
+ name: activemodel
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ type: :development
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ - !ruby/object:Gem::Dependency
144
+ name: minitest
145
+ requirement: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ - !ruby/object:Gem::Dependency
158
+ name: nokogiri
159
+ requirement: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ type: :development
165
+ prerelease: false
166
+ version_requirements: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ - !ruby/object:Gem::Dependency
172
+ name: rake
173
+ requirement: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ type: :development
179
+ prerelease: false
180
+ version_requirements: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ version: '0'
185
+ - !ruby/object:Gem::Dependency
186
+ name: roar
187
+ requirement: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ type: :development
193
+ prerelease: false
194
+ version_requirements: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - ">="
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ - !ruby/object:Gem::Dependency
200
+ name: multi_json
201
+ requirement: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ type: :development
207
+ prerelease: false
208
+ version_requirements: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: '0'
213
+ description: Trailblazer operation macros to integrate Reform
214
+ email:
215
+ - apotonick@gmail.com
216
+ executables: []
217
+ extensions: []
218
+ extra_rdoc_files: []
219
+ files:
220
+ - ".gitignore"
221
+ - ".rubocop.yml"
222
+ - ".rubocop_todo.yml"
223
+ - ".travis.yml"
224
+ - CHANGES.md
225
+ - COMM-LICENSE
226
+ - Gemfile
227
+ - LICENSE.txt
228
+ - README.md
229
+ - Rakefile
230
+ - lib/trailblazer/macro/contract.rb
231
+ - lib/trailblazer/macro/contract/version.rb
232
+ - lib/trailblazer/operation/contract.rb
233
+ - lib/trailblazer/operation/persist.rb
234
+ - lib/trailblazer/operation/validate.rb
235
+ - test/docs/contract_test.rb
236
+ - test/docs/dry_test.rb
237
+ - test/operation/contract_test.rb
238
+ - test/operation/persist_test.rb
239
+ - test/test_helper.rb
240
+ - trailblazer-macro-contract.gemspec
241
+ homepage: http://trailblazer.to
242
+ licenses:
243
+ - LGPL-3.0
244
+ metadata: {}
245
+ post_install_message:
246
+ rdoc_options: []
247
+ require_paths:
248
+ - lib
249
+ required_ruby_version: !ruby/object:Gem::Requirement
250
+ requirements:
251
+ - - ">="
252
+ - !ruby/object:Gem::Version
253
+ version: 2.0.0
254
+ required_rubygems_version: !ruby/object:Gem::Requirement
255
+ requirements:
256
+ - - ">"
257
+ - !ruby/object:Gem::Version
258
+ version: 1.3.1
259
+ requirements: []
260
+ rubyforge_project:
261
+ rubygems_version: 2.7.3
262
+ signing_key:
263
+ specification_version: 4
264
+ summary: Trailblazer operation macros to integrate Reform forms and DRY.rb schemas.
265
+ test_files:
266
+ - test/docs/contract_test.rb
267
+ - test/docs/dry_test.rb
268
+ - test/operation/contract_test.rb
269
+ - test/operation/persist_test.rb
270
+ - test/test_helper.rb