rspec-hanami 0.3.1 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1e6e35f4f31853c6187f05389c927febee58dc6c8b39f3eb46490046d7606413
4
- data.tar.gz: f1ecdd4748b5d7b24ca225dc369045d36d946bd0b040de7de212ab8061061458
3
+ metadata.gz: 43b921c465a646167dc6a7fd718c546f1be93d73a9c0519394933fd6238bc1d6
4
+ data.tar.gz: 74c5c0e2953dbf30834a3644109c8fa4bba5ba2eae17e2588b88d9b013fa1974
5
5
  SHA512:
6
- metadata.gz: c75721328c58abaf8ac4b42bf6a846c8a5dc1d4178bdddc75dabc9822d85cd2456fa3a5ff7a6bc5e87a4237edaadb0ba643fdba7249df06710947e15713f8dc8
7
- data.tar.gz: 108c45586351fb8eb13d70e52511a151d1bef8329f8176c45da462b428962453597e8cb591f2f42569a1af04a8ab933a526a21862efbc7ff148cebc6edb753e0
6
+ metadata.gz: a65b86fd97fdb453abe46ab417279911b347f9df014d67bafca54dce29bf7473a39cce4495f4cefe486393696c4784862d345c045b74240bc2dbd080e766a491
7
+ data.tar.gz: 1787091ed8cbdccffadf9ce860be0af0f86d2bbd248107ef4f16ccbd567b44aa4842645c0756cf93662ba8b39d9def2b3a3d6977980a630fd1a42a012290caa0
data/README.md CHANGED
@@ -114,6 +114,15 @@ expect(response).to match_in_body('Tittle')
114
114
  expect(response).to match_in_body(/Tittle\s\d+/)
