trailblazer-test 0.1.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,90 @@
1
+ module Trailblazer
2
+ module Test
3
+ # Offers the assertions `#assert_pass` and friends but with a configuration "DSL".
4
+ # That means you can write super short and concise test cases using the defaulting
5
+ # in this module.
6
+ module Suite
7
+ # Provide {Assert.assert_pass} and {Assert.assert_fail} functions which decouple
8
+ # the assertion logic from the actual test framework.
9
+ # They are called from the {Suite#assert_pass} helpers.
10
+ module Assert
11
+ module_function
12
+
13
+ # @semi-public (for rspec-trailblazer).
14
+ def normalize_for(params_fragment, **kws)
15
+ kws = normalize_kws(**kws)
16
+ ctx = ctx_for_params_fragment(params_fragment, **kws)
17
+
18
+ return ctx, kws
19
+ end
20
+
21
+ #@public
22
+ def assert_pass(params_fragment, deep_merge: true, assertion:, expected_attributes_to_merge:, **kws) # TODO: remove kws.
23
+ ctx, kws = normalize_for(params_fragment, **kws) # compute input, .
24
+
25
+ expected_attributes = expected_attributes_for(expected_attributes_to_merge, **kws) # compute "output", expected model attributes.
26
+
27
+ activity = kws[:operation] # FIXME.
28
+
29
+ assertion.(activity, ctx, expected_model_attributes: expected_attributes, **kws)
30
+ end
31
+
32
+ def assert_fail(params_fragment, expected_errors, assertion:, **kws)
33
+ ctx, kws = normalize_for(params_fragment, **kws)
34
+ activity = kws[:operation] # FIXME.
35
+
36
+ assertion.(activity, ctx, expected_errors, **kws)
37
+ end
38
+
39
+ # @semi-public used in rspec-trailblazer.
40
+ def ctx_for_params_fragment(params_fragment, key_in_params:, default_ctx:, **)
41
+ return params_fragment if params_fragment.kind_of?(Trailblazer::Test::Context)
42
+ # If {:key_in_params} is given, key the {params_fragment} with it, e.g. {params: {transaction: {.. params_fragment ..}}}
43
+ merge_with_ctx = key_in_params ? {params: {key_in_params => params_fragment}} : {params: params_fragment}
44
+
45
+ ctx = Suite.merge_for(default_ctx, merge_with_ctx, true)
46
+ end
47
+
48
+ # @private
49
+ # Gather all test case configuration. This involves reading all test `let` directives.
50
+ def normalize_kws(user_block:, test:, operation: test.operation, contract_name: "default", invoke: Assertion.method(:invoke_operation), **options)
51
+ kws = {
52
+ operation: operation,
53
+ test: test,
54
+ contract_name: contract_name,
55
+ user_block: user_block,
56
+ invoke: invoke,
57
+
58
+ **normalize_kws_for_ctx(test: test, **options),
59
+ **normalize_kws_for_model_assertion(test: test, **options),
60
+ }
61
+
62
+ return kws
63
+ end
64
+
65
+ # @semi-public used in rspec-trailblazer.
66
+ # Used when building the incoming {ctx}, e.g. in {#run}.
67
+ def normalize_kws_for_ctx(test:, key_in_params: test.key_in_params, default_ctx: test.default_ctx, **)
68
+ {
69
+ default_ctx: default_ctx,
70
+ key_in_params: key_in_params,
71
+ }
72
+ end
73
+
74
+ def normalize_kws_for_model_assertion(test:, expected_attributes: test.expected_attributes, model_at: :model, **)
75
+ {
76
+ expected_attributes: expected_attributes,
77
+ model_at: model_at,
78
+ }
79
+ end
80
+
81
+ # FIXME: when {deep_merge: true} the result hash contains subclassed AR classes instead of the original ones.
82
+ # when we got this sorted we can allows deep merging here, too.
83
+ # @semi-public (for rspec-trailblazer).
84
+ def expected_attributes_for(expected_attributes_to_merge, expected_attributes:, deep_merge: false, **)
85
+ _expected_attributes = Suite.merge_for(expected_attributes, expected_attributes_to_merge, deep_merge)
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,51 @@
1
+ require "hashie"
2
+ require "trailblazer/test/context"
3
+
4
+ module Trailblazer
5
+ module Test
6
+ module Suite
7
+ # @private
8
+ class CtxHash < Hash
9
+ include Hashie::Extensions::DeepMerge
10
+ end
11
+
12
+ module_function
13
+ # @private
14
+ def merge_for(dest, source, deep_merge)
15
+ return dest.merge(source) unless deep_merge
16
+
17
+ CtxHash[dest].deep_merge(CtxHash[source]) # FIXME: this subclasses ActiveRecord classes in dest like {class: ReportSubscription}
18
+ end
19
+
20
+ def Ctx(merge_with_ctx={}, exclude: false, merge: true, **kws)
21
+ if merge
22
+ options = Suite::Assert.normalize_kws_for_ctx(test: self, **kws) # FIXME: why test?
23
+ key_in_params = options[:key_in_params]
24
+ default_ctx = options[:default_ctx]
25
+
26
+ # Extract {:params} from {default_ctx}
27
+ default_params = key_in_params ? default_ctx[:params][key_in_params] : default_ctx[:params]
28
+
29
+ # Remove {:exclude} variables from the {params:} part
30
+ filtered_default_params =
31
+ if exclude
32
+ default_params.slice(*(default_params.keys - exclude))
33
+ else
34
+ default_params # use original params if no filtering configured.
35
+ end
36
+
37
+ # FIXME: very, very redundant.
38
+ default_params_for_ctx = key_in_params ? {key_in_params => filtered_default_params} : filtered_default_params
39
+
40
+ ctx = default_ctx.merge({params: default_params_for_ctx})
41
+ else # FIXME: if/else here sucks.
42
+ ctx = {}
43
+ end
44
+
45
+ ctx = Suite.merge_for(ctx, merge_with_ctx, true) # merge injections
46
+
47
+ Trailblazer::Test::Context[ctx] # this signals "pass-through"
48
+ end
49
+ end # Suite
50
+ end
51
+ end
@@ -0,0 +1,58 @@
1
+ module Trailblazer
2
+ module Test
3
+ # Offers the assertions `#assert_pass` and friends but with a configuration "DSL".
4
+ # That means you can write super short and concise test cases using the defaulting
5
+ # in this module.
6
+ module Suite
7
+ # Defaults so tests run without tweaking (almost).
8
+ module Spec
9
+ def self.included(includer)
10
+ includer.let(:operation) { raise "Trailblazer::Test: `let(:operation) { ... }` is missing" }
11
+ includer.let(:key_in_params) { false }
12
+ includer.let(:expected_attributes) { {} } # You need to override this in your tests.
13
+ includer.let(:default_ctx) { {} }
14
+ end
15
+ end
16
+
17
+ # For Minitest::Test, given there are still people using this awkward syntax. :)
18
+ module Test
19
+ def operation
20
+ raise "Trailblazer::Test: `def operation` is missing"
21
+ end
22
+
23
+ def key_in_params
24
+ false
25
+ end
26
+
27
+ def expected_attributes
28
+ {}
29
+ end
30
+
31
+ def default_ctx
32
+ {}
33
+ end
34
+ end
35
+
36
+ # The assertions and helpers included into the actual test.
37
+ def assert_pass(params_fragment, expected_attributes_to_merge={}, assertion: Assertion::AssertPass, **kws, &block)
38
+ Assert.assert_pass(params_fragment, test: self, user_block: block, assertion: assertion, expected_attributes_to_merge: expected_attributes_to_merge, **kws)
39
+ end
40
+
41
+ def assert_fail(params_fragment, expected_errors=nil, assertion: Assertion::AssertFail, **kws, &block)
42
+ Assert.assert_fail(params_fragment, expected_errors, test: self, user_block: block, assertion: assertion, **kws)
43
+ end
44
+
45
+ def assert_pass?(*args, **kws, &block)
46
+ assert_pass(*args, **kws, invoke: Assertion.method(:invoke_operation_with_wtf), &block)
47
+ end
48
+
49
+ def assert_fail?(*args, **kws, &block)
50
+ assert_fail(*args, **kws, invoke: Assertion.method(:invoke_operation_with_wtf), &block)
51
+ end
52
+
53
+ def Ctx(*args, **kws)
54
+ Assert.Ctx(*args, test: self, **kws)
55
+ end
56
+ end # Suite
57
+ end
58
+ end
@@ -0,0 +1,62 @@
1
+ require "trailblazer/macro"
2
+ require "trailblazer/macro/contract"
3
+ # require "reform/form/active_model/validations" # FIXME: document!
4
+ require "dry-validation" # FIXME: bug in reform-rails with Rails 6.1 errors object forces us to use dry-v until it's fixed.
5
+ require "trailblazer/operation"
6
+
7
+ module Trailblazer::Test
8
+ # Test components we need in other gems, too.
9
+ module Testing
10
+ class Memo < Struct.new(:id, :title, :content, :tag_list, :persisted?, :errors, keyword_init: true)
11
+ VALID_INPUT = {params: {memo: {title: "TODO", content: "Stock up beer"}}}.freeze
12
+
13
+ def save
14
+ self[:persisted?] = true
15
+ self[:id] = 1
16
+ end
17
+
18
+ module Operation
19
+ class Create < Trailblazer::Operation
20
+ class Form < Reform::Form
21
+ require "reform/form/dry"
22
+ include Reform::Form::Dry
23
+
24
+ property :title
25
+ property :content
26
+ property :tag_list
27
+
28
+ validation do
29
+ params do
30
+ required(:title).filled
31
+ required(:content).filled(min_size?: 8)
32
+ optional(:tag_list).maybe(type?: String)
33
+ end
34
+ end
35
+ end
36
+
37
+ step :capture
38
+ step Model::Build(Memo, :new)
39
+ step Contract::Build(constant: Form)
40
+ step Contract::Validate(key: :memo)
41
+ step :parse_tag_list
42
+ step Contract::Persist()
43
+
44
+ module Capture
45
+ def capture(ctx, **)
46
+ ctx[:captured] = CU.inspect(ctx.to_h)
47
+ end
48
+ end
49
+ include Capture
50
+
51
+ def parse_tag_list(ctx, **)
52
+ tag_list = ctx["contract.default"].tag_list or return true
53
+
54
+ tags = tag_list.split(",")
55
+
56
+ ctx["contract.default"].tag_list = tags
57
+ end
58
+ end # Create
59
+ end
60
+ end
61
+ end
62
+ end
@@ -1,5 +1,5 @@
1
1
  module Trailblazer
