pwwka 0.1.0 → 0.2.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
  SHA1:
3
- metadata.gz: 8cf3c8a949bbd8b4d824a31484de0349a16c79d9
4
- data.tar.gz: 0f53407b75ed79d8cbd3d85cd5945e2a988edeba
3
+ metadata.gz: d40cdf7ab32f4a3731ecba95fd75c16cca7c4c70
4
+ data.tar.gz: cfa26d01c9484c309b45d27f09c40a7390d1e10c
5
5
  SHA512:
6
- metadata.gz: 570f563f482b9992a0e9d55d8206ac74484d49ecfbc0d3b01d3819f5616f714b7e5f0203f21700a4b0011f6507daf06bc70dad7753a718430e51c99603f08b2d
7
- data.tar.gz: 87786f3b94d21352bc2148708514eb8558d61edb3cfc80037a271ca8c69c50e9eb61fc5d22a3d2676615917469c5e1bacea5528243a2bd39315ea59317eaa2a1
6
+ metadata.gz: addff24275e10692962c599fdb04bc5d9536e22abea010ba18d95f5b9dcb168215e376aae0c49408a8273e361066b8979db0b10100e317271292ba399387d090
7
+ data.tar.gz: f387dad318f3cf12262313ebfc7432cc8fe606d758c207f05453a32bcc4f9c7cd3f10c665bf72ae7e7951b3c6f61d8cbffc40f8e1b2d83f85b5d6b506e1e610a
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pwwka (0.1.0)
4
+ pwwka (0.2.0)
5
5
  activemodel
6
6
  activesupport
7
7
  bunny
data/README.md CHANGED
@@ -39,11 +39,11 @@ And follow the instructions.
39
39
  Add to your `Gemfile`:
40
40
 
41
41
  ```ruby
42
- gem 'pwwka', require: false, git: 'https://github.com/stitchfix/pwwka.git'
42
+ gem 'pwwka'
43
43
  ```
44
44
 
45
45
 
46
- ### Set up your message_handler configration
46
+ ### Set up your pwwka configration
47
47
 
48
48
  Connect to your RabbitMQ instance using the url and choose a name for your
49
49
  topic exchange.
@@ -109,7 +109,7 @@ message_handler: rake message_handler:receive HANDLER_KLASS=ClientIndexMessageHa
109
109
  You'll also need to bring the Rake task into your app. For Rails, you'll need to edit the top-level `Rakefile`:
110
110
 
111
111
  ```ruby
112
- require 'stitch_fix/message_handler/tasks'
112
+ require 'pwwka/tasks'
113
113
  ```
114
114
 
115
115
  ### Queues - what messages will your queue receive
@@ -177,7 +177,47 @@ RabbitMQ has a web interface for checking out the health of connections, channel
177
177
  ![RabbitMQ Management 3](docs/images/RabbitMQ_Management-3.png)
178
178
 
179
179
  ## Testing
180
- The message_handler gem has tests for all its functionality so app testing is best done with expectations. However, if you want to test the message bus end-to-end in your app you can use some helpers in `lib/stitch_fix/message_handler/test_handler.rb`. See the gem specs for examples of how to use them.
180
+
181
+ This gem has test coverage of interacting with RabbitMQ, so for unit tests, your best
182
+ strategy is to simply mock calls to `Pwwka::Transmitter`.
183
+
184
+ For integration tests, however, you can examine the actual message bus by setting up
185
+ the provided `Pwwka::TestHandler` like so:
186
+
187
+ ```ruby
188
+ require 'pwwka/test_handler'
189
+
190
+ describe "my integration test" do
191
+
192
+ before(:all) do
193
+ @test_handler = Pwwka::TestHandler.new
194
+ @test_handler.test_setup
195
+ end
196
+
197
+ after(:all) do
198
+ # this clears out any messages, so you have a clean test environment next time
199
+ @test_handler.test_teardown
200
+ end
201
+
202
+ it "uses the message bus" do
203
+ post "/items", item: { size: "L" }
204
+
205
+ message = @test_handler.pop_message
206
+
207
+ expect(message.delivery_info.routing_key).to eq("my-company.items.created")
208
+ expect(message.payload).to eq({ item: { id: 42, size: "L" } })
209
+ end
210
+
211
+ it "can splat the values as well" do
212
+ post "/items", item: { size: "L" }
213
+
214
+ delivery_info, payload = @test_handler.pop_message
215
+
216
+ expect(delivery_info.routing_key).to eq("my-company.items.created")
217
+ expect(payload).to eq({ item: { id: 42, size: "L" } })
218
+ end
219
+ end
220
+ ```
181
221
 
182
222
  ## TODO
183
223
  * automated monitoring
@@ -1,4 +1,12 @@
1
1
  module Pwwka
2
+ # A handler you can use to examine messages your app sends during tests.
3
+ #
4
+ # To use this:
5
+ #
6
+ # 1. Create an instance and arrange for `test_setup` to be called when
7
+ # your tests are being setup (e.g.`def setup` or `before`)
8
+ # 2. Arrange for `test_teardown` to be called during teardown of your tests
9
+ # 3. Use the method `pop_message` to examine the message on the queue
2
10
  class TestHandler
3
11
 