115
115
  ```
116
116
 
117
+ #### `include_json`
118
+ Passes if `json` string in the body matches with hash arg
119
+
120
+ ``` ruby
121
+ response = action.call(params)
122
+ expect(response).to include_json(name: 'Anton')
123
+ expect(response).to include_json(user: { name: 'Anton })
124
+ ```
125
+
117
126
  ### Views Specs
118
127
  #### `have_action`
119
128
  Passes if form object has an action
@@ -139,6 +148,24 @@ Passes if form object has a field with wanted params
139
148
  expect(view.form).to have_field(node: input, type: 'text', id: 'user-first-name')
140
149
  ```
141
150
 
151
+ ### Entity specs
152
+ Passes if argument type has a matching with type.
153
+ You can use `Hanami::Entity::Types` for compare.
154
+
155
+ #### `have_attribute`
156
+ Passes if `:name` has `Types::String` type:
157
+
158
+ ``` ruby
159
+ it { expect(User).to have_attribute(:name, Types::String) }
160
+ ```
161
+
162
+ #### `have_attributes`
163
+ Passes if `:name` has `Types::String` type and `:age` has `Types::Int` type:
164
+
165
+ ``` ruby
166
+ it { expect(User).to have_attributes(name: Types::String, age: Types::Int) }
167
+ ```
168
+
142
169
  ## Also see
143
170
 
144
171
  * <https://github.com/rspec/rspec>
@@ -0,0 +1,32 @@
1
+ module RSpec
2
+ module Hanami
3
+ class MatchType
4
+ attr_reader :actual, :expected
5
+
6
+ def initialize(actual, expected)
7
+ @actual = actual
8
+ @expected = expected
9
+ end
10
+
11
+ def call
12
+ match_types?
13
+ end
14
+
15
+ private
16
+
17
+ def match_types?
18
+ return match_if_sum? if expected.class == Dry::Types::Sum
19
+
20
+ actual.is_a?(expected.primitive)
21
+ end
22
+
23
+ def match_if_sum?
24
+ expected.primitive?(actual)
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ # Syntactic shortcut to reference Hanami::Entity::Types in custom matchers
31
+ #
32
+ Types = ::Hanami::Entity::Types
@@ -2,11 +2,14 @@ require 'rspec/core/warnings'
2
2
  require 'rspec/expectations'
3
3
  require 'rspec/hanami/form_parser'
4
4
  require 'rspec/hanami/match_status'
5
+ require 'rspec/hanami/match_type'
5
6
  require 'rspec/hanami/matchers/have_http_status'
6
7
  require 'rspec/hanami/matchers/match_in_body'
7
8
  require 'rspec/hanami/matchers/be_status'
8
9
  require 'rspec/hanami/matchers/form_matchers'
9
10
  require 'rspec/hanami/matchers/redirect_to'
11
+ require 'rspec/hanami/matchers/match_entity_schema'
12
+ require 'rspec/hanami/matchers/include_json'
10
13
 
11
14
  module RSpec
12
15
  module Hanami
@@ -0,0 +1,33 @@
1
+ require 'json'
2
+
3
+ module RSpec
4
+ module Hanami
5
+ module Matchers
6
+ extend ::RSpec::Matchers::DSL
7
+
8
+ # @api public
9
+ # Passes if `json` string in the body matches with hash arg
10
+ #
11
+ #
12
+ # @example Accepts numeric and symbol statuses
13
+ # response = action.call(params)
14
+ # expect(response).to include_json(name: 'Anton')
15
+ # expect(response).to include_json(user: { name: 'Anton })
16
+ #
17
+ matcher :include_json do |json_object|
18
+ attr_reader :actual, :object
19
+
20
+ description { "include json #{json_object.to_json}" }
21
+
22
+ match do |object|
23
+ @object = object
24
+ @actual = object.last.last
25
+ actual == JSON.generate(json_object)
26
+ end
27
+
28
+ failure_message { |actual| "expect #{object} to include #{json_object} json" }
29
+ diffable
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,78 @@
1
+ module RSpec
2
+ module Hanami
3
+ module Matchers
4
+ extend ::RSpec::Matchers::DSL
5
+
6
+ # @api public
7
+ # Passes if `parameter` has an passed attribute of expected type
8
+ # Hanami::Entity::Types are allowed
9
+ #
10
+ # expect(User).to have_attribute(:name, Type::String)
11
+ #
12
+ matcher :have_attribute do |parameter, type|
13
+ attr_reader :expected_type
14
+
15
+ description { "have #{expected_type.name} type" }
16
+ match do |object|
17
+ @attributes = object.instance_variable_get(:@attributes)
18
+ @actual = @attributes[parameter]
19
+ @expected_type = type
20
+
21
+ RSpec::Hanami::MatchType.new(actual, expected_type).call
22
+ end
23
+
24
+ failure_message do |actual|
25
+ "expected that #{actual.class} should match with #{expected_type.name}"\
26
+ "\nDiff: #{differ.diff_as_string(actual.class.to_s, expected_type.name)}"
27
+ end
28
+
29
+ failure_message_when_negated do |actual|
30
+ "expected that #{actual.class} should not match with #{expected_type.name}"
31
+ end
32
+
33
+ def differ
34
+ RSpec::Support::Differ.new(
35
+ color: RSpec::Matchers.configuration.color?
36
+ )
37
+ end
38
+ end
39
+
40
+ # @api public
41
+ # Passes if all `parameters` has an passed attribute of expected types.
42
+ # Hanami::Entity::Types are allowed
43
+ #
44
+ # expect(User).to have_attributes(name: Type::String, ...)
45
+ #
46
+ matcher :have_attributes do |**parameters|
47
+ attr_reader :attributes, :actual_types, :expected_types
48
+
49
+ description { "have #{expected_types} types" }
50
+ match do |object|
51
+ @attributes = object.instance_variable_get(:@attributes)
52
+ @actual_types = attributes.map { |_attr, type| type.class }.join(', ')
53
+ @expected_types = parameters.map { |_attr, type| type.name }.join(', ')
54
+
55
+ parameters.all? do |attribute, type|
56
+ actual = attributes[attribute]
57
+ RSpec::Hanami::MatchType.new(actual, type).call
58
+ end
59
+ end
60
+
61
+ failure_message do |_actual|
62
+ "expected that #{actual_types} should match with #{expected_types}"\
63
+ "\nDiff: #{differ.diff_as_string(actual_types, expected_types)}"
64
+ end
65
+
66
+ failure_message_when_negated do |_actual|
67
+ "expected that #{actual_types} should not match with #{expected_types}"
68
+ end
69
+
70
+ def differ
71
+ RSpec::Support::Differ.new(
72
+ color: RSpec::Matchers.configuration.color?
73
+ )
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -1,5 +1,5 @@
1
1
  module RSpec
2
2
  module Hanami
3
- VERSION = "0.3.1"
3
+ VERSION = "0.4.0"
4
4
  end
5
5
  end
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.add_dependency "rspec"
23
23
  spec.add_dependency "hanami"
24
+ spec.add_dependency "hanami-model"
24
25
 
25
26
  spec.add_development_dependency "bundler", "~> 1.11"
26
27
  spec.add_development_dependency "rake", "~> 10.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-hanami
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton Davydov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-07-25 00:00:00.000000000 Z
11
+ date: 2018-08-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: hanami-model
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -98,10 +112,13 @@ files:
98
112
  - lib/rspec/hanami.rb
99
113
  - lib/rspec/hanami/form_parser.rb
100
114
  - lib/rspec/hanami/match_status.rb
115
+ - lib/rspec/hanami/match_type.rb
101
116
  - lib/rspec/hanami/matchers.rb
102
117
  - lib/rspec/hanami/matchers/be_status.rb
103
118
  - lib/rspec/hanami/matchers/form_matchers.rb
104
119
  - lib/rspec/hanami/matchers/have_http_status.rb
120
+ - lib/rspec/hanami/matchers/include_json.rb
121
+ - lib/rspec/hanami/matchers/match_entity_schema.rb
105
122
  - lib/rspec/hanami/matchers/match_in_body.rb
106
123
  - lib/rspec/hanami/matchers/redirect_to.rb
107
124
  - lib/rspec/hanami/request_helpers.rb