throw error if MailDev doesn't run

also allow calling in multiple file
pull/1498/head
Josh Morel 2018-12-15 08:51:51 -05:00 committed by Chocobozzz
parent 8fc58cb580
commit af37210c0b
4 changed files with 76 additions and 19 deletions

View File

@ -20,7 +20,7 @@ import {
ServerInfo,
setAccessTokensToServers
} from '../../../../shared/utils'
import { mockSmtpServer } from '../../../../shared/utils/miscs/email'
import { MockSmtpServer } from '../../../../shared/utils/miscs/email'
import { waitJobs } from '../../../../shared/utils/server/jobs'
const expect = chai.expect
@ -41,7 +41,7 @@ describe('Test emails', function () {
before(async function () {
this.timeout(30000)
await mockSmtpServer(emails)
await MockSmtpServer.Instance.collectEmails(emails)
await flushTests()

View File

@ -7,7 +7,7 @@ import {
userLogin, login, runServer, ServerInfo, verifyEmail, updateCustomSubConfig
} from '../../../../shared/utils'
import { setAccessTokensToServers } from '../../../../shared/utils/users/login'
import { mockSmtpServer } from '../../../../shared/utils/miscs/email'
import { MockSmtpServer } from '../../../../shared/utils/miscs/email'
import { waitJobs } from '../../../../shared/utils/server/jobs'
const expect = chai.expect
@ -30,7 +30,7 @@ describe('Test users account verification', function () {
before(async function () {
this.timeout(30000)
await mockSmtpServer(emails)
await MockSmtpServer.Instance.collectEmails(emails)
await flushTests()

View File

@ -0,0 +1,27 @@
const MailDev = require('maildev')
// must run maildev as forked ChildProcess
// failed instantiation stops main process with exit code 0
process.on('message', (msg) => {
if (msg.start) {
const maildev = new MailDev({
ip: '127.0.0.1',
smtp: 1025,
disableWeb: true,
silent: true
})
maildev.on('new', email => {
process.send({ email })
})
maildev.listen(err => {
if (err) {
// cannot send as Error object
return process.send({ err: err.message })
}
return process.send({ err: null })
})
}
})

View File

@ -1,25 +1,55 @@
import * as MailDev from 'maildev'
import * as child from 'child_process'
function mockSmtpServer (emailsCollection: object[]) {
const maildev = new MailDev({
ip: '127.0.0.1',
smtp: 1025,
disableWeb: true,
silent: true
})
maildev.on('new', email => emailsCollection.push(email))
class MockSmtpServer {
return new Promise((res, rej) => {
maildev.listen(err => {
if (err) return rej(err)
private static instance: MockSmtpServer
private started = false
private emailChildProcess: child.ChildProcess
private emails: object[]
return res()
private constructor () {
this.emailChildProcess = child.fork(`${__dirname}/email-child-process`, [], { silent: true })
this.emailChildProcess.on('message', (msg) => {
if (msg.email) {
return this.emails.push(msg.email)
}
})
})
process.on('exit', () => {
this.emailChildProcess.kill()
})
}
collectEmails (emailsCollection: object[]) {
return new Promise((res, rej) => {
if (this.started) {
this.emails = emailsCollection
return res()
}
// ensure maildev isn't started until
// unexpected exit can be reported to test runner
this.emailChildProcess.send({ start: true })
this.emailChildProcess.on('exit', () => {
return rej(new Error('maildev exited unexpectedly, confirm port not in use'))
})
this.emailChildProcess.on('message', (msg) => {
if (msg.err) {
return rej(new Error(msg.err))
}
this.started = true
this.emails = emailsCollection
return res()
})
})
}
static get Instance () {
return this.instance || (this.instance = new this())
}
}
// ---------------------------------------------------------------------------
export {
mockSmtpServer
MockSmtpServer
}