211 lines
6.2 KiB
JavaScript

const Request = require('./request');
class MailosaurCommands {
static get cypressCommands() {
return [
'mailosaurSetApiKey',
'mailosaurListServers',
'mailosaurCreateServer',
'mailosaurGetServer',
'mailosaurGetServerPassword',
'mailosaurUpdateServer',
'mailosaurDeleteServer',
'mailosaurListMessages',
'mailosaurCreateMessage',
'mailosaurGetMessage',
'mailosaurGetMessageById',
'mailosaurSearchMessages',
'mailosaurGetMessagesBySubject',
'mailosaurGetMessagesByBody',
'mailosaurGetMessagesBySentFrom',
'mailosaurGetMessagesBySentTo',
'mailosaurDeleteMessage',
'mailosaurDeleteAllMessages',
'mailosaurDownloadAttachment',
'mailosaurDownloadMessage',
'mailosaurGetSpamAnalysis',
'mailosaurGenerateEmailAddress'
];
}
constructor() {
const defaultApiKey = Cypress.env('MAILOSAUR_API_KEY');
this.mailosaurSetApiKey(defaultApiKey);
}
mailosaurSetApiKey(apiKey) {
this.request = new Request({ apiKey, baseUrl: Cypress.env('MAILOSAUR_BASE_URL') });
}
mailosaurListServers() {
return this.request.get(`api/servers`);
}
mailosaurCreateServer(params) {
return this.request.post(`api/servers`, params);
}
mailosaurGetServer(serverId) {
return this.request.get(`api/servers/${serverId}`);
}
mailosaurGetServerPassword(serverId) {
return this.request.get(`api/servers/${serverId}/password`)
.then((result) => (result.value));
}
mailosaurUpdateServer(server) {
return this.request.put(`api/servers/${server.id}`, server);
}
mailosaurDeleteServer(serverId) {
return this.request.del(`api/servers/${serverId}`);
}
mailosaurDeleteAllMessages(serverId) {
return this.request.del(`api/messages?server=${serverId}`);
}
mailosaurListMessages(serverId) {
return this.request.get(`api/messages?server=${serverId}`);
}
mailosaurCreateMessage(serverId) {
return this.request.post(`api/messages?server=${serverId}`, {});
}
mailosaurGetMessage(server, criteria, options = {}) {
// Only return 1 result
options.page = 0;
options.itemsPerPage = 1;
// Default timeout to 10s
options.timeout = options.timeout || 10000; // eslint-disable-line no-param-reassign
// Default receivedAfter to 1h
options.receivedAfter = options.receivedAfter || new Date(Date.now() - 3600000); // eslint-disable-line no-param-reassign
return cy.mailosaurSearchMessages(server, criteria, options)
.then((result) => (
cy.mailosaurGetMessageById(result.items[0].id)
));
}
mailosaurGetMessageById(messageId) {
return this.request.get(`api/messages/${messageId}`);
}
mailosaurSearchMessages(serverId, searchCriteria, options = {}) {
let pollCount = 0;
const startTime = Date.now();
const qs = {
server: serverId,
page: options.page,
itemsPerPage: options.itemsPerPage,
receivedAfter: options.receivedAfter
};
if (!Number.isInteger(options.timeout)) {
options.timeout = 0; // eslint-disable-line no-param-reassign
}
if (typeof options.errorOnTimeout !== 'boolean') {
options.errorOnTimeout = true; // eslint-disable-line no-param-reassign
}
const fn = (resolve, reject) => () => {
const reqOptions = this.request.buildOptions('POST', `api/messages/search`);
reqOptions.qs = qs;
reqOptions.json = searchCriteria;
return Cypress.backend('http:request', reqOptions)
.timeout(10000)
.then((result) => {
const { body, status, headers } = result;
switch (status) {
case 200:
break;
case 400:
return reject(new Error(JSON.stringify(result.body)));
case 401:
return reject(new Error('Cannot authenticate with Mailosaur (401). Please check your API key.'));
default:
return reject(new Error(`Status: ${status}, Result: ${JSON.stringify(result)}`));
}
if (options.timeout && !body.items.length) {
const delayPattern = (headers['x-ms-delay'] || '1000')
.split(',')
.map(x => parseInt(x, 10));
const delay = (pollCount >= delayPattern.length) ?
delayPattern[delayPattern.length - 1] :
delayPattern[pollCount];
pollCount += 1;
// Stop if timeout will be exceeded
if (((Date.now() - startTime) + delay) > options.timeout) {
return (options.errorOnTimeout === false) ?
resolve(body) :
reject(new Error('No matching messages found in time. By default, only messages received in the last hour are checked (use receivedAfter to override this).'));
}
return setTimeout(fn(resolve, reject), delay);
}
resolve(body);
});
};
cy.wrap(new Cypress.Promise((resolve, reject) => {
fn(resolve, reject)();
}), {
log: false,
timeout: options.timeout + 10000
});
}
mailosaurGetMessagesBySubject(serverId, subject) {
return cy.mailosaurSearchMessages(serverId, { subject });
}
mailosaurGetMessagesByBody(serverId, body) {
return cy.mailosaurSearchMessages(serverId, { body });
}
mailosaurGetMessagesBySentFrom(serverId, sentFrom) {
return cy.mailosaurSearchMessages(serverId, { sentFrom });
}
mailosaurGetMessagesBySentTo(serverId, sentTo) {
return cy.mailosaurSearchMessages(serverId, { sentTo });
}
mailosaurDownloadAttachment(attachmentId) {
return this.request.get(`api/files/attachments/${attachmentId}`);
}
mailosaurDownloadMessage(messageId) {
return this.request.get(`api/files/email/${messageId}`);
}
mailosaurDeleteMessage(messageId) {
return this.request.del(`api/messages/${messageId}`);
}
mailosaurGetSpamAnalysis(messageId) {
return this.request.get(`api/analysis/spam/${messageId}`);
}
mailosaurGenerateEmailAddress(serverId) {
const host = Cypress.env('MAILOSAUR_SMTP_HOST') || 'mailosaur.net';
const random = (Math.random() + 1).toString(36).substring(7);
return cy.wrap(`${random}@${serverId}.${host}`);
}
}
module.exports = MailosaurCommands;