mirror of
https://github.com/Foundry376/Mailspring.git
synced 2024-11-12 04:25:31 +08:00
5582782ddd
This reverts commit ee5609bdb0
.
Updates to nylas sync worker to support multiple cursors
Convert NylasSyncWorker to es6
Convert NylasSyncWorkerPool to es6
Extract into deltaProcessor
Update names to NylasSyncWorker state
Working on spec fixes
More spec fixes
Delta stream refactor fixes
126 lines
5.1 KiB
CoffeeScript
126 lines
5.1 KiB
CoffeeScript
_ = require 'underscore'
|
|
fs = require 'fs'
|
|
path = require 'path'
|
|
{NylasAPI,
|
|
Thread,
|
|
DatabaseStore,
|
|
DatabaseTransaction,
|
|
Actions} = require 'nylas-exports'
|
|
|
|
NylasSyncWorkerPool = require('../lib/nylas-sync-worker-pool').default
|
|
NylasSyncWorkerPool = new NylasSyncWorkerPool()
|
|
|
|
fixturesPath = path.resolve(__dirname, 'fixtures')
|
|
|
|
describe "NylasSyncWorkerPool", ->
|
|
|
|
describe "handleDeltas", ->
|
|
beforeEach ->
|
|
@sampleDeltas = JSON.parse(fs.readFileSync("#{fixturesPath}/sample.json"))
|
|
@sampleClustered = JSON.parse(fs.readFileSync("#{fixturesPath}/sample-clustered.json"))
|
|
|
|
it "should immediately fire the received raw deltas event", ->
|
|
spyOn(Actions, 'longPollReceivedRawDeltas')
|
|
spyOn(NylasSyncWorkerPool, '_clusterDeltas').andReturn({create: {}, modify: {}, destroy: []})
|
|
NylasSyncWorkerPool._handleDeltas(@sampleDeltas)
|
|
expect(Actions.longPollReceivedRawDeltas).toHaveBeenCalled()
|
|
|
|
it "should call helper methods for all creates first, then modifications, then destroys", ->
|
|
spyOn(Actions, 'longPollProcessedDeltas')
|
|
|
|
handleDeltaDeletionPromises = []
|
|
resolveDeltaDeletionPromises = ->
|
|
fn() for fn in handleDeltaDeletionPromises
|
|
handleDeltaDeletionPromises = []
|
|
|
|
spyOn(NylasSyncWorkerPool, '_handleDeltaDeletion').andCallFake ->
|
|
new Promise (resolve, reject) ->
|
|
handleDeltaDeletionPromises.push(resolve)
|
|
|
|
handleModelResponsePromises = []
|
|
resolveModelResponsePromises = ->
|
|
fn() for fn in handleModelResponsePromises
|
|
handleModelResponsePromises = []
|
|
|
|
spyOn(NylasAPI, '_handleModelResponse').andCallFake ->
|
|
new Promise (resolve, reject) ->
|
|
handleModelResponsePromises.push(resolve)
|
|
|
|
spyOn(NylasSyncWorkerPool, '_clusterDeltas').andReturn(JSON.parse(JSON.stringify(@sampleClustered)))
|
|
NylasSyncWorkerPool._handleDeltas(@sampleDeltas)
|
|
|
|
createTypes = Object.keys(@sampleClustered['create'])
|
|
expect(NylasAPI._handleModelResponse.calls.length).toEqual(createTypes.length)
|
|
expect(NylasAPI._handleModelResponse.calls[0].args[0]).toEqual(_.values(@sampleClustered['create'][createTypes[0]]))
|
|
expect(NylasSyncWorkerPool._handleDeltaDeletion.calls.length).toEqual(0)
|
|
|
|
NylasAPI._handleModelResponse.reset()
|
|
resolveModelResponsePromises()
|
|
advanceClock()
|
|
|
|
modifyTypes = Object.keys(@sampleClustered['modify'])
|
|
expect(NylasAPI._handleModelResponse.calls.length).toEqual(modifyTypes.length)
|
|
expect(NylasAPI._handleModelResponse.calls[0].args[0]).toEqual(_.values(@sampleClustered['modify'][modifyTypes[0]]))
|
|
expect(NylasSyncWorkerPool._handleDeltaDeletion.calls.length).toEqual(0)
|
|
|
|
NylasAPI._handleModelResponse.reset()
|
|
resolveModelResponsePromises()
|
|
advanceClock()
|
|
|
|
destroyCount = @sampleClustered['destroy'].length
|
|
expect(NylasSyncWorkerPool._handleDeltaDeletion.calls.length).toEqual(destroyCount)
|
|
expect(NylasSyncWorkerPool._handleDeltaDeletion.calls[0].args[0]).toEqual(@sampleClustered['destroy'][0])
|
|
|
|
expect(Actions.longPollProcessedDeltas).not.toHaveBeenCalled()
|
|
|
|
resolveDeltaDeletionPromises()
|
|
advanceClock()
|
|
|
|
expect(Actions.longPollProcessedDeltas).toHaveBeenCalled()
|
|
|
|
describe "clusterDeltas", ->
|
|
beforeEach ->
|
|
@sampleDeltas = JSON.parse(fs.readFileSync("#{fixturesPath}/sample.json"))
|
|
@expectedClustered = JSON.parse(fs.readFileSync("#{fixturesPath}/sample-clustered.json"))
|
|
|
|
it "should collect create/modify events into a hash by model type", ->
|
|
{create, modify} = NylasSyncWorkerPool._clusterDeltas(@sampleDeltas)
|
|
expect(create).toEqual(@expectedClustered.create)
|
|
expect(modify).toEqual(@expectedClustered.modify)
|
|
|
|
it "should collect destroys into an array", ->
|
|
{destroy} = NylasSyncWorkerPool._clusterDeltas(@sampleDeltas)
|
|
expect(destroy).toEqual(@expectedClustered.destroy)
|
|
|
|
describe "handleDeltaDeletion", ->
|
|
beforeEach ->
|
|
@thread = new Thread(id: 'idhere')
|
|
@delta =
|
|
"cursor": "bb95ddzqtr2gpmvgrng73t6ih",
|
|
"object": "thread",
|
|
"event": "delete",
|
|
"id": @thread.id,
|
|
"timestamp": "2015-08-26T17:36:45.297Z"
|
|
|
|
spyOn(DatabaseTransaction.prototype, 'unpersistModel')
|
|
|
|
it "should resolve if the object cannot be found", ->
|
|
spyOn(DatabaseStore, 'find').andCallFake (klass, id) =>
|
|
return Promise.resolve(null)
|
|
waitsForPromise =>
|
|
NylasSyncWorkerPool._handleDeltaDeletion(@delta)
|
|
runs =>
|
|
expect(DatabaseStore.find).toHaveBeenCalledWith(Thread, 'idhere')
|
|
expect(DatabaseTransaction.prototype.unpersistModel).not.toHaveBeenCalled()
|
|
|
|
it "should call unpersistModel if the object exists", ->
|
|
spyOn(DatabaseStore, 'find').andCallFake (klass, id) =>
|
|
return Promise.resolve(@thread)
|
|
waitsForPromise =>
|
|
NylasSyncWorkerPool._handleDeltaDeletion(@delta)
|
|
runs =>
|
|
expect(DatabaseStore.find).toHaveBeenCalledWith(Thread, 'idhere')
|
|
expect(DatabaseTransaction.prototype.unpersistModel).toHaveBeenCalledWith(@thread)
|
|
|
|
describe "handleModelResponse", ->
|
|
# SEE spec/nylas-api-spec.coffee
|