import { TaskFactory, AccountStore, CategoryStore, Category, Thread, ChangeFolderTask, ChangeLabelsTask, } from 'nylas-exports' describe('TaskFactory', function 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', () => { }); });