2
2
  module Test
3
- VERSION = "0.1.1".freeze
3
+ VERSION = "1.0.0".freeze
4
4
  end
5
5
  end
@@ -3,10 +3,19 @@ require "trailblazer/test/version"
3
3
  module Trailblazer
4
4
  module Test
5
5
  # Your code goes here...
6
+
7
+ def self.module!(*args, **options, &block)
8
+ Assertion.module!(*args, **options, &block)
9
+ end
6
10
  end
7
11
  end
8
12
 
9
- require "trailblazer/test/assertions"
10
- require "trailblazer/test/operation/helper"
11
- require "trailblazer/test/operation/assertions"
12
- require "trailblazer/test/operation/policy_assertions"
13
+ require "trailblazer/test/assertion/assert_exposes"
14
+ require "trailblazer/test/assertion/assert_pass"
15
+ require "trailblazer/test/assertion/assert_fail"
16
+ require "trailblazer/test/assertion"
17
+ require "trailblazer/test/suite"
18
+ require "trailblazer/test/suite/assert"
19
+ require "trailblazer/test/suite/ctx"
20
+ require "trailblazer/test/helper/mock_step"
21
+ # require "trailblazer/test/operation/policy_assertions"
@@ -23,10 +23,15 @@ Gem::Specification.new do |spec|
23
23
 
