Mailspring/app/spec/tasks/task-factory-spec.ts

176 lines
5.6 KiB
TypeScript
Raw Normal View History

import {
TaskFactory,
AccountStore,
CategoryStore,
Label,
Thread,
ChangeFolderTask,
ChangeLabelsTask,
} from 'mailspring-exports';
describe('TaskFactory', function taskFactory() {
2016-05-06 13:30:34 +08:00
beforeEach(() => {
this.categories = {
'ac-1': {
2017-09-27 02:33:08 +08:00
archive: new Label({ name: 'archive' }),
inbox: new Label({ name: 'inbox1' }),
trash: new Label({ name: 'trash1' }),
},
'ac-2': {
2017-09-27 02:33:08 +08:00
archive: new Label({ name: 'all' }),
inbox: new Label({ name: 'inbox2' }),
trash: new Label({ name: 'trash2' }),
},
2017-09-27 02:33:08 +08:00
};
this.accounts = {
'ac-1': {
id: 'ac-1',
2016-05-06 13:30:34 +08:00
usesFolders: () => true,
preferredRemovalDestination: () => this.categories['ac-1'].archive,
},
'ac-2': {
id: 'ac-2',
2016-05-06 13:30:34 +08:00
usesFolders: () => false,
preferredRemovalDestination: () => this.categories['ac-2'].trash,
},
2017-09-27 02:33:08 +08:00
};
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];
2017-09-27 02:33:08 +08:00
});
});
// todo bg
xdescribe('tasksForApplyingCategories', () => {
2016-05-06 13:30:34 +08:00
it('creates the correct tasks', () => {
2017-09-27 02:33:08 +08:00
const categoriesToRemove = accId => {
if (accId === 'ac-1') {
2017-09-27 02:33:08 +08:00
return [new Label({ displayName: 'folder1', accountId: 'ac-1' })];
}
2017-09-27 02:33:08 +08:00
return [new Label({ 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,
2017-09-27 02:33:08 +08:00
});
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);
});
2016-05-06 13:30:34 +08:00
it('throws if threads are not instances of Thread', () => {
2017-09-27 02:33:08 +08:00
const threads = [{ accountId: 'ac-1' }, { accountId: 'ac-2' }];
2016-05-06 13:30:34 +08:00
expect(() => {
2017-09-27 02:33:08 +08:00
TaskFactory.tasksForApplyingCategories({ threads });
}).toThrow();
});
2016-05-06 13:30:34 +08:00
it('throws if categoriesToAdd does not return an array', () => {
expect(() => {
TaskFactory.tasksForApplyingCategories({
threads: this.threads,
2017-09-27 02:33:08 +08:00
categoriesToAdd: { displayName: 'cat1' },
});
}).toThrow();
});
2016-05-06 13:30:34 +08:00
it('throws if categoriesToAdd does not return an array', () => {
expect(() => {
TaskFactory.tasksForApplyingCategories({
threads: this.threads,
2017-09-27 02:33:08 +08:00
categoriesToRemove: { displayName: 'cat1' },
});
}).toThrow();
});
2016-05-06 13:30:34 +08:00
it('does not create folder tasks if categoriesToAdd not present', () => {
2017-09-27 02:33:08 +08:00
const categoriesToRemove = accId => {
if (accId === 'ac-1') {
2017-09-27 02:33:08 +08:00
return [new Label({ displayName: 'folder1', accountId: 'ac-1' })];
}
2017-09-27 02:33:08 +08:00
return [new Label({ displayName: 'label2', accountId: 'ac-2' })];
};
const taskDescription = 'dope';
const tasks = TaskFactory.tasksForApplyingCategories({
threads: this.threads,
categoriesToRemove,
taskDescription,
2017-09-27 02:33:08 +08:00
});
expect(tasks.length).toEqual(1);
const taskGmail = tasks[0];
expect(taskGmail instanceof ChangeLabelsTask).toBe(true);
expect(taskGmail.labelsToRemove.length).toEqual(1);
});
2016-05-06 13:30:34 +08:00
it('does not create label tasks if both categoriesToAdd and categoriesToRemove return empty', () => {
2017-09-27 02:33:08 +08:00
const categoriesToAdd = accId => {
return accId === 'ac-1' ? [this.categories[accId].inbox] : [];
2017-09-27 02:33:08 +08:00
};
const taskDescription = 'dope';
const tasks = TaskFactory.tasksForApplyingCategories({
threads: this.threads,
categoriesToAdd,
taskDescription,
2017-09-27 02:33:08 +08:00
});
expect(tasks.length).toEqual(1);
const taskExchange = tasks[0];
2017-09-27 02:33:08 +08:00
expect(taskExchange instanceof ChangeFolderTask).toBe(true);
expect(taskExchange.folder.name).toEqual('inbox1');
});
2016-05-06 13:30:34 +08:00
describe('exchange accounts', () => {
it('throws if folder is not a category', () => {
expect(() => {
TaskFactory.tasksForApplyingCategories({
threads: this.threads,
2017-09-27 02:33:08 +08:00
categoriesToAdd: () => [{ accountId: 'ac-1', name: 'inbox' }],
});
}).toThrow();
});
2016-05-06 13:30:34 +08:00
it('throws if attempting to add more than one folder', () => {
expect(() => {
TaskFactory.tasksForApplyingCategories({
threads: this.threads,
2017-09-27 02:33:08 +08:00
categoriesToAdd: () => [{ accountId: 'ac-1', name: 'inbox' }, {}],
});
}).toThrow();
});
});
});
2017-09-27 02:33:08 +08:00
describe('taskForInvertingUnread', () => {});
2017-09-27 02:33:08 +08:00
describe('taskForInvertingStarred', () => {});
});