protobuf-rspec 0.2.3 → 1.0.0.rc1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 75f4085dce2b39870d9c0e727802b1fa9b932092
4
+ data.tar.gz: c1e8fd5a05bbbb5247d1317c2d0c83cd18505ca2
5
+ SHA512:
6
+ metadata.gz: 1ddfb37df0a592dd5d384abfea2b2e479233d8ba960d16ea30c01bd6ef4b1aebb8db0bd349fe43083747ee600353928355574b73628b0ee3325940f769d56929
7
+ data.tar.gz: 452459206a10534d3d048cadd194677e1933fac119a9beb397a740f48a2cd177a4354f8514e74644ecba64261ec0b57df35318ac8ddf0a03926d18814ea719c4
data/README.md CHANGED
@@ -20,7 +20,7 @@ Unit-Testing Service Behavior
20
20
 
21
21
  ### `local_rpc`
22
22
 
23
- To unit test your service you should use the `local_rpc` helper method. `local_rpc` helps you call the service instance method of your choosing to ensure that the correct responses are generated with the given requests. This should be used to outside-in test a local RPC Service without testing the underlying socket implementation or needing actual client code to invoke the endpoint method under test.
23
+ To unit test your service you should use the `local_rpc` helper method. `local_rpc` helps you call the service instance method of your choosing to ensure that the correct responses are generated with the given requests. This should be used to outside-in test a local RPC Service without testing the underlying socket implementation or needing actual client code to invoke the endpoint method under test. Any filters added to the service **will** be invoked.
24
24
 
25
25
  Given the service implementation below:
26
26
 
@@ -88,6 +88,34 @@ describe Services::UserService do
88
88
  end
