receptor_controller-client 0.0.2

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,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