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