webmock-twirp 0.1.0 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +58 -0
- data/lib/webmock/twirp/refinements.rb +9 -0
- data/lib/webmock/twirp/request_stub.rb +13 -5
- data/lib/webmock/twirp/version.rb +1 -1
- data/lib/webmock/twirp.rb +1 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0264d26c4984559b4163ff5740fda0df43882736fa174881a63939c195e85331
|
4
|
+
data.tar.gz: 9d0da633242e3f722d18c0c97042c5312b16ba4fb28fb6509479a04f5c4201eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 369e27e257599a09541feb244e9a4c1ff59a7b069c3df154c361c6567ce8f15f0e3b46cbfb0252ebe7c72beed20cb31bb8c947857d84372aec7ae3d697e21602
|
7
|
+
data.tar.gz: 7aa1544321a07d5f8350203f16f331d2e9ee90b5b38928d29d1b4fb2750101109298796ff7b571684108af8aaf3c80d4b2d595a27cdef0b33715c888cb99f1cd
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -2,7 +2,12 @@ WebMock::Twirp
|
|
2
2
|
======
|
3
3
|
Twirp support for [WebMock](https://github.com/bblimke/webmock). All our favorite http request stubbing for Twirp RPCs - message and error serialization done automatically.
|
4
4
|
|
5
|
+
### Install
|
6
|
+
```ruby
|
7
|
+
gem "webmock-twirp"
|
8
|
+
```
|
5
9
|
|
10
|
+
### Example
|
6
11
|
```ruby
|
7
12
|
require "webmock/twirp"
|
8
13
|
|
@@ -37,6 +42,59 @@ end
|
|
37
42
|
```
|
38
43
|
|
39
44
|
|
45
|
+
## Usage
|
46
|
+
|
47
|
+
### .with
|
48
|
+
`stub_twirp_request.with` allows you to only stub requests which match specific attributes. It accepts a hash or a `Google::Protobuf::MessageExts` instance. The hash supports constants, regexes, and rspec matchers.
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
stub_twirp_request.with(message: "hi")
|
52
|
+
stub_twirp_request.with(message: /^h/)
|
53
|
+
stub_twirp_request.with(message: include("i"))
|
54
|
+
|
55
|
+
expected_request = MyTwirpRequest.new(message: "hi")
|
56
|
+
stub_twirp_request.with(expected_request)
|
57
|
+
```
|
58
|
+
|
59
|
+
|
60
|
+
If you want even more control over the matching criteria, use the block mode. A `Protobuf` instance is passed into the block with the request's parameters.
|
61
|
+
|
62
|
+
```ruby
|
63
|
+
stub_twirp_request.with do |request|
|
64
|
+
request.message == "hi"
|
65
|
+
end
|
66
|
+
```
|
67
|
+
|
68
|
+
|
69
|
+
### .to_return
|
70
|
+
`stub_twirp_request.to_return` allows you to specify a response, or use a default response. It can be a hash or `Protobuf` instance. To return an error, specify an error code, http status, or `Twirp::Error`.
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
stub_twirp_request.to_return # ie. `MyTwirpResponse.new`
|
74
|
+
|
75
|
+
stub_twirp_request.to_return(msg: "bye")
|
76
|
+
|
77
|
+
response = MyTwirpResponse.new(msg: "bye")
|
78
|
+
stub_twirp_request.to_return(response)
|
79
|
+
|
80
|
+
# errors
|
81
|
+
stub_twirp_request.to_return(:not_found)
|
82
|
+
stub_twirp_request.to_return(404)
|
83
|
+
stub_twirp_request.to_return(Twirp::Error.not_found("Nope"))
|
84
|
+
```
|
85
|
+
|
86
|
+
The block mode passes in the request Protobuf.
|
87
|
+
```ruby
|
88
|
+
stub_twirp_request.to_return do |request|
|
89
|
+
if request.message == "hi"
|
90
|
+
{ msg: "bye" }
|
91
|
+
else
|
92
|
+
:not_found
|
93
|
+
end
|
94
|
+
end
|
95
|
+
```
|
96
|
+
|
97
|
+
|
40
98
|
----
|
41
99
|
## Contributing
|
42
100
|
|
@@ -6,6 +6,15 @@ module WebMock
|
|
6
6
|
find(&block)&.tap { |x| delete(x) }
|
7
7
|
end
|
8
8
|
end
|
9
|
+
|
10
|
+
refine Google::Protobuf::MessageExts do
|
11
|
+
def normalized_hash(symbolize_keys: true)
|
12
|
+
JSON.parse(
|
13
|
+
to_json(preserve_proto_fieldnames: true),
|
14
|
+
symbolize_names: symbolize_keys,
|
15
|
+
)
|
16
|
+
end
|
17
|
+
end
|
9
18
|
end
|
10
19
|
end
|
11
20
|
end
|
@@ -76,10 +76,17 @@ module WebMock
|
|
76
76
|
decoded_request = input_class.decode(request.body)
|
77
77
|
|
78
78
|
if attrs.any?
|
79
|
-
|
80
|
-
|
79
|
+
if defined?(RSpec::Matchers::BuiltIn::Include)
|
80
|
+
matcher = RSpec::Matchers::BuiltIn::Include.new(attrs)
|
81
|
+
attr_hash = decoded_request.to_h
|
82
|
+
normalize = ->{ decoded_request.normalized_hash }
|
83
|
+
else
|
84
|
+
matcher = WebMock::Matchers::HashIncludingMatcher.new(attrs)
|
85
|
+
attr_hash = WebMock::Util::HashKeysStringifier.stringify_keys!(decoded_request.to_h, deep: true)
|
86
|
+
normalize = ->{ decoded_request.normalized_hash(symbolize_keys: false) }
|
87
|
+
end
|
81
88
|
|
82
|
-
matched &=
|
89
|
+
matched &= (matcher === attr_hash || matcher === normalize.call)
|
83
90
|
end
|
84
91
|
|
85
92
|
if block
|
@@ -117,6 +124,7 @@ module WebMock
|
|
117
124
|
|
118
125
|
super(*response_hashes, &decoder)
|
119
126
|
end
|
127
|
+
alias_method :and_return, :to_return # update existing alias
|
120
128
|
|
121
129
|
def to_return_json(*)
|
122
130
|
raise NotImplementedError
|
@@ -168,10 +176,10 @@ module WebMock
|
|
168
176
|
if code = ::Twirp::ERROR_CODES_TO_HTTP_STATUS.key(obj)
|
169
177
|
::Twirp::Error.new(code, code)
|
170
178
|
else
|
171
|
-
raise ArgumentError, "invalid error
|
179
|
+
raise ArgumentError, "invalid http error status: #{obj}"
|
172
180
|
end
|
173
181
|
else
|
174
|
-
raise
|
182
|
+
raise ArgumentError, "can not generate twirp reponse from: #{obj}"
|
175
183
|
end
|
176
184
|
|
177
185
|
if res.is_a?(Google::Protobuf::MessageExts)
|
data/lib/webmock/twirp.rb
CHANGED
@@ -31,8 +31,7 @@ if $LOADED_FEATURES.find { |x| x =~ %r{/webmock/rspec.rb} }
|
|
31
31
|
# require "webmock/rspec"
|
32
32
|
RSpec.configure { |c| c.include WebMock::Twirp::API }
|
33
33
|
else
|
34
|
-
# patch
|
35
|
-
|
34
|
+
# patch WebMock to also export stub_twirp_request
|
36
35
|
module WebMock
|
37
36
|
module API
|
38
37
|
include WebMock::Twirp::API
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: webmock-twirp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Pepper
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-10-
|
11
|
+
date: 2022-10-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: webmock
|