4
12
  attr_reader :channel_connector
@@ -21,19 +29,35 @@ module Pwwka
21
29
  def test_queue
22
30
  @test_queue ||= begin
23
31
  test_queue = channel.queue("test-queue", durable: true)
24
- test_queue.bind(topic_exchange, routing_key: "*.*")
32
+ test_queue.bind(topic_exchange, routing_key: "#.#")
25
33
  test_queue
26
34
  end
27
35
  end
28
36
 
37
+ # Get the message on the queue as TestHandler::Message.
38
+ def pop_message
39
+ delivery_info, properties, payload = test_queue.pop
40
+ Message.new(delivery_info,
41
+ properties,
42
+ payload)
43
+ end
44
+
29
45
  def get_topic_message_payload_for_tests
30
- delivery_info, properties, payload = test_queue.pop
31
- JSON.parse(payload)
46
+ deprecated!(:get_topic_message_payload_for_tests,
47
+ "Use `pop_message.payload` instead")
48
+ pop_message.payload
32
49
  end
33
50
 
34
51
  def get_topic_message_properties_for_tests
35
- delivery_info, properties, payload = test_queue.pop
36
- properties
52
+ deprecated!(:get_topic_message_properties_for_tests,
53
+ "Use `pop_message.properties` instead")
54
+ pop_message.properties
55
+ end
56
+
57
+ def get_topic_message_delivery_info_for_tests
58
+ deprecated!(:get_topic_message_delivery_info_for_tests,
59
+ "Use `pop_message.delivery_info` instead")
60
+ pop_message.delivery_info
37
61
  end
38
62
 
39
63
  def purge_test_queue
@@ -46,5 +70,33 @@ module Pwwka
46
70
  channel_connector.connection_close
47
71
  end
48
72
 
73
+ # Simple class to hold a popped message.
74
+ #
75
+ # You can either access the message contents directly, or splat
76
+ # it for the most commonly-needed aspects:
77
+ #
78
+ # delivery_info, payload = @test_handler.pop_message
79
+ class Message
80
+ attr_reader :delivery_info, :properties, :payload
81
+ def initialize(delivery_info, properties, payload)
82
+ @delivery_info = delivery_info
83
+ @properties = properties
84
+ @raw_payload = payload
85
+ @payload = JSON.parse(@raw_payload)
86
+ end
87
+
88
+ # Returns the delivery_info, payload, properties, and raw_payload for splat
89
+ # magic.
90
+ def to_ary
91
+ [@delivery_info,@payload,@properties,@raw_payload]
92
+ end
93
+ end
94
+
95
+ private
96
+
97
+ def deprecated!(method,message)
98
+ warn "#{method} is deprecated: #{message}"
99
+ end
100
+
49
101
  end
50
102
  end
@@ -1,3 +1,3 @@
1
1
  module Pwwka
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -10,15 +10,24 @@ describe Pwwka::Transmitter do
10
10
  after(:all) { @test_handler.test_teardown }
11
11
 
12
12
  let(:payload) { Hash[:this, "that"] }
13
- let(:routing_key) { "this.that" }
13
+ let(:routing_key) { "this.that.and.theother" }
14
14
 
15
15
  describe "#send_message!" do
16
16
 
17
- it "should send the correct payload" do
18
- success = Pwwka::Transmitter.new.send_message!(payload, routing_key)
19
- expect(success).to be_truthy
20
- received_payload = @test_handler.get_topic_message_payload_for_tests
21
- expect(received_payload["this"]).to eq("that")
17
+ context "happy path" do
18
+ it "should send the correct payload" do
19
+ success = Pwwka::Transmitter.new.send_message!(payload, routing_key)
20
+ expect(success).to be_truthy
21
+ received_payload = @test_handler.pop_message.payload
22
+ expect(received_payload["this"]).to eq("that")
23
+ end
24
+
25
+ it "should delivery on the expected routing key" do
26
+ success = Pwwka::Transmitter.new.send_message!(payload, routing_key)
27
+ expect(success).to be_truthy
28
+ delivery_info = @test_handler.pop_message.delivery_info
29
+ expect(delivery_info.routing_key).to eq(routing_key)
30
+ end
22
31
  end
23
32
 
24
33
  it "should blow up if exception raised" do
@@ -34,7 +43,7 @@ describe Pwwka::Transmitter do
34
43
 
35
44
  it "should send the correct payload" do
36
45
  Pwwka::Transmitter.send_message!(payload, routing_key)
37
- received_payload = @test_handler.get_topic_message_payload_for_tests
46
+ received_payload = @test_handler.pop_message.payload
38
47
  expect(received_payload["this"]).to eq("that")
39
48
  end
40
49
 
@@ -51,7 +60,7 @@ describe Pwwka::Transmitter do
51
60
 
52
61
  it "should send the correct payload" do
53
62
  Pwwka::Transmitter.send_message_safely(payload, routing_key)
54
- received_payload = @test_handler.get_topic_message_payload_for_tests
63
+ received_payload = @test_handler.pop_message.payload
55
64
  expect(received_payload["this"]).to eq("that")
56
65
  end
57
66
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwwka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stitch Fix Engineering
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-21 00:00:00.000000000 Z
11
+ date: 2014-09-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bunny