24
24
  spec.add_development_dependency "bundler"
25
25
  spec.add_development_dependency "minitest", "~> 5.0"
26
+ spec.add_development_dependency "minitest-line"
26
27
  spec.add_development_dependency "rake"
27
- spec.add_development_dependency "rubocop"
28
- spec.add_development_dependency "simplecov"
29
28
 
30
- spec.add_dependency "trailblazer-activity", ">= 0.10.0"
31
- spec.add_dependency "trailblazer-activity-dsl-linear", ">= 0.2.5"
29
+ spec.add_development_dependency "trailblazer-operation"
30
+ spec.add_development_dependency "trailblazer-macro"
31
+ spec.add_development_dependency "trailblazer-macro-contract"
32
+ # spec.add_development_dependency "reform-rails"
33
+ spec.add_development_dependency "dry-validation"
34
+ spec.add_development_dependency "trailblazer-core-utils", ">= 0.0.5"
35
+
36
+ spec.add_dependency "trailblazer-activity-dsl-linear", ">= 1.2.6"
32
37
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trailblazer-test
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-28 00:00:00.000000000 Z
11
+ date: 2025-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '5.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest-line
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rake
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -67,7 +81,7 @@ dependencies:
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
- name: rubocop
84
+ name: trailblazer-operation
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - ">="
@@ -81,7 +95,7 @@ dependencies:
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
- name: simplecov
98
+ name: trailblazer-macro
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - ">="
@@ -95,33 +109,61 @@ dependencies:
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
- name: trailblazer-activity
112
+ name: trailblazer-macro-contract
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - ">="
102
116
  - !ruby/object:Gem::Version