89
89
  ```
90
90
 
91
+ ### `rpc`
92
+
93
+ Make an RPC call (without testing the underlying socket implementation). Works the same as `local_rpc`, but invokes the entire RPC middleware stack (service filters are also run):
94
+
95
+ ```Ruby
96
+ rpc(:create, user_request) # => UserService#create
97
+ ```
98
+
99
+ ### `rpc_env`
100
+
101
+ Initialize a new RPC env object simulating what happens in the middleware stack.
102
+ Useful for testing a service class directly without using `rpc` or `local_rpc`.
103
+
104
+ ```Ruby
105
+ describe "#create" do
106
+ # Initialize request and response
107
+ # ...
108
+ let(:env) { rpc_env(:create, request) }
109
+
110
+ subject { described_class.new(env) }
111
+
112
+ it "creates a user" do
113
+ subject.create
114
+ subject.response.should eq response
115
+ end
116
+ end
117
+ ```
118
+
91
119
  ### `subject_service`
92
120
 
93
121
  One thing to note is that `local_rpc` uses `described_class` as the class to invoke for the given method. If you need to instead test a different class than your `described_class`, simply pass a block to `subject_service` which returns the class you would like to use instead.
@@ -1,4 +1,4 @@
1
- require 'protobuf/rpc/rpc.pb'
1
+ require 'protobuf/rpc/server'
2
2
 
3
3
  # RSpec Helpers designed to give you mock abstraction of client or service layer.
4
4
  # Require as protobuf/rspec/helpers and include into your running RSpec configuration.
@@ -8,6 +8,7 @@ require 'protobuf/rpc/rpc.pb'
8
8
  # RSpec.configure do |config|
9
9
  # config.include Protobuf::Rspec::Helpers
10
10
  # end
11
+ #
11
12
  module Protobuf
12
13
  module RSpec
13
14
  module Helpers
@@ -34,7 +35,6 @@ module Protobuf
34
35
  # its('response.records') { should have(3).items }
35
36
  # end
36
37
  #
37
- #
38
38
  def subject_service
39
39
  if block_given?
40
40
  @_subject_service = yield
@@ -51,8 +51,8 @@ module Protobuf
51
51
  self.class.subject_service
52
52
  end
53
53
 
54
- # Call a local service to test responses and behavior based on the given request.
55
- # Should use to outside-in test a local RPC Service without testing the underlying socket implementation.
54
+ # Call a local RPC service to test responses and behavior based on the
55
+ # given request (without testing the underlying socket implementation).
56
56
  #
57
57
  # @example Test a local service method
58
58
  # # Implementation
@@ -118,22 +118,80 @@ module Protobuf
118
118
  # @param [Symbol, String] method a symbol or string denoting the method to call.
119
119
  # @param [Protobuf::Message or Hash] request the request message of the expected type for the given method.
120
120
  # @return [Protobuf::Message or String] the resulting protobuf message or error string
121
+ #
121
122
  def local_rpc(rpc_method, request)
122
- request_klass = request_class(rpc_method)
123
- request = request_klass.new(request) if request.is_a?(Hash)
123
+ env = rpc_env(rpc_method, request)
124
+ service = subject_service.new(env)
124
125
 
125
- outer_request_params = { :service_name => subject_service.to_s,
126
- :method_name => rpc_method.to_s,
127
- :request_proto => request.serialize_to_string }
126
+ yield(service) if block_given?
128
127
 
129
- outer_request = ::Protobuf::Socketrpc::Request.new(outer_request_params)
130
- dispatcher = ::Protobuf::Rpc::ServiceDispatcher.new(outer_request)
128
+ # Dispatch the RPC method invoking all of the filters
129
+ service.callable_rpc_method(rpc_method).call
130
+ service.response
131
+ end
131
132
 
132
- yield(dispatcher.service) if block_given?
133
+ # Make an RPC call invoking the entire middleware stack (without testing
134
+ # the underlying socket implementation). Works the same as `local_rpc`, but
135
+ # invokes the entire RPC middleware stack.
136
+ #
137
+ # @example Test an RPC method
138
+ #
139
+ # it "returns a user" do
140
+ # response = rpc(:find, request)
141
+ # response.should eq user
142
+ # end
143
+ #
144
+ # @param [Symbol, String] method a symbol or string denoting the method to call.
145
+ # @param [Protobuf::Message or Hash] request the request message of the expected type for the given method.
146
+ # @return [Protobuf::Message or Protobuf::Rpc::PbError] the resulting Protobuf message or RPC error.
147
+ #
148
+ def rpc(rpc_method, request)
149
+ request_wrapper = wrapped_request(rpc_method, request)
133
150
 
134
- dispatcher.invoke!
151
+ env = ::Protobuf::Rpc::Env.new('encoded_request' => request_wrapper.encode)
152
+ env = ::Protobuf::Rpc.middleware.call(env)
153
+
154
+ env.response
135
155
  end
136
156
 
157
+ # Initialize a new RPC env object simulating what happens in the middleware stack.
158
+ # Useful for testing a service class directly without using `rpc` or `local_rpc`.
159
+ #
160
+ # @example Test an RPC method on the service directly
161
+ #
162
+ # describe "#create" do
163
+ # # Initialize request and response
164
+ # # ...
165
+ # let(:env) { rpc_env(:create, request) }
166
+ #
167
+ # subject { described_class.new(env) }
168
+ #
169
+ # it "creates a user" do
170
+ # subject.create
171
+ # subject.response.should eq response
172
+ # end
173
+ # end
174
+ #
175
+ # @param [Symbol, String] method a symbol or string denoting the method to call.
176
+ # @param [Protobuf::Message or Hash] request the request message of the expected type for the given method.
177
+ # @return [Protobuf::Rpc::Env] the environment derived from an RPC request.
178
+ #
179
+ def rpc_env(rpc_method, request)
180
+ request = request_class(rpc_method).new(request) if request.is_a?(Hash)
181
+
182
+ ::Protobuf::Rpc::Env.new(
183
+ 'caller' => 'protobuf-rspec',
184
+ 'service_name' => subject_service.to_s,
185
+ 'method_name' => rpc_method.to_s,
186
+ 'request' => request,
187
+ 'request_type' => request_class(rpc_method),
188
+ 'response_type' => response_class(rpc_method),
189
+ 'rpc_method' => subject_service.rpcs[rpc_method],
190
+ 'rpc_service' => subject_service
191
+ )
192
+ end
193
+ alias_method :env_for_request, :rpc_env
194
+
137
195
  # Create a mock service that responds in the way you are expecting to aid in testing client -> service calls.
138
196
  # In order to test your success callback you should provide a :response object. Similarly, to test your failure
139
197
  # callback you should provide an :error object.
@@ -228,6 +286,7 @@ module Protobuf
228
286
  # @param [Hash] callbacks provides expectation objects to invoke on_success (with :response), on_failure (with :error), and the request object (:request)
229
287
  # @param [Block] optional. When given, will be invoked with the request message sent to the client method
230
288
  # @return [Mock] the stubbed out client mock
289
+ #
231
290
  def mock_rpc(klass, method, callbacks = {})
232
291
  client = double('Client', :on_success => true, :on_failure => true)
233
292
  client.stub(method).and_yield(client)
@@ -275,6 +334,24 @@ module Protobuf
275
334
  def response_class(endpoint)
276
335
  subject_service.rpcs[endpoint].response_type
277
336
  end
337
+
338
+ # Returns the request wrapper that is encoded and sent over the wire when calling
339
+ # an RPC method with the given request
340
+ #
341
+ # @param [Symbol, String] method a symbol or string denoting the method to call.
342
+ # @param [Protobuf::Message or Hash] request the request message of the expected type for the given method.
343
+ # @return [Protobuf::Socketrpc::Request] the wrapper used to transmit RPC requests.
344
+ #
345
+ def wrapped_request(rpc_method, request)
346
+ request = request_class(rpc_method).new(request) if request.is_a?(Hash)
347
+
348
+ ::Protobuf::Socketrpc::Request.new(
349
+ :service_name => subject_service.to_s,
350
+ :method_name => rpc_method.to_s,
351
+ :request_proto => request.encode,
352
+ :caller => 'protobuf-rspec'
353
+ )
354
+ end
278
355
  end
279
356
  end
280
357
  end
@@ -1,5 +1,5 @@
1
1
  module Protobuf
2
2
  module RSpec
3
- VERSION = "0.2.3"
3
+ VERSION = "1.0.0.rc1"
4
4
  end
5
5
  end
@@ -5,8 +5,8 @@ require "protobuf/rspec/version"
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "protobuf-rspec"
7
7
  s.version = Protobuf::RSpec::VERSION
8
- s.authors = ["BJ Neilsen"]
9
- s.email = ["bj.neilsen@gmail.com"]
8
+ s.authors = ["BJ Neilsen", "Adam Hutchison"]
9
+ s.email = ["bj.neilsen@gmail.com", "liveh2o@gmail.com"]
10
10
  s.homepage = "http://github.com/localshred/protobuf-rspec"
11
11
  s.summary = %q{Protobuf RSpec helpers for testing services and clients. Meant to be used with the protobuf gem. Decouple external services/clients from each other using the given helper methods.}
12
12
  s.description = s.summary
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
- s.add_runtime_dependency "protobuf", ">= 2.0"
21
+ s.add_runtime_dependency "protobuf", ">= 3.0.0.rc1"
22
22
  s.add_runtime_dependency "rspec", "~> 2.8"
23
23
 
24
24
  s.add_development_dependency "rake"
metadata CHANGED
@@ -1,76 +1,92 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: protobuf-rspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
5
- prerelease:
4
+ version: 1.0.0.rc1
6
5
  platform: ruby
7
6
  authors:
8
7
  - BJ Neilsen
8
+ - Adam Hutchison
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-20 00:00:00.000000000Z
12
+ date: 2014-02-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: protobuf
16
- requirement: &2152903460 !ruby/object:Gem::Requirement
17
- none: false
16
+ requirement: !ruby/object:Gem::Requirement
18
17
  requirements:
19
- - - ! '>='
18
+ - - '>='
20
19
  - !ruby/object:Gem::Version
21
- version: '2.0'
20
+ version: 3.0.0.rc1
22
21
  type: :runtime
23
22
  prerelease: false
24
- version_requirements: *2152903460
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - '>='
26
+ - !ruby/object:Gem::Version
27
+ version: 3.0.0.rc1
25
28
  - !ruby/object:Gem::Dependency
26
29
  name: rspec
27
- requirement: &2152902320 !ruby/object:Gem::Requirement
28
- none: false
30
+ requirement: !ruby/object:Gem::Requirement
29
31
  requirements:
30
32
  - - ~>
31
33
  - !ruby/object:Gem::Version
32
34
  version: '2.8'
33
35
  type: :runtime
34
36
  prerelease: false
35
- version_requirements: *2152902320
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ version: '2.8'
36
42
  - !ruby/object:Gem::Dependency
37
43
  name: rake
38
- requirement: &2152900400 !ruby/object:Gem::Requirement
39
- none: false
44
+ requirement: !ruby/object:Gem::Requirement
40
45
  requirements:
41
- - - ! '>='
46
+ - - '>='
42
47
  - !ruby/object:Gem::Version
43
48
  version: '0'
44
49
  type: :development
45
50
  prerelease: false
46
- version_requirements: *2152900400
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
47
56
  - !ruby/object:Gem::Dependency
48
57
  name: yard
49
- requirement: &2152899620 !ruby/object:Gem::Requirement
50
- none: false
58
+ requirement: !ruby/object:Gem::Requirement
51
59
  requirements:
52
60
  - - ~>
53
61
  - !ruby/object:Gem::Version
54
62
  version: '0.7'
55
63
  type: :development
56
64
  prerelease: false
57
- version_requirements: *2152899620
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '0.7'
58
70
  - !ruby/object:Gem::Dependency
59
71
  name: redcarpet
60
- requirement: &2152898740 !ruby/object:Gem::Requirement
61
- none: false
72
+ requirement: !ruby/object:Gem::Requirement
62
73
  requirements:
63
74
  - - ~>
64
75
  - !ruby/object:Gem::Version
65
76
  version: '2.1'
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *2152898740
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ~>
82
+ - !ruby/object:Gem::Version
83
+ version: '2.1'
69
84
  description: Protobuf RSpec helpers for testing services and clients. Meant to be
70
85
  used with the protobuf gem. Decouple external services/clients from each other using
71
86
  the given helper methods.
72
87
  email:
73
88
  - bj.neilsen@gmail.com
89
+ - liveh2o@gmail.com
74
90
  executables: []
75
91
  extensions: []
76
92
  extra_rdoc_files: []
@@ -85,33 +101,26 @@ files:
85
101
  - protobuf-rspec.gemspec
86
102
  homepage: http://github.com/localshred/protobuf-rspec
87
103
  licenses: []
104
+ metadata: {}
88
105
  post_install_message:
89
106
  rdoc_options: []
90
107
  require_paths:
91
108
  - lib
92
109
  required_ruby_version: !ruby/object:Gem::Requirement
93
- none: false
94
110
  requirements:
95
- - - ! '>='
111
+ - - '>='
96
112
  - !ruby/object:Gem::Version
97
113
  version: '0'
98
- segments:
99
- - 0
100
- hash: -623885674851921765
101
114
  required_rubygems_version: !ruby/object:Gem::Requirement
102
- none: false
103
115
  requirements:
104
- - - ! '>='
116
+ - - '>'
105
117
  - !ruby/object:Gem::Version
106
- version: '0'
107
- segments:
108
- - 0
109
- hash: -623885674851921765
118
+ version: 1.3.1
110
119
  requirements: []
111
120
  rubyforge_project: protobuf-rspec
112
- rubygems_version: 1.8.15
121
+ rubygems_version: 2.1.2
113
122
  signing_key:
114
- specification_version: 3
123
+ specification_version: 4
115
124
  summary: Protobuf RSpec helpers for testing services and clients. Meant to be used
116
125
  with the protobuf gem. Decouple external services/clients from each other using
117
126
  the given helper methods.