fastly_nsq 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.github/PULL_REQUEST_TEMPLATE.md +6 -3
  3. data/.travis.yml +1 -1
  4. data/README.md +23 -73
  5. data/env_configuration_for_local_gem_tests.yml +0 -1
  6. data/examples/.sample.env +0 -2
  7. data/examples/Rakefile +20 -67
  8. data/lib/fastly_nsq/{message_queue/consumer.rb → consumer.rb} +8 -8
  9. data/lib/fastly_nsq/fake_backend.rb +100 -0
  10. data/lib/fastly_nsq/listener.rb +59 -0
  11. data/lib/fastly_nsq/message.rb +18 -0
  12. data/lib/fastly_nsq/{message_queue/producer.rb → producer.rb} +8 -8
  13. data/lib/fastly_nsq/rake_task.rb +39 -43
  14. data/lib/fastly_nsq/ssl_context.rb +35 -33
  15. data/lib/fastly_nsq/strategy.rb +38 -0
  16. data/lib/fastly_nsq/version.rb +1 -1
  17. data/lib/fastly_nsq.rb +21 -1
  18. data/spec/lib/fastly_nsq/consumer_spec.rb +68 -0
  19. data/spec/lib/fastly_nsq/{fake_message_queue_spec.rb → fake_backend_spec.rb} +23 -23
  20. data/spec/lib/fastly_nsq/listener_spec.rb +116 -0
  21. data/spec/lib/fastly_nsq/message_spec.rb +24 -0
  22. data/spec/lib/fastly_nsq/producer_spec.rb +56 -0
  23. data/spec/lib/fastly_nsq/rake_task_spec.rb +87 -74
  24. data/spec/lib/fastly_nsq/ssl_context_spec.rb +6 -6
  25. data/spec/lib/fastly_nsq/{message_queue/strategy_spec.rb → strategy_spec.rb} +6 -5
  26. data/spec/lib/fastly_nsq_spec.rb +18 -0
  27. data/spec/spec_helper.rb +1 -6
  28. metadata +15 -16
  29. data/lib/fastly_nsq/fake_message_queue.rb +0 -98
  30. data/lib/fastly_nsq/message_queue/listener.rb +0 -49
  31. data/lib/fastly_nsq/message_queue/strategy.rb +0 -34
  32. data/lib/fastly_nsq/message_queue.rb +0 -21
  33. data/lib/fastly_nsq/sample_message_processor.rb +0 -50
  34. data/spec/lib/fastly_nsq/message_queue/consumer_spec.rb +0 -60
  35. data/spec/lib/fastly_nsq/message_queue/listener_spec.rb +0 -90
  36. data/spec/lib/fastly_nsq/message_queue/producer_spec.rb +0 -49
  37. data/spec/lib/fastly_nsq/message_queue_spec.rb +0 -32
  38. data/spec/lib/fastly_nsq/sample_message_processor_spec.rb +0 -38
