meshblu-core-job-manager
Version:
Meshblu Core Job Manager
274 lines (224 loc) • 8.37 kB
text/coffeescript
_ = require 'lodash'
async = require 'async'
moment = require 'moment'
Redis = require 'ioredis'
RedisNS = require '@octoblu/redis-ns'
UUID = require 'uuid'
{ JobManagerRequester, JobManagerResponder } = require '..'
describe 'JobManagerRequester', ->
beforeEach ->
= 1
= 1
= 1
queueId = UUID.v4()
= "request:queue:#{queueId}"
= "response:queue:#{queueId}"
= 'test:job-manager'
= 'localhost'
= 2
beforeEach (done) ->
= new RedisNS , new Redis , dropBufferSupport: true
.on 'ready', done
afterEach (done) ->
.del , , 'some-response-id', done
return # avoid returning redis
beforeEach "create requester", (done) ->
= new JobManagerRequester {
}
.start done
afterEach ->
.stop()
describe '->createRequest', ->
context 'when the maxQueueLength is exceeded', ->
beforeEach ->
.maxQueueLength = 1
beforeEach (done) ->
.lpush , 'something', done
return # avoid returning redis
beforeEach (done) ->
.lpush , 'something', done
return # avoid returning redis
beforeEach (done) ->
options =
metadata:
responseId: 'some-response-id'
auth: uuid: 'some-uuid'
.createRequest options, () => done()
return # avoid returning redis
it 'should return an error', ->
expect(.code).to.equal 503
context 'with override-uuids set', ->
beforeEach ->
.jobLogSampleRateOverrideUuids = ['some-uuid']
beforeEach (done) ->
options =
metadata:
auth: uuid: 'some-uuid'
duel: "i'm just in it for the glove slapping"
responseId: 'some-response-id'
.createRequest options, done
.emit "response:some-response-id", {}
it 'should put the metadata in its place', (done) ->
.hget 'some-response-id', 'request:metadata', (error, metadataStr) =>
return done error if error?
return done new Error 'missing metadata' unless metadataStr?
metadata = JSON.parse metadataStr
expect(metadata).to.containSubset
duel: "i'm just in it for the glove slapping"
responseId: 'some-response-id'
jobLogs: ['override']
done()
return # avoid returning redis
context 'when called with a request', ->
beforeEach (done) ->
options =
metadata:
duel: "i'm just in it for the glove slapping"
responseId: 'some-response-id'
.createRequest options, done
it 'should place the job in a queue', (done) ->
.brpop , 1, (error, result) =>
return done(error) if error?
return done(new Error('Invalid Result')) if _.isEmpty result
[channel, responseKey] = result
expect(responseKey).to.deep.equal 'some-response-id'
done()
return # avoid returning redis
it 'should put the metadata in its place', (done) ->
.hget 'some-response-id', 'request:metadata', (error, metadataStr) =>
metadata = JSON.parse metadataStr
expect(metadata).to.containSubset
duel: "i'm just in it for the glove slapping"
responseId: 'some-response-id'
jobLogs: ['sampled']
done()
return # avoid returning redis
it 'should put the data in its place', (done) ->
.hget 'some-response-id', 'request:data', (error, dataStr) =>
data = JSON.parse dataStr
expect(data).to.be.null
done()
return # avoid returning redis
it 'should put the createdAt in its place', (done) ->
.hget 'some-response-id', 'request:createdAt', (error, timestamp) =>
expect(timestamp).to.exist
done()
return # avoid returning redis
it 'should expire the key', (done) ->
.ttl 'some-response-id', (error, ttl) =>
expect(ttl).to.be.at.least 0
done()
return # avoid returning redis
context 'when called without a responseId', ->
beforeEach (done) ->
options =
metadata:
duel: "i'm just in it for the glove slapping"
.createRequest options, (error, ) =>
done error
it 'should assign a responseId', ->
expect().to.exist
context 'when called with data', ->
beforeEach (done) ->
options =
metadata:
responseId: 'some-response-id'
data:
'tunnel-collapse': 'just a miner problem'
.createRequest options, done
it 'should stringify the data', (done) ->
.hget 'some-response-id', 'request:data', (error, dataStr) =>
data = JSON.parse dataStr
expect(data).to.deep.equal 'tunnel-collapse': 'just a miner problem'
done()
return # avoid returning redis
describe '->createForeverRequest', ->
context 'when called with a request', ->
beforeEach (done) ->
options =
metadata:
duel: "i'm just in it for the glove slapping"
responseId: 'some-response-id'
.createForeverRequest options, done
it 'should not expire the key', (done) ->
.ttl 'some-response-id', (error, ttl) =>
expect(ttl).to.equal -1
done()
return # avoid returning redis
context 'when called with data', ->
beforeEach (done) ->
options =
metadata:
responseId: 'some-response-id'
data:
'tunnel-collapse': 'just a miner problem'
.createRequest options, done
it 'should stringify the data', (done) ->
.hget 'some-response-id', 'request:data', (error, dataStr) =>
data = JSON.parse dataStr
expect(data).to.deep.equal 'tunnel-collapse': 'just a miner problem'
done()
return # avoid returning redis
describe '->do', ->
beforeEach "create responder", (done) ->
= sinon.stub()
= new JobManagerResponder {
}
.start done
afterEach (done) ->
.stop done
context 'when called with a request', ->
beforeEach ->
options =
metadata:
gross: true
responseId: 'some-response-id'
rawData: 'abcd123'
.yields null, options
beforeEach (done) ->
options =
metadata:
duel: "i'm just in it for the glove slapping"
responseId: 'some-response-id'
= ._heartbeat
.do options, (error, ) =>
done error
it 'should yield the response', ->
expect().to.containSubset
metadata:
gross: true
responseId: 'some-response-id'
rawData: 'abcd123'
it 'should update the heartbeat', ->
expect().to.not.equal ._heartbeat
describe 'healthcheck', ->
context 'when heartbeat is < 2 * jobTimeoutSeconds', ->
beforeEach (done) ->
._heartbeat = moment()
.healthcheck (error, ) =>
done error
it 'should be healthy', ->
expect().to.be.true
context 'when heartbeat is > 2 * jobTimeoutSeconds', ->
beforeEach (done) ->
._heartbeat = moment().subtract(60, 'seconds')
.healthcheck (error, ) =>
done error
it 'should not be healthy', ->
expect().to.be.false