receptor_controller-client 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,169 @@
1
+ require "receptor_controller/client/response_worker"
2
+
3
+ RSpec.describe ReceptorController::Client::ResponseWorker do
4
+ let(:receiver) { double('receiver') }
5
+ let(:logger) { double('logger') }
6
+ let(:config) { double('config') }
7
+
8
+ subject { described_class.new(config, logger) }
9
+
10
+ before do
11
+ allow(logger).to receive_messages(%i[debug info warn error fatal])
12
+ allow(config).to receive_messages(:queue_auto_ack => false, :response_timeout => 0, :response_timeout_poll_time => 0)
13
+ end
14
+
15
+ describe "#register_message" do
16
+ it "saves callback with message id" do
17
+ msg_id = '1'
18
+
19
+ subject.register_message(msg_id, receiver)
20
+
21
+ expect(subject.send(:registered_messages)[msg_id]).to match(hash_including(:receiver => receiver))
22
+ end
23
+ end
24
+
25
+ describe "#process_message" do
26
+ let(:message) { double('message') }
27
+ let(:message_id) { '1234' }
28
+ let(:response_body) { 'Test response' }
29
+ let(:payload) { {} }
30
+ let(:receiver) { double('receiver') }
31
+
32
+ before do
33
+ allow(message).to receive(:payload).and_return(payload.to_json)
34
+
35
+ allow(receiver).to receive_messages(:success => nil, :timeout => nil, :error => nil)
36
+
37
+ subject.register_message(message_id, receiver, :response_callback => :success, :timeout_callback => :timeout, :error_callback => :error)
38
+ end
39
+
40
+ context "with message auto_ack => false" do
41
+ before do
42
+ expect(message).to receive(:ack)
43
+ end
44
+
45
+ context "receives successful response" do
46
+ let(:payload) { {'code' => 0, 'in_response_to' => message_id, 'message_type' => 'response', 'payload' => response_body} }
47
+
48
+ it "and calls response_callback " do
49
+ expect(receiver).to receive(:success).with(message_id, payload['message_type'], payload['payload'])
50
+
51
+ subject.send(:process_message, message)
52
+ end
53
+
54
+ it "resets last_checked_at timestamp" do
55
+ callbacks = subject.send(:registered_messages)[message_id]
56
+ registered_at = callbacks[:last_checked_at]
57
+
58
+ subject.send(:process_message, message)
59
+ expect(callbacks[:last_checked_at] > registered_at)
60
+ end
61
+ end
62
+
63
+ context "receives error response" do
64
+ let(:payload) { {'code' => 1, 'in_response_to' => message_id, 'message_type' => 'response', 'payload' => response_body} }
65
+
66
+ it "and calls response_error" do
67
+ expect(receiver).to receive(:error).with(message_id, payload['code'], payload['payload'])
68
+
69
+ subject.send(:process_message, message)
70
+ end
71
+
72
+ it "resets last_checked_at timestamp" do
73
+ callbacks = subject.send(:registered_messages)[message_id]
74
+ registered_at = callbacks[:last_checked_at]
75
+
76
+ subject.send(:process_message, message)
77
+ expect(callbacks[:last_checked_at] > registered_at)
78
+ end
79
+ end
80
+
81
+ context "receives invalid message" do
82
+ let(:payload) { 'Wrong message' }
83
+ before do
84
+ allow(message).to receive(:payload).and_return(payload)
85
+ # disables gzip check
86
+ allow(subject).to receive(:unpack_payload).and_return(payload)
87
+ end
88
+
89
+ it "logs error" do
90
+ expect(logger).to receive(:error).with(/Receptor response: Failed to parse Kafka response/)
91
+
92
+ subject.send(:process_message, message)
93
+ end
94
+ end
95
+
96
+ context "receives response without ID" do
97
+ let(:payload) { {'code' => 0, 'message_type' => 'response', 'payload' => response_body} }
98
+
99
+ it "logs error" do
100
+ expect(logger).to receive(:error).with(/Receptor response: Message id \(in_response_to\) not received!/)
101
+
102
+ subject.send(:process_message, message)
103
+ end
104
+ end
105
+
106
+ context "receives unregistered response" do
107
+ let(:payload) { {'code' => 0, 'in_response_to' => '9876', 'message_type' => 'response', 'payload' => response_body} }
108
+
109
+ it "does nothing" do
110
+ expect(logger).not_to receive(:error)
111
+ %i[success error timeout].each do |callback|
112
+ expect(receiver).not_to receive(callback)
113
+ end
114
+
115
+ subject.send(:process_message, message)
116
+ end
117
+ end
118
+
119
+ context "receives gzip compressed response" do
120
+ let(:original_response_body) { {'status' => 200, 'body' => {'count' => 0, 'results' => []}} }
121
+ let(:response_body) { Base64.encode64(::Zlib.gzip(original_response_body.to_json)) }
122
+ let(:payload) { {'code' => 0, 'in_response_to' => message_id, 'message_type' => 'response', 'payload' => response_body} }
123
+
124
+ it "calls response callback" do
125
+ expect(subject).to receive(:gzipped?).and_call_original
126
+ expect(subject).to receive(:unpack_payload).and_call_original
127
+
128
+ expect(receiver).to receive(:success).with(message_id, payload['message_type'], original_response_body)
129
+
130
+ subject.send(:process_message, message)
131
+ end
132
+ end
133
+ end
134
+
135
+ context "with message auto_ack => true" do
136
+ before do
137
+ allow(config).to receive(:queue_auto_ack).and_return(true)
138
+ expect(message).not_to receive(:ack)
139
+ end
140
+
141
+ let(:payload) { {'code' => 0, 'in_response_to' => message_id, 'message_type' => 'response', 'payload' => response_body} }
142
+
143
+ it "doesn't call ack on message" do
144
+ subject.send(:process_message, message)
145
+ end
146
+ end
147
+ end
148
+
149
+ describe "#check_timeouts" do
150
+ let(:message_id) { '1234' }
151
+ let(:receiver) { double('receiver') }
152
+
153
+ before do
154
+ allow(receiver).to receive(:timeout) do
155
+ subject.send(:started).value = false
156
+ end
157
+
158
+ subject.register_message(message_id, receiver, :response_callback => :success, :timeout_callback => :timeout, :error_callback => :error)
159
+ end
160
+
161
+ it "calls timeout callback if message found" do
162
+ subject.send(:started).value = true
163
+
164
+ expect(receiver).to receive(:timeout)
165
+
166
+ subject.send(:check_timeouts)
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,19 @@
1
+ require "bundler/setup"
2
+
3
+ if ENV['CI']
4
+ require 'simplecov'
5
+ SimpleCov.start
6
+ end
7
+
8
+ require "rspec"
9
+ require "webmock/rspec"
10
+ require "receptor_controller-client"
11
+
12
+ RSpec.configure do |config|
13
+ # Disable RSpec exposing methods globally on `Module` and `main`
14
+ config.disable_monkey_patching!
15
+
16
+ config.expect_with :rspec do |c|
17
+ c.syntax = :expect
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,268 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: receptor_controller-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Martin Slemr
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-07-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 5.2.4.3
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 5.2.4.3
27
+ - !ruby/object:Gem::Dependency
28
+ name: concurrent-ruby
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.1'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 1.1.6
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '1.1'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.1.6
47
+ - !ruby/object:Gem::Dependency
48
+ name: faraday
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: json
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 2.3.0
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '2.3'
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: 2.3.0
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '2.3'
81
+ - !ruby/object:Gem::Dependency
82
+ name: manageiq-loggers
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: 0.5.0
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: 0.5.0
95
+ - !ruby/object:Gem::Dependency
96
+ name: manageiq-messaging
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: 0.1.5
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: 0.1.5
109
+ - !ruby/object:Gem::Dependency
110
+ name: bundler
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '2.0'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '2.0'
123
+ - !ruby/object:Gem::Dependency
124
+ name: rake
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: 12.3.3
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: 12.3.3
137
+ - !ruby/object:Gem::Dependency
138
+ name: rspec
139
+ requirement: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: 3.6.0
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: '3.6'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: 3.6.0
154
+ - - "~>"
155
+ - !ruby/object:Gem::Version
156
+ version: '3.6'
157
+ - !ruby/object:Gem::Dependency
158
+ name: rubocop
159
+ requirement: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - "~>"
162
+ - !ruby/object:Gem::Version
163
+ version: 0.69.0
164
+ type: :development
165
+ prerelease: false
166
+ version_requirements: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - "~>"
169
+ - !ruby/object:Gem::Version
170
+ version: 0.69.0
171
+ - !ruby/object:Gem::Dependency
172
+ name: rubocop-performance
173
+ requirement: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - "~>"
176
+ - !ruby/object:Gem::Version
177
+ version: '1.3'
178
+ type: :development
179
+ prerelease: false
180
+ version_requirements: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - "~>"
183
+ - !ruby/object:Gem::Version
184
+ version: '1.3'
185
+ - !ruby/object:Gem::Dependency
186
+ name: simplecov
187
+ requirement: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - "~>"
190
+ - !ruby/object:Gem::Version
191
+ version: 0.17.1
192
+ type: :development
193
+ prerelease: false
194
+ version_requirements: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - "~>"
197
+ - !ruby/object:Gem::Version
198
+ version: 0.17.1
199
+ - !ruby/object:Gem::Dependency
200
+ name: webmock
201
+ requirement: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ type: :development
207
+ prerelease: false
208
+ version_requirements: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: '0'
213
+ description: Client for communication with Platform Receptor Controller
214
+ email:
215
+ - mslemr@redhat.com
216
+ executables: []
217
+ extensions: []
218
+ extra_rdoc_files: []
219
+ files:
220
+ - CHANGELOG.md
221
+ - Gemfile
222
+ - LICENSE.txt
223
+ - README.md
224
+ - Rakefile
225
+ - lib/receptor_controller-client.rb
226
+ - lib/receptor_controller/client.rb
227
+ - lib/receptor_controller/client/configuration.rb
228
+ - lib/receptor_controller/client/directive.rb
229
+ - lib/receptor_controller/client/directive_blocking.rb
230
+ - lib/receptor_controller/client/directive_non_blocking.rb
231
+ - lib/receptor_controller/client/exception.rb
232
+ - lib/receptor_controller/client/response_worker.rb
233
+ - lib/receptor_controller/client/version.rb
234
+ - receptor_controller-client.gemspec
235
+ - spec/receptor_controller/client_spec.rb
236
+ - spec/receptor_controller/directive_blocking_spec.rb
237
+ - spec/receptor_controller/directive_non_blocking_spec.rb
238
+ - spec/receptor_controller/response_worker_spec.rb
239
+ - spec/spec_helper.rb
240
+ homepage: https://github.com/RedHatInsights/receptor_controller-client-ruby
241
+ licenses:
242
+ - Apache-2.0
243
+ metadata: {}
244
+ post_install_message:
245
+ rdoc_options: []
246
+ require_paths:
247
+ - lib
248
+ required_ruby_version: !ruby/object:Gem::Requirement
249
+ requirements:
250
+ - - ">="
251
+ - !ruby/object:Gem::Version
252
+ version: '2.5'
253
+ required_rubygems_version: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">="
256
+ - !ruby/object:Gem::Version
257
+ version: '0'
258
+ requirements: []
259
+ rubygems_version: 3.0.3
260
+ signing_key:
261
+ specification_version: 4
262
+ summary: Client for communication with Platform Receptor Controller - Gem
263
+ test_files:
264
+ - spec/receptor_controller/directive_blocking_spec.rb
265
+ - spec/receptor_controller/response_worker_spec.rb
266
+ - spec/receptor_controller/client_spec.rb
267
+ - spec/receptor_controller/directive_non_blocking_spec.rb
268
+ - spec/spec_helper.rb