103
- version: 0.10.0
104
- type: :runtime
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: dry-validation
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: trailblazer-core-utils
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 0.0.5
146
+ type: :development
105
147
  prerelease: false
106
148
  version_requirements: !ruby/object:Gem::Requirement
107
149
  requirements:
108
150
  - - ">="
109
151
  - !ruby/object:Gem::Version
110
- version: 0.10.0
152
+ version: 0.0.5
111
153
  - !ruby/object:Gem::Dependency
112
154
  name: trailblazer-activity-dsl-linear
113
155
  requirement: !ruby/object:Gem::Requirement
114
156
  requirements:
115
157
  - - ">="
116
158
  - !ruby/object:Gem::Version
117
- version: 0.2.5
159
+ version: 1.2.6
118
160
  type: :runtime
119
161
  prerelease: false
120
162
  version_requirements: !ruby/object:Gem::Requirement
121
163
  requirements:
122
164
  - - ">="
123
165
  - !ruby/object:Gem::Version
124
- version: 0.2.5
166
+ version: 1.2.6
125
167
  description: Assertions, matchers, and helpers to test Trailblazer code.
126
168
  email:
127
169
  - apotonick@gmail.com
@@ -129,21 +171,24 @@ executables: []
129
171
  extensions: []
130
172
  extra_rdoc_files: []
131
173
  files:
174
+ - ".github/workflows/ci.yml"
132
175
  - ".gitignore"
133
- - ".rubocop-https---raw-githubusercontent-com-trailblazer-meta-master-rubocop-yml"
134
- - ".rubocop.yml"
135
- - ".travis.yml"
136
176
  - CHANGES.md
137
177
  - Gemfile
138
178
  - README.md
139
179
  - Rakefile
140
180
  - lib/trailblazer/test.rb
141
- - lib/trailblazer/test/assertions.rb
142
- - lib/trailblazer/test/deprecation/operation/assertions.rb
143
- - lib/trailblazer/test/deprecation/operation/helper.rb
144
- - lib/trailblazer/test/operation/assertions.rb
145
- - lib/trailblazer/test/operation/helper.rb
146
- - lib/trailblazer/test/operation/policy_assertions.rb
181
+ - lib/trailblazer/test/assertion.rb
182
+ - lib/trailblazer/test/assertion/assert_exposes.rb
183
+ - lib/trailblazer/test/assertion/assert_fail.rb
184
+ - lib/trailblazer/test/assertion/assert_pass.rb
185
+ - lib/trailblazer/test/context.rb
186
+ - lib/trailblazer/test/endpoint.rb
187
+ - lib/trailblazer/test/helper/mock_step.rb
188
+ - lib/trailblazer/test/suite.rb
189
+ - lib/trailblazer/test/suite/assert.rb
190
+ - lib/trailblazer/test/suite/ctx.rb
191
+ - lib/trailblazer/test/testing.rb
147
192
  - lib/trailblazer/test/version.rb
