@missive/ndex
Version:
Ndex is an indexedDB wrapper
91 lines (67 loc) • 2.93 kB
text/coffeescript
WorkerAdapter = require('../../../lib/ndex/adapters/worker_adapter')
Connection = require('../../../lib/ndex/connection')
{ simple, expect, helpers } = require('../../spec_helper.coffee')
{ delay } = helpers
describe 'WorkerAdapter < Adapter', ->
mockWorker = (callback) ->
simple.restore()
delay 0, ->
simple.mock(Worker.prototype, 'postMessage', ->)
delay 0, callback
beforeEach (done) ->
mockWorker =>
= new Connection('foo', { foo_migration: -> this.doSomething() })
= new WorkerAdapter()
done()
describe 'Worker', ->
it 'spawns a worker on initialization', ->
expect(.worker).to.be.an.instanceof(Worker)
it 'init worker with db name and migrations', ->
expect(.worker.postMessage.calls.length).to.equal(1)
args = .worker.postMessage.firstCall.args[0]
expect(args).to.have.deep.property('method', 'init')
expect(args).to.have.deep.property('args')
expect(args).to.have.deep.property('args.name', 'foo')
expect(args).to.have.deep.property('args.migrations')
describe '#handleMethod', ->
beforeEach (done) -> mockWorker(done)
it 'schedules 1 #postMessage per event loop', (done) ->
.get('foo', 1)
.get('foo', 2)
.get('foo', 3)
delay 0, =>
.get('foo', 4)
.get('foo', 5)
delay 0, done, =>
expect(.worker.postMessage.calls.length).to.equal(2)
it 'caches promises’ resolve/reject functions', ->
length = Object.keys(.promises).length
expect(length).to.equal(0)
.open()
.get()
.getAll()
length = Object.keys(.promises).length
expect(length).to.equal(3)
for i in [1..length]
expect(.promises[i]).to.be.defined
expect(.promises[i].id).to.equal(i)
expect(.promises[i].resolve).to.be.defined
expect(.promises[i].reject).to.be.defined
describe '#handleMessage', ->
beforeEach (done) -> mockWorker(done)
it 'resolves promise when worker response is resolved', ->
promise = .open()
length = Object.keys(.promises).length
expect(length).to.equal(1)
.handleMessage(data: { id: 1, resolve: { foo: 'bar' } })
expect(promise).to.be.fulfilled
length = Object.keys(.promises).length
expect(length).to.equal(0)
it 'rejects promise when worker response is rejected', ->
promise = .open()
length = Object.keys(.promises).length
expect(length).to.equal(1)
.handleMessage(data: { id: 1, reject: 'There was an error' })
expect(promise).to.be.rejectedWith('There was an error')
length = Object.keys(.promises).length
expect(length).to.equal(0)