Mailspring/spec/tasks/change-folder-task-spec.coffee
Ben Gotow 60ce0b53ba es6(tasks): Convert all remaining tasks to ES6
Summary: after refactoring some things last week and spending time futsing with coffeescript, I’m pretty convinced it’s worth moving important parts of the app to ES6 to be able to use ESLint as part of our dev workflow

Test Plan: Run existing tests, tested manually. Did not convert the tests in this diff, breaking one part at a time!

Reviewers: evan, juan

Reviewed By: juan

Differential Revision: https://phab.nylas.com/D2768
2016-03-21 16:50:10 -07:00

153 lines
6 KiB
CoffeeScript

_ = require 'underscore'
Folder = require '../../src/flux/models/folder'
Thread = require '../../src/flux/models/thread'
Message = require '../../src/flux/models/message'
Actions = require '../../src/flux/actions'
NylasAPI = require '../../src/flux/nylas-api'
Query = require '../../src/flux/models/query'
DatabaseStore = require '../../src/flux/stores/database-store'
ChangeFolderTask = require '../../src/flux/tasks/change-folder-task'
ChangeMailTask = require '../../src/flux/tasks/change-mail-task'
{APIError} = require '../../src/flux/errors'
{Utils} = require '../../src/flux/models/utils'
testFolders = {}
testThreads = {}
testMessages = {}
describe "ChangeFolderTask", ->
beforeEach ->
# IMPORTANT: These specs do not run the performLocal logic of their superclass!
# Tests for that logic are in change-mail-task-spec.
spyOn(ChangeMailTask.prototype, 'performLocal').andCallFake =>
Promise.resolve()
spyOn(DatabaseStore, 'modelify').andCallFake (klass, items) =>
Promise.resolve items.map (item) =>
return testFolders[item] if testFolders[item]
return testThreads[item] if testThreads[item]
return testMessages[item] if testMessages[item]
item
testFolders = @testFolders =
"f1": new Folder({name: 'inbox', id: 'f1', displayName: "INBOX"}),
"f2": new Folder({name: 'drafts', id: 'f2', displayName: "MyDrafts"})
"f3": new Folder({name: null, id: 'f3', displayName: "My Folder"})
testThreads = @testThreads =
't1': new Thread(id: 't1', categories: [@testFolders['f1']])
't2': new Thread(id: 't2', categories: _.values(@testFolders))
't3': new Thread(id: 't3', categories: [@testFolders['f2'], @testFolders['f3']])
testMessages = @testMessages =
'm1': new Message(id: 'm1', folder: @testFolders['f1'])
'm2': new Message(id: 'm2', folder: @testFolders['f2'])
'm3': new Message(id: 'm3', folder: @testFolders['f3'])
describe "description", ->
it "should include the folder name if folder is a folder", ->
taskWithFolderId = new ChangeFolderTask
folder: 'f2'
messages: ['m1']
expect(taskWithFolderId.description()).toEqual("Moved 1 message")
taskWithFolder = new ChangeFolderTask
folder: @testFolders['f2']
messages: ['m1']
expect(taskWithFolder.description()).toEqual("Moved 1 message to MyDrafts")
it "should correctly mention threads and messages", ->
taskWithFolderId = new ChangeFolderTask
folder: 'f2'
threads: ['t1']
expect(taskWithFolderId.description()).toEqual("Moved 1 thread")
taskWithFolder = new ChangeFolderTask
folder: @testFolders['f2']
messages: ['m1']
expect(taskWithFolder.description()).toEqual("Moved 1 message to MyDrafts")
describe "performLocal", ->
it "should check that a single folder is provided, and that we have threads or messages", ->
badTasks = [
new ChangeFolderTask(),
new ChangeFolderTask(threads: [123]),
new ChangeFolderTask(threads: [123], messages: ["foo"]),
new ChangeFolderTask(threads: "Thread"),
]
goodTasks = [
new ChangeFolderTask(
folder: 'f2'
threads: ['t1', 't2']
)
new ChangeFolderTask(
folder: @testFolders['f2']
messages: ['m1']
)
]
caught = []
succeeded = []
runs ->
[].concat(badTasks, goodTasks).forEach (task) ->
task.performLocal()
.then -> succeeded.push(task)
.catch (err) -> caught.push(task)
waitsFor ->
succeeded.length + caught.length == 6
runs ->
expect(caught.length).toEqual(badTasks.length)
expect(succeeded.length).toEqual(goodTasks.length)
it 'calls through to super performLocal', ->
task = new ChangeFolderTask
folder: "f1"
threads: ['t1']
waitsForPromise =>
task.performLocal().then =>
expect(task.__proto__.__proto__.performLocal).toHaveBeenCalled()
describe "when object IDs are provided", ->
beforeEach ->
@task = new ChangeFolderTask(folder: "f1", threads: ['t1'])
it 'resolves the objects before calling super', ->
waitsForPromise =>
@task.performLocal().then =>
expect(@task.folder).toEqual(testFolders['f1'])
expect(@task.threads).toEqual([testThreads['t1']])
describe "when objects are provided", ->
beforeEach ->
@task = new ChangeFolderTask(folder: testFolders['f1'], threads: [testThreads['t1'], testThreads['t2']])
it 'still has the objects when calling super', ->
waitsForPromise =>
@task.performLocal().then =>
expect(@task.folder).toEqual(testFolders['f1'])
expect(@task.threads).toEqual([testThreads['t1'],testThreads['t2']])
describe "change methods", ->
beforeEach ->
@message = testMessages['m1']
@thread = testThreads['t1']
@task = new ChangeFolderTask(folder: testFolders['f1'], threads: [testThreads['t1'], testThreads['t2']])
describe "changesToModel", ->
describe "if the model is a Thread", ->
it "returns an object with a categories key, and an array with the folder", ->
expect(@task.changesToModel(@thread)).toEqual({categories: [testFolders['f1']]})
describe "if the model is a Message", ->
it "returns an object with a categories key, and the folder", ->
expect(@task.changesToModel(@message)).toEqual({categories: [testFolders['f1']]})
describe "requestBodyForModel", ->
describe "if the model is a Thread", ->
it "returns folder: <id>, using the first available folder", ->
@thread.folders = []
expect(@task.requestBodyForModel(@thread)).toEqual(folder: null)
@thread.folders = [testFolders['f1']]
expect(@task.requestBodyForModel(@thread)).toEqual(folder: 'f1')
@thread.folders = [testFolders['f2'], testFolders['f1']]
expect(@task.requestBodyForModel(@thread)).toEqual(folder: 'f2')