trailblazer-test 0.1.1 → 1.0.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.
@@ -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