1 | Freddy = require '../lib/freddy'
|
2 | TestHelper = require './test_helper'
|
3 | q = require 'q'
|
4 |
|
5 | describe 'Freddy', ->
|
6 | logger = TestHelper.logger('warn')
|
7 | msg = {test: 'data'}
|
8 |
|
9 | describe '.connect', ->
|
10 | context 'with correct amqp url', ->
|
11 | it 'can connect to amqp', (done) ->
|
12 | Freddy.connect(TestHelper.amqpUrl, logger).done ->
|
13 | done()
|
14 | , =>
|
15 | done Error("Connection should have succeeded, but failed")
|
16 |
|
17 | context 'with incorrect amqp url', ->
|
18 | it 'cannot connect', (done) ->
|
19 | Freddy.connect('amqp://wrong:wrong@localhost:9000', logger).done ->
|
20 | done(Error("Connection should have failed, but succeeded"))
|
21 | , =>
|
22 | done()
|
23 |
|
24 | context 'when connected', ->
|
25 | beforeEach (done) ->
|
26 | @randomDest = TestHelper.uniqueId()
|
27 | Freddy.connect(TestHelper.amqpUrl, logger).done (@freddy) =>
|
28 | done()
|
29 | , (err) ->
|
30 | done(err)
|
31 |
|
32 | afterEach (done) ->
|
33 | @freddy.shutdown().done ->
|
34 | done()
|
35 |
|
36 | it 'can send and receive messages', (done) ->
|
37 | @freddy.respondTo @randomDest, (receivedMsg, handler) ->
|
38 | expect(receivedMsg).to.eql(msg)
|
39 | done()
|
40 | .done =>
|
41 | @freddy.deliver @randomDest, msg
|
42 |
|
43 | it 'can catch errors', (done) ->
|
44 | myError = new Error('catch me')
|
45 | Freddy.addErrorListener (err) ->
|
46 | err.should.eql(myError)
|
47 | done()
|
48 |
|
49 | @freddy.respondTo @randomDest, (message, msgHandler) ->
|
50 | throw myError
|
51 | .done =>
|
52 | @freddy.deliver @randomDest, {}
|
53 |
|
54 | it 'can handle success messages', (done) ->
|
55 | @freddy.respondTo @randomDest, (payload, handler) ->
|
56 | handler.success(pay: 'load')
|
57 | .done =>
|
58 | @freddy.deliver @randomDest, msg, (response) ->
|
59 | expect(response).to.eql(pay: 'load')
|
60 | done()
|
61 | , (error) ->
|
62 | done(Error('should have got success response'))
|
63 |
|
64 | it 'can handle error messages', (done) ->
|
65 | @freddy.respondTo @randomDest, (payload, handler) ->
|
66 | handler.error(error: 'not today')
|
67 | .done =>
|
68 | @freddy.deliver @randomDest, msg, (response) ->
|
69 | done(Error('should have got a error response'))
|
70 | , (error) ->
|
71 | expect(error).to.eql(error: 'not today')
|
72 | done()
|
73 |
|
74 | it 'requires a error callback when success is specified', (done) ->
|
75 | try
|
76 | @freddy.deliver @randomDest, msg, (response) ->
|
77 | done(Error('should not happen'))
|
78 | catch e
|
79 | expect(e.message).to.eql('error callback is required')
|
80 | done()
|
81 |
|
82 | describe 'when tapping', ->
|
83 | it "doesn't consume message", (done) ->
|
84 | tapPromise = q.defer()
|
85 | respondPromise = q.defer()
|
86 | @freddy.tapInto @randomDest, =>
|
87 | tapPromise.resolve()
|
88 | .then =>
|
89 | @freddy.respondTo @randomDest, =>
|
90 | respondPromise.resolve()
|
91 | .done =>
|
92 | q.all([tapPromise, respondPromise]).then ->
|
93 | done()
|
94 | @freddy.deliver @randomDest, msg
|
95 |
|
96 | context 'with send-and-forget message', ->
|
97 | it 'removes the message from the queue when timeout specified', (done) ->
|
98 | @freddy.consumer.channel.assertQueue(@randomDest, autoDelete: true).then =>
|
99 | @freddy.deliver @randomDest, msg, timeout: 0.01
|
100 |
|
101 | setTimeout =>
|
102 | @freddy.respondTo @randomDest, (payload, handler) ->
|
103 | done(Error('message was still in the queue'))
|
104 | .done =>
|
105 | setTimeout (-> done()), 20
|
106 | , 60
|
107 |
|
108 | it 'keeps the message in the queue when timeout is not specified', (done) ->
|
109 | @freddy.consumer.channel.assertQueue(@randomDest, autoDelete: true).then =>
|
110 | @freddy.deliver @randomDest, msg
|
111 |
|
112 | setTimeout =>
|
113 | @freddy.respondTo @randomDest, (payload, handler) -> done()
|
114 | , 60
|
115 |
|
116 | context 'with request message', ->
|
117 | it 'removes the message from the queue when timeout occurs', (done) ->
|
118 | @freddy.consumer.channel.assertQueue(@randomDest, autoDelete: true).then =>
|
119 | @freddy.deliver @randomDest, msg, timeout: 0.01, (->), (->)
|
120 |
|
121 | setTimeout =>
|
122 | @freddy.respondTo @randomDest, (payload, handler) ->
|
123 | done(Error('message was still in the queue'))
|
124 | .done =>
|
125 | setTimeout (-> done()), 20
|
126 | , 60
|
127 |
|
128 | it 'keeps the message in the queue when deleteOnTimeout is disabled', (done) ->
|
129 | @freddy.consumer.channel.assertQueue(@randomDest, autoDelete: true).then =>
|
130 | @freddy.deliver @randomDest, msg, timeout: 0.01, deleteOnTimeout: false, (->), (->)
|
131 |
|
132 | setTimeout =>
|
133 | @freddy.respondTo @randomDest, (payload, handler) -> done()
|
134 | , 60
|