Mailspring/spec-nylas/tasks/update-nylas-objects-task-spec.coffee

132 lines
4.6 KiB
CoffeeScript
Raw Normal View History

Task = require '../../src/flux/tasks/task'
Model = require '../../src/flux/models/model'
NylasAPI = require '../../src/flux/nylas-api'
Attributes = require '../../src/flux/attributes'
DatabaseStore = require '../../src/flux/stores/database-store'
UpdateNylasObjectsTask = require '../../src/flux/tasks/update-nylas-objects-task'
{APIError} = require '../../src/flux/errors'
class TestModel extends Model
@attributes:
'name': Attributes.String
modelKey: 'name'
'unread': Attributes.Boolean
modelKey: 'unread'
'starred': Attributes.Boolean
modelKey: 'starred'
describe 'UpdateNylasObjectsTask', ->
beforeEach ->
@origValues =
"id-1":
id: "id-1"
name: "Evan"
unread: true
starred: false
"id-2":
id: "id-2"
name: "Ben"
unread: true
starred: false
"id-3":
id: "id-3"
name: "Michael"
unread: true
starred: false
@newValues =
unread: false
starred: true
@objects = [
new TestModel(@origValues["id-1"])
new TestModel(@origValues["id-2"])
new TestModel(@origValues["id-3"])
]
@objects[0].id = "id-1"
@objects[1].id = "id-2"
@objects[2].id = "id-3"
spyOn(DatabaseStore, 'persistModels').andCallFake -> Promise.resolve()
@task = new UpdateNylasObjectsTask(@objects, @newValues)
describe 'when performing local', ->
it "saves the updates to the db", ->
waitsForPromise =>
@task.performLocal().then =>
expect(DatabaseStore.persistModels).toHaveBeenCalledWith(@objects)
objects = DatabaseStore.persistModels.calls[0].args[0]
for obj in objects
expect(obj.unread).toBe @newValues.unread
expect(obj.starred).toBe @newValues.starred
describe 'when performing remote', ->
it "persists data to the api", ->
spyOn(NylasAPI, 'makeRequest').andCallFake -> Promise.resolve()
waitsForPromise =>
@task.performRemote().then (status) =>
expect(NylasAPI.makeRequest).toHaveBeenCalled()
for call, i in NylasAPI.makeRequest.calls
opts = call.args[0]
expect(opts.path).toBe "/n/nsid/testmodels/#{@objects[i].id}"
expect(status).toBe Task.Status.Finished
it "reverts if there's an error", ->
spyOn(NylasAPI, 'makeRequest').andCallFake ->
Promise.reject(new APIError(statusCode: 404))
waitsForPromise =>
@task.performRemote().then =>
expect(NylasAPI.makeRequest).toHaveBeenCalled()
origIds = @objects.map (obj) -> obj.id
calledIds = DatabaseStore.persistModels.calls[0].args[0].map (o) -> o.id
expect(origIds).toEqual calledIds
objects = DatabaseStore.persistModels.calls[0].args[0]
for obj in objects
expect(obj.unread).toBe true
expect(obj.starred).toBe false
it "retries if there are retryable errors", ->
spyOn(NylasAPI, 'makeRequest').andCallFake ->
Promise.reject(new APIError(statusCode: 0))
spyOn(@task, "performLocal")
waitsForPromise =>
@task.performRemote().then (status) =>
expect(NylasAPI.makeRequest).toHaveBeenCalled()
for call, i in NylasAPI.makeRequest.calls
opts = call.args[0]
expect(opts.path).toBe "/n/nsid/testmodels/#{@objects[i].id}"
expect(status).toBe Task.Status.Retry
expect(@task.performLocal).not.toHaveBeenCalled()
describe 'when undoing', ->
beforeEach ->
@undoTask = new UpdateNylasObjectsTask(@objects, {}, @origValues)
@undoTask._isUndoTask = true
describe 'when performing local', ->
it "saves the old values to the db", ->
waitsForPromise =>
@undoTask.performLocal().then =>
expect(DatabaseStore.persistModels).toHaveBeenCalledWith(@objects)
objects = DatabaseStore.persistModels.calls[0].args[0]
for obj in objects
expect(obj.unread).toBe true
expect(obj.starred).toBe false
describe 'when performing remote', ->
it "persists the old values to the API", ->
spyOn(NylasAPI, 'makeRequest').andCallFake -> Promise.resolve()
waitsForPromise =>
@undoTask.performRemote().then (status) =>
expect(NylasAPI.makeRequest).toHaveBeenCalled()
for call, i in NylasAPI.makeRequest.calls
opts = call.args[0]
expect(opts.path).toBe "/n/nsid/testmodels/#{@objects[i].id}"
expect(opts.body.unread).toBe true
expect(opts.body.starred).toBe false
expect(status).toBe Task.Status.Finished