UNPKG

7.05 kBtext/coffeescriptView Raw
1_ = require 'lodash'
2moment = require 'moment'
3UUID = require 'uuid'
4request = require 'request'
5Server = require '../../src/server'
6Redis = require 'ioredis'
7RedisNS = require '@octoblu/redis-ns'
8{ JobManagerResponder } = require 'meshblu-core-job-manager'
9
10describe 'POST /broadcasts', ->
11 beforeEach (done) ->
12 @responseQueueId = UUID.v4()
13 @requestQueueName = "request:queue:#{@responseQueueId}"
14 @responseQueueName = "response:queue:#{@responseQueueId}"
15 @namespace = 'test:meshblu-http'
16 @jobLogQueue = 'test:meshblu:job-log'
17 @redisUri = 'redis://localhost'
18 @port = 0xd00d
19 @sut = new Server {
20 @port
21 disableLogging: true
22 jobTimeoutSeconds: 1
23 @namespace
24 @jobLogQueue
25 jobLogRedisUri: @redisUri
26 jobLogSampleRate: 1
27 redisUri: @redisUri
28 cacheRedisUri: @redisUri
29 @requestQueueName
30 @responseQueueName
31 }
32
33 @sut.run done
34
35 afterEach ->
36 @sut.stop()
37
38 beforeEach (done) ->
39 @redis = new RedisNS @namespace, new Redis @redisUri, dropBufferSupport: true
40 @redis.on 'ready', done
41
42 afterEach (done) ->
43 @redis.del @requestQueueName, @responseQueueName, done
44 return # avoid returning redis
45
46 beforeEach (done) ->
47 @workerFunc = (@request, callback=_.noop) =>
48 @jobManagerDo @request, callback
49
50 @jobManager = new JobManagerResponder {
51 @redisUri
52 @namespace
53 @workerFunc
54 maxConnections: 1
55 queueTimeoutSeconds: 1
56 jobTimeoutSeconds: 1
57 jobLogSampleRate: 1
58 requestQueueName: @requestQueueName
59 responseQueueName: @responseQueueName
60 }
61 @jobManager.start done
62
63 beforeEach ->
64 @jobManager.do = (@jobManagerDo) =>
65
66 afterEach ->
67 @jobManager.stop()
68
69 beforeEach (done) ->
70 @jobLogClient = new Redis 'localhost', dropBufferSupport: true
71 @jobLogClient.on 'ready', =>
72 @jobLogClient.del @jobLogQueue, done
73 return # redis fix
74
75 context 'when the request is successful', ->
76 beforeEach ->
77 @jobManager.do (@jobRequest, callback) =>
78 response =
79 metadata:
80 code: 201
81 metrics: @jobRequest.metadata.metrics
82 jobLogs: @jobRequest.metadata.jobLogs
83 responseId: @jobRequest.metadata.responseId
84
85 callback null, response
86
87 beforeEach (done) ->
88 options =
89 auth:
90 username: 'irritable-captian'
91 password: 'poop-deck'
92 json:
93 motion: true
94
95 request.post "http://localhost:#{@port}/broadcasts", options, (error, @response) =>
96 done error
97
98 it 'should return a 201', ->
99 expect(@response.statusCode).to.equal 201
100
101 it 'should submit the correct job type', ->
102 expect(@jobRequest.metadata.jobType).to.equal 'SendMessage'
103
104 it 'should set the correct auth data', ->
105 expect(@jobRequest.metadata.auth).to.deep.equal uuid: 'irritable-captian', token: 'poop-deck'
106
107 it 'should send the correct broadcast', ->
108 broadcast = JSON.parse @jobRequest.rawData
109 expect(broadcast).to.containSubset devices: ['*'], motion: true
110
111 it 'should log the broadcast', (done) ->
112 @jobLogClient.llen @jobLogQueue, (error, count) =>
113 return done error if error?
114 expect(count).to.equal 1
115 done()
116 return # redis fix
117
118 it 'should log the attempt and success of the broadcast', (done) ->
119 @jobLogClient.lindex @jobLogQueue, 0, (error, jobStr) =>
120 return done error if error?
121 todaySuffix = moment.utc().format('YYYY-MM-DD')
122 index = "metric:meshblu-core-protocol-adapter-http:sampled-#{todaySuffix}"
123 expect(JSON.parse jobStr).to.containSubset {
124 "index": index
125 "type": "meshblu-core-protocol-adapter-http:request"
126 "body": {
127 "request": {
128 "metadata": {
129 "auth": {
130 "uuid": "irritable-captian"
131 }
132 "fromUuid": "irritable-captian"
133 "jobType": "SendMessage"
134 "toUuid": "irritable-captian"
135 }
136 }
137 "response": {
138 "metadata": {
139 "code": 201
140 "success": true
141 }
142 }
143 }
144 }
145 done()
146 return # redis fix
147
148
149 context 'when the user posts a broadcast that is not json', ->
150 beforeEach (done) ->
151 options =
152 auth:
153 username: 'irritable-captian'
154 password: 'poop-deck'
155 json: ['some-random-nonsense']
156 request.post "http://localhost:#{@port}/broadcasts", options, (error, @response) =>
157 done error
158
159 it 'should return a 422', ->
160 expect(@response.statusCode).to.equal 422
161
162 context 'when the request is unsuccessful', ->
163 beforeEach ->
164 @jobManager.do (@jobRequest, callback) =>
165 response =
166 metadata:
167 code: 506
168 responseId: @jobRequest.metadata.responseId
169
170 callback null, response
171
172 beforeEach (done) ->
173 options =
174 auth:
175 username: 'irritable-captian'
176 password: 'poop-deck'
177 json:
178 devices: ['*']
179
180 request.post "http://localhost:#{@port}/broadcasts", options, (error, @response) =>
181 done error
182
183 it 'should return a 506', ->
184 expect(@response.statusCode).to.equal 506
185
186 it 'should submit the correct job type', ->
187 expect(@jobRequest.metadata.jobType).to.equal 'SendMessage'
188
189 it 'should set the correct auth data', ->
190 expect(@jobRequest.metadata.auth).to.deep.equal uuid: 'irritable-captian', token: 'poop-deck'
191
192 it 'should send the correct broadcast', ->
193 broadcast = JSON.parse @jobRequest.rawData
194 expect(broadcast).to.deep.equal devices: ['*']
195
196 it 'should log the broadcast', (done) ->
197 @jobLogClient.llen @jobLogQueue, (error, count) =>
198 return done error if error?
199 expect(count).to.equal 2
200 done()
201 return # redis fix
202
203 it 'should log the attempt and success of the broadcast', (done) ->
204 @jobLogClient.lindex @jobLogQueue, 0, (error, jobStr) =>
205 return done error if error?
206 todaySuffix = moment.utc().format('YYYY-MM-DD')
207 index = "metric:meshblu-core-protocol-adapter-http:failed-#{todaySuffix}"
208 expect(JSON.parse jobStr).to.containSubset {
209 "index": index
210 "type": "meshblu-core-protocol-adapter-http:request"
211 "body": {
212 "request": {
213 "metadata": {
214 "auth": {
215 "uuid": "irritable-captian"
216 }
217 "fromUuid": "irritable-captian"
218 "jobType": "SendMessage"
219 "toUuid": "irritable-captian"
220 }
221 }
222 "response": {
223 "metadata": {
224 "code": 506
225 "success": false
226 }
227 }
228 }
229 }
230 done()
231 return # redis fix