trash-cleaner
Version:
Finds and deletes trash email in the mailbox
123 lines (104 loc) • 4 kB
JavaScript
const sinon = require('sinon');
const { assert } = require('chai');
const { GmailClient } = require('../../lib/client/gmail-client');
const { Email } = require('../../lib/client/email-client');
describe('GmailCilent', () => {
var gmail, client;
beforeEach(() => {
gmail = {
users: {
messages: {
list: sinon.stub(),
batchDelete: sinon.stub(),
get: sinon.stub()
}
}
};
client = new GmailClient(gmail);
})
describe('getUnreadEmails', () => {
var response;
beforeEach(() => {
response = { data: {} };
gmail.users.messages.list.returns(Promise.resolve(response));
});
it('returns empty list when there are no messages', async () => {
let emails = await client.getUnreadEmails();
assert.deepEqual(emails, []);
});
it('returns email when there is a message', async () => {
response.data.messages = ['123'];
gmail.users.messages.get.returns({
data: {
id: '123',
labelIds: ['trash'],
snippet: 'snippet',
payload: {
headers: [
{ name: 'Subject', value: 'subject' },
{ name: 'From', value: 'spammer' }
],
body: {
size: 4,
data: 'c3BhbQ=='
}
}
}
});
let emails = await client.getUnreadEmails();
let email = new Email();
email.id = '123';
email.from = 'spammer';
email.labels = ['trash'];
email.snippet = 'snippet';
email.subject = 'subject';
email.body = 'spam';
assert.deepEqual(emails, [email]);
});
it('can read body in parts', async () => {
response.data.messages = ['123'];
gmail.users.messages.get.returns({
data: {
id: '123',
labelIds: ['trash'],
snippet: 'snippet',
payload: {
headers: [
{ name: 'Subject', value: 'subject' },
{ name: 'From', value: 'spammer' }
],
parts: [
{
body: {
size: 4,
data: 'c3BhbQ=='
},
}
]
}
}
});
let emails = await client.getUnreadEmails();
assert.equal(emails.length, 1);
assert.deepEqual(emails[0].body, 'spam');
});
});
describe('deleteEmails', () => {
it('throws when fails', (done) => {
gmail.users.messages.batchDelete.returns(Promise.reject(Error('test')));
client.deleteEmails([])
.then(() => {
assert.fail('deleteEmails should throw');
}).catch(err => {
assert.match(err.message, /Failed to delete messages: Error: test/);
done();
});
});
it('sends email ids', async () => {
gmail.users.messages.batchDelete.returns(Promise.resolve());
await client.deleteEmails([{ id: '123' }])
let args = { userId: 'me', ids: ['123'] };
sinon.assert.calledWith(gmail.users.messages.batchDelete, args);
});
});
});