@@ -1,60 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe MessageQueue::Consumer do
4
- let(:channel) { 'star_killer_base' }
5
- let(:topic) { 'death_star' }
6
- let(:consumer) { MessageQueue::Consumer.new topic: topic, channel: channel }
7
- let(:backend) { double 'Consumer' }
8
-
9
- describe 'when the ENV is set incorrectly' do
10
- it 'raises with a helpful error' do
11
- allow(ENV).to receive(:[]).with('FAKE_QUEUE').and_return('taco')
12
-
13
- expect { consumer.terminate }.to raise_error(InvalidParameterError)
14
- end
15
- end
16
-
17
- describe 'when connector connects to a backend Consumer' do
18
- let(:consumer) do
19
- MessageQueue::Consumer.new topic: topic, channel: channel, connector: ->(_) { backend }
20
- end
21
-
22
- it 'forwards #pop' do
23
- expect(backend).to receive(:pop)
24
- consumer.pop
25
- end
26
-
27
- it 'forwards #pop_without_blocking' do
28
- expect(backend).to receive(:pop_without_blocking)
29
- consumer.pop_without_blocking
30
- end
31
-
32
- it 'forwards #size' do
33
- expect(backend).to receive(:size)
34
- consumer.size
35
- end
36
-
37
- it 'forwards #terminate' do
38
- expect(backend).to receive(:terminate)
39
- consumer.terminate
40
- end
41
- end
42
-
43
- describe 'using the default connector' do
44
- module TestStrategy
45
- module Consumer
46
- def self.new(*_); end
47
- end
48
- end
49
-
50
- before do
51
- allow(MessageQueue).to receive(:strategy).and_return(TestStrategy)
52
- end
53
-
54
- it 'instantiates a consumer via Strategy' do
55
- allow(backend).to receive(:terminate)
56
- expect(TestStrategy::Consumer).to receive(:new).and_return(backend)
57
- consumer.terminate
58
- end
59
- end
60
- end
@@ -1,90 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe MessageQueue::Listener do
4
- let(:topic) { 'testing_topic' }
5
- let(:channel) { 'testing_channel' }
6
- let(:consumer) { FakeMessageQueue::Consumer.new topic: topic, channel: channel }
7
-
8
- module TestMessageProcessor
9
- @@messages_processed = []
10
- Message = Struct.new(:body, :topic) do
11
- def finish
12
- @did_finish = true
13
- end
14
- end
15
-
16
- def self.call(body, topic)
17
- @@messages_processed.push Message.new(body, topic)
18
- end
19
-
20
- def self.messages_processed
21
- @@messages_processed
22
- end
23
-
24
- def self.clear
25
- @@messages_processed = []
26
- end
27
- end
28
-
29
- let(:listener) do
30
- MessageQueue::Listener.new topic: topic,
31
- channel: channel,
32
- processor: TestMessageProcessor,
33
- consumer: consumer
34
- end
35
-
36
- let(:message) { TestMessageProcessor::Message.new 'this is message body', topic }
37
- let(:messages_processed) { TestMessageProcessor.messages_processed }
38
- let(:expected_message) { TestMessageProcessor::Message.new('this is message body', topic) }
39
- let(:expected_messages) { [expected_message] }
40
-
41
- describe 'instantiating without a consumer' do
42
- it 'instantiates a consumer, passing the topic and channel' do
43
- allow(MessageQueue::Consumer).to receive(:new)
44
-
45
- MessageQueue::Listener.new topic: topic,
46
- channel: channel,
47
- processor: TestMessageProcessor,
48
- consumer: nil
49
-
50
- expect(MessageQueue::Consumer).to have_received(:new).
51
- with(topic: topic, channel: channel)
52
- end
53
- end
54
-
55
- describe 'when processing next message' do
56
- before(:each) { TestMessageProcessor.clear }
57
-
58
- it 'processes the next message' do
59
- allow(consumer).to receive(:pop).and_return(message)
60
- listener.process_next_message
61
-
62
- expect(messages_processed).to eql(expected_messages)
63
- end
64
-
65
- it 'finishes the message' do
66
- allow(consumer).to receive(:pop).and_return(message)
67
- allow(message).to receive(:finish)
68
-
69
- listener.process_next_message
70
-
71
- expect(message).to have_received(:finish).once
72
- end
73
-
74
- context 'when using the fake queue and it is empty', fake_queue: true do
75
- before do
76
- FakeMessageQueue.delay = 0.1
77
- end
78
-
79
- it 'blocks on the process for longer than the check cycle' do
80
- delay = FakeMessageQueue.delay + 0.1
81
-
82
- expect do
83
- Timeout.timeout(delay) do
84
- listener.process_next_message
85
- end
86
- end.to raise_error(Timeout::Error)
87
- end
88
- end
89
- end
90
- end
@@ -1,49 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe MessageQueue::Producer do
4
- let(:topic) { 'death_star' }
5
- let(:producer) { MessageQueue::Producer.new(topic: topic) }
6
- let(:backend) { double 'Producer' }
7
-
8
- describe 'when the ENV is set incorrectly' do
9
- it 'raises with a helpful error' do
10
- allow(ENV).to receive(:[]).with('FAKE_QUEUE').and_return('taco')
11
-
12
- expect { producer.terminate }.to raise_error(InvalidParameterError)
13
- end
14
- end
15
-
16
- describe 'when connector connects to a backend Producer' do
17
- let(:producer) do
18
- MessageQueue::Producer.new topic: topic, connector: ->(_) { backend }
19
- end
20
-
21
- it 'forwards #write' do
22
- expect(backend).to receive(:write).with("it's a message")
23
- producer.write "it's a message"
24
- end
25
-
26
- it 'forwards #terminate' do
27
- expect(backend).to receive(:terminate)
28
- producer.terminate
29
- end
30
- end
31
-
32
- describe 'using the default connector' do
33
- module TestStrategy
34
- module Producer
35
- def self.new(*_); end
36
- end
37
- end
38
-
39
- before do
40
- allow(MessageQueue).to receive(:strategy).and_return(TestStrategy)
41
- end
42
-
43
- it 'instantiates a producer via Strategy' do
44
- allow(backend).to receive(:terminate)
45
- expect(TestStrategy::Producer).to receive(:new).and_return(backend)
46
- producer.terminate
47
- end
48
- end
49
- end
@@ -1,32 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe MessageQueue do
4
- module TestStrategy; end
5
-
6
- it 'allows the logger to be set and retrieved' do
7
- logger = Logger.new(STDOUT)
8
- MessageQueue.logger = logger
9
-
10
- expect(MessageQueue.logger).to eq logger
11
- end
12
-
13
- it 'returns the current Strategy' do
14
- allow(MessageQueue::Strategy).to receive(:for_queue).and_return(TestStrategy)
15
-
16
- expect(MessageQueue.strategy).to eql(TestStrategy)
17
- end
18
-
19
- describe '.logger' do
20
- describe 'when using the fake queue', fake_queue: true do
21
- end
22
-
23
- describe 'when using the real queue, fake_queue: false' do
24
- it 'allows the logger to be set and retrieved' do
25
- logger = Logger.new(STDOUT)
26
- MessageQueue.logger = logger
27
-
28
- expect(MessageQueue.logger).to eq logger
29
- end
30
- end
31
- end
32
- end
@@ -1,38 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe SampleMessageProcessor do
4
- describe '.topics' do
5
- it 'specifies the array of topics to listen to' do
6
- topics = SampleMessageProcessor.topics
7
-
8
- expect(topics).to be_an Array
9
- expect(topics.first).to be_a String
10
- end
11
- end
12
-
13
- describe '#go' do
14
- it 'enqueues the appropriate message processor' do
15
- data = { 'key' => 'value' }
16
- message_body = { 'data' => data }.to_json
17
- allow(HeartbeatWorker).to receive(:perform_async)
18
- topic = 'heartbeat'
19
-
20
- SampleMessageProcessor.new(message_body: message_body, topic: topic).go
21
-
22
- expect(HeartbeatWorker).to have_received(:perform_async).with(data)
23
- end
24
-
25
- describe 'when the message topic is not known' do
26
- it 'uses the null object processor' do
27
- data = { 'sample_key' => 'sample value' }
28
- message_body = { 'data' => data }.to_json
29
- allow(UnknownMessageWorker).to receive(:perform_async)
30
- topic = 'unknown_topic'
31
-
32
- SampleMessageProcessor.new(message_body: message_body, topic: topic).go
33
-
34
- expect(UnknownMessageWorker).to have_received(:perform_async).with(data)
35
- end
36
- end
37
- end
38
- end