148
193
  - trailblazer-test.gemspec
149
194
  homepage: http://trailblazer.to
@@ -164,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
209
  - !ruby/object:Gem::Version
165
210
  version: '0'
166
211
  requirements: []
167
- rubygems_version: 3.0.8
212
+ rubygems_version: 3.2.3
168
213
  signing_key:
169
214
  specification_version: 4
170
215
  summary: Assertions, matchers, and helpers to test Trailblazer code.
@@ -1,115 +0,0 @@
1
- AllCops:
2
- TargetRubyVersion: 2.5.0
3
- DisplayCopNames: true
4
- Layout/CaseIndentation:
5
- IndentOneStep: true
6
- Layout/FirstArrayElementLineBreak:
7
- Enabled: true
8
- Layout/FirstHashElementLineBreak:
9
- Enabled: true
10
- Layout/FirstMethodArgumentLineBreak:
11
- Enabled: true
12
- Layout/FirstMethodParameterLineBreak:
13
- Enabled: true
14
- Layout/MultilineAssignmentLayout:
15
- Enabled: true
16
- EnforcedStyle: same_line
17
- Layout/SpaceInsideHashLiteralBraces:
18
- EnforcedStyle: no_space
19
- Metrics/LineLength:
20
- Max: 130
21
- Metrics/ParameterLists:
22
- Max: 5
23
- Naming/VariableNumber:
24
- EnforcedStyle: snake_case
25
- Style/AndOr:
26
- EnforcedStyle: conditionals
27
- Style/AutoResourceCleanup:
28
- Enabled: true
29
- Style/CollectionMethods:
30
- Enabled: true
31
- Style/Documentation:
32
- Enabled: false
33
- Style/EmptyLiteral:
34
- Enabled: false
35
- Style/EmptyMethod:
36
- EnforcedStyle: expanded
37
- Style/FormatStringToken:
38
- EnforcedStyle: template
39
- Style/ImplicitRuntimeError:
40
- Enabled: true
41
- Style/MethodCalledOnDoEndBlock:
42
- Enabled: true
43
- Style/MethodDefParentheses:
44
- EnforcedStyle: require_parentheses
45
- Style/MissingElse:
46
- Enabled: true
47
- EnforcedStyle: case
48
- Style/NumericLiterals:
49
- Enabled: false
50
- Style/OptionHash:
51
- Enabled: true
52
- Style/PercentLiteralDelimiters:
53
- PreferredDelimiters:
54
- "%w": "[]"
55
- "%W": "[]"
56
- "%i": "[]"
57
- "%I": "[]"
58
- "%r": "()"
59
- Style/ReturnNil:
60
- Enabled: true
61
- Style/SafeNavigation:
62
- Enabled: false
63
- Style/Send:
64
- Enabled: true
65
- Style/SignalException:
66
- EnforcedStyle: semantic
67
- Style/StringLiterals:
68
- EnforcedStyle: double_quotes
69
- Style/StringLiteralsInInterpolation:
70
- EnforcedStyle: double_quotes
71
- Style/StringMethods:
72
- Enabled: true
73
- Style/SymbolArray:
74
- Enabled: true
75
- # this allows in rspec to have expect { } with multiple lines
76
- Style/BlockDelimiters:
77
- EnforcedStyle: braces_for_chaining
78
- Layout/EndOfLine:
79
- Enabled: false
80
- # don't need these checks in test folders
81
- Metrics/ModuleLength:
82
- Exclude:
83
- - "spec/**/*"
84
- - "test/**/*"
85
- Metrics/BlockLength:
86
- Exclude:
87
- - "spec/**/*"
88
- - "test/**/*"
89
- - "*.gemspec" # definitely not in the gemspec
90
- Metrics/MethodLength:
91
- Max: 20
92
- Lint/UnreachableCode:
93
- Description: 'Unreachable code.'
94
- Enabled: false
95
- Lint/Void:
96
- Enabled: false
97
- Layout/AlignHash:
98
- EnforcedLastArgumentHashStyle: ignore_implicit
99
- Metrics/AbcSize:
100
- Max: 25
101
- Style/LambdaCall:
102
- Enabled: false
103
- Style/Semicolon:
104
- Enabled: false
105
- Naming/UncommunicativeMethodParamName:
106
- Enabled: false
107
- Style/ClassAndModuleChildren:
108
- Enabled: false
109
- Layout/LeadingCommentSpace:
110
- Exclude:
111
- - 'test/docs/**/*'
112
- Layout/AlignHash:
113
- EnforcedHashRocketStyle: table
114
- Style/FrozenStringLiteralComment:
115
- Enabled: false
data/.rubocop.yml DELETED
@@ -1,17 +0,0 @@
1
- inherit_from:
2
- - https://raw.githubusercontent.com/trailblazer/meta/master/rubocop.yml
3
-
4
- Style/SignalException:
5
- Exclude:
6
- - lib/trailblazer/test/operation/assertions.rb
7
- - lib/trailblazer/test/operation/helper.rb
8
- - lib/trailblazer/test/deprecation/operation/helper.rb
9
-
10
- Metrics/ParameterLists:
11
- Exclude:
12
- - lib/trailblazer/test/operation/assertions.rb
13
-
14
- Metrics/LineLength:
15
- Exclude:
16
- - lib/trailblazer/test/operation/assertions.rb
17
-
data/.travis.yml DELETED
@@ -1,14 +0,0 @@
1
- language: ruby
2
- cache: bundler
3
- matrix:
4
- include:
5
- - rvm: 2.1
6
- gemfile: Gemfile
7
- - rvm: 2.2
8
- gemfile: Gemfile
9
- - rvm: 2.3.1
10
- gemfile: Gemfile
11
- - rvm: 2.4.1
12
- gemfile: Gemfile
13
- - rvm: 2.5.0
14
- gemfile: Gemfile
@@ -1,37 +0,0 @@
1
- # module MiniTest::Assertions
2
- module Trailblazer
3
- module Test
4
- # Evaluate value if it's a lambda, and let the caller know whether we need an
5
- # assert_equal or an assert.
6
- def self.expected(asserted, value, actual)
7
- value.is_a?(Proc) ? [value.(actual: actual, asserted: asserted), false] : [value, true]
8
- end
9
-
10
- # Read the actual value from the asserted object (e.g. a model).
11
- def self.actual(asserted, reader, name)
12
- reader ? asserted.public_send(reader, name) : asserted.public_send(name)
13
- end
14
-
15
- module Assertions
16
- module_function
17
-
18
- # tuples = defaults.merge(overrides) # FIXME: merge with above!
19
-
20
- # Test if all `tuples` values on `asserted` match the expected values.
21
- # @param asserted Object Object that exposes attributes to test
22
- # @param tuples Hash Key/value attribute pairs to test
23
- # @param options Hash Default :reader is `asserted.{name}`,
24
- # TODO: test err msgs!
25
- def assert_exposes(asserted, tuples, reader: nil)
26
- tuples.each do |k, v|
27
- actual = Test.actual(asserted, reader, k)
28
- expected, is_eq = Test.expected(asserted, v, actual)
29
-
30
- is_eq ? assert_equal(expected, actual, "Property [#{k}] mismatch") : assert(expected, "Actual: #{actual.inspect}.")
31
- end
32
- end
33
- end
34
- end
35
- end
36
- # Trailblazer::Operation::Result.infect_an_assertion :assert_result_matches, :must_match, :do_not_flip
37
- # Object.infect_an_assertion :assert_exposes, :must_expose, :do_not_flip