mirror of
https://github.com/Foundry376/Mailspring.git
synced 2024-11-11 18:32:20 +08:00
0d15c6cea6
Summary: - Separate gmail's remove-from-view and delete behaviors and write logic for each of those - Remove MailboxPerspective::{canArchiveThreads, canTrashThreads, removeThreads} and some unecessary code in TaskFactory - Instead, add MailboxPerspective::tasksForRemovingFromPerspective (I know its a bit of a mouthful) - I initially tried to put all of the logic for each execution path inside the TaskFactory by checking perspective types, but it made more sense to use the polymorphism already in place for the different perspective types. - There is a default delete/remove-from-view behavior which is configurable via simple ruleset objects. The gmail behavior is configured in this way. - Update swipe css classes based on destination of threads - Fixes #1460: - Update logic to display archive/trash buttons and context menu options correctly when selected threads can be archived/trashed (not based on perspective) - Same for swiping - Add a bunch of specs - Convert some code to ES6 - TODO write some docs for new functions Test Plan: Unit tests Reviewers: drew, evan, bengotow Reviewed By: bengotow Differential Revision: https://phab.nylas.com/D2682
185 lines
5.5 KiB
JavaScript
185 lines
5.5 KiB
JavaScript
import {
|
|
TaskFactory,
|
|
AccountStore,
|
|
CategoryStore,
|
|
Category,
|
|
Thread,
|
|
ChangeFolderTask,
|
|
ChangeLabelsTask,
|
|
} from 'nylas-exports'
|
|
|
|
|
|
describe('TaskFactory', ()=> {
|
|
beforeEach(()=> {
|
|
this.categories = {
|
|
'ac-1': {
|
|
'archive': new Category({name: 'archive'}),
|
|
'inbox': new Category({name: 'inbox1'}),
|
|
'trash': new Category({name: 'trash1'}),
|
|
},
|
|
'ac-2': {
|
|
'archive': new Category({name: 'all'}),
|
|
'inbox': new Category({name: 'inbox2'}),
|
|
'trash': new Category({name: 'trash2'}),
|
|
},
|
|
}
|
|
this.accounts = {
|
|
'ac-1': {
|
|
id: 'ac-1',
|
|
usesFolders: ()=> true,
|
|
defaultFinishedCategory: ()=> this.categories['ac-1'].archive,
|
|
},
|
|
'ac-2': {
|
|
id: 'ac-2',
|
|
usesFolders: ()=> false,
|
|
defaultFinishedCategory: ()=> this.categories['ac-2'].trash,
|
|
},
|
|
}
|
|
this.threads = [
|
|
new Thread({accountId: 'ac-1'}),
|
|
new Thread({accountId: 'ac-2'}),
|
|
]
|
|
|
|
spyOn(CategoryStore, 'getArchiveCategory').andCallFake((acc)=> {
|
|
return this.categories[acc.id].archive
|
|
})
|
|
spyOn(CategoryStore, 'getInboxCategory').andCallFake((acc)=> {
|
|
return this.categories[acc.id].inbox
|
|
})
|
|
spyOn(CategoryStore, 'getTrashCategory').andCallFake((acc)=> {
|
|
return this.categories[acc.id].trash
|
|
})
|
|
spyOn(AccountStore, 'accountForId').andCallFake((accId)=> {
|
|
return this.accounts[accId];
|
|
})
|
|
});
|
|
|
|
describe('tasksForApplyingCategories', ()=> {
|
|
it('creates the correct tasks', ()=> {
|
|
const categoriesToRemove = (accId)=> {
|
|
if (accId === 'ac-1') {
|
|
return [new Category({displayName: 'folder1', accountId: 'ac-1'})]
|
|
}
|
|
return [new Category({displayName: 'label2', accountId: 'ac-2'})]
|
|
}
|
|
const categoriesToAdd = (accId)=> [this.categories[accId].inbox]
|
|
const taskDescription = 'dope'
|
|
|
|
const tasks = TaskFactory.tasksForApplyingCategories({
|
|
threads: this.threads,
|
|
categoriesToAdd,
|
|
categoriesToRemove,
|
|
taskDescription,
|
|
})
|
|
|
|
expect(tasks.length).toEqual(2)
|
|
const taskExchange = tasks[0]
|
|
const taskGmail = tasks[1]
|
|
|
|
expect(taskExchange instanceof ChangeFolderTask).toBe(true)
|
|
expect(taskExchange.folder.name).toEqual('inbox1')
|
|
expect(taskExchange.taskDescription).toEqual(taskDescription)
|
|
|
|
expect(taskGmail instanceof ChangeLabelsTask).toBe(true)
|
|
expect(taskGmail.labelsToAdd.length).toEqual(1)
|
|
expect(taskGmail.labelsToAdd[0].name).toEqual('inbox2')
|
|
expect(taskGmail.labelsToRemove.length).toEqual(1)
|
|
expect(taskGmail.labelsToRemove[0].displayName).toEqual('label2')
|
|
expect(taskGmail.taskDescription).toEqual(taskDescription)
|
|
});
|
|
|
|
it('throws if threads are not instances of Thread', ()=> {
|
|
const threads = [
|
|
{accountId: 'ac-1'},
|
|
{accountId: 'ac-2'},
|
|
]
|
|
expect(()=> {
|
|
TaskFactory.tasksForApplyingCategories({threads})
|
|
}).toThrow()
|
|
});
|
|
|
|
it('throws if categoriesToAdd does not return an array', ()=> {
|
|
expect(()=> {
|
|
TaskFactory.tasksForApplyingCategories({
|
|
threads: this.threads,
|
|
categoriesToAdd: {displayName: 'cat1'},
|
|
})
|
|
}).toThrow()
|
|
});
|
|
|
|
it('throws if categoriesToAdd does not return an array', ()=> {
|
|
expect(()=> {
|
|
TaskFactory.tasksForApplyingCategories({
|
|
threads: this.threads,
|
|
categoriesToRemove: {displayName: 'cat1'},
|
|
})
|
|
}).toThrow()
|
|
});
|
|
|
|
it('does not create folder tasks if categoriesToAdd not present', ()=> {
|
|
const categoriesToRemove = (accId)=> {
|
|
if (accId === 'ac-1') {
|
|
return [new Category({displayName: 'folder1', accountId: 'ac-1'})]
|
|
}
|
|
return [new Category({displayName: 'label2', accountId: 'ac-2'})]
|
|
}
|
|
const taskDescription = 'dope'
|
|
|
|
const tasks = TaskFactory.tasksForApplyingCategories({
|
|
threads: this.threads,
|
|
categoriesToRemove,
|
|
taskDescription,
|
|
})
|
|
expect(tasks.length).toEqual(1)
|
|
const taskGmail = tasks[0]
|
|
expect(taskGmail instanceof ChangeLabelsTask).toBe(true)
|
|
expect(taskGmail.labelsToRemove.length).toEqual(1)
|
|
});
|
|
|
|
it('does not create label tasks if both categoriesToAdd and categoriesToRemove return empty', ()=> {
|
|
const categoriesToAdd = (accId)=> {
|
|
return accId === 'ac-1' ? [this.categories[accId].inbox] : [];
|
|
}
|
|
const taskDescription = 'dope'
|
|
|
|
const tasks = TaskFactory.tasksForApplyingCategories({
|
|
threads: this.threads,
|
|
categoriesToAdd,
|
|
taskDescription,
|
|
})
|
|
expect(tasks.length).toEqual(1)
|
|
const taskExchange = tasks[0]
|
|
|
|
expect(taskExchange instanceof ChangeFolderTask).toBe(true)
|
|
expect(taskExchange.folder.name).toEqual('inbox1')
|
|
});
|
|
|
|
describe('exchange accounts', ()=> {
|
|
it('throws if folder is not a category', ()=> {
|
|
expect(()=> {
|
|
TaskFactory.tasksForApplyingCategories({
|
|
threads: this.threads,
|
|
categoriesToAdd: () => [{accountId: 'ac-1', name: 'inbox'}],
|
|
})
|
|
}).toThrow()
|
|
});
|
|
|
|
it('throws if attempting to add more than one folder', ()=> {
|
|
expect(()=> {
|
|
TaskFactory.tasksForApplyingCategories({
|
|
threads: this.threads,
|
|
categoriesToAdd: () => [{accountId: 'ac-1', name: 'inbox'}, {}],
|
|
})
|
|
}).toThrow()
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('taskForInvertingUnread', ()=> {
|
|
|
|
});
|
|
|
|
describe('taskForInvertingStarred', ()=> {
|
|
|
|
});
|
|
});
|