joblog="$jobname-ci.log"
parallel -j $jobs --retries $retries \
- "echo Trying {} >> $joblog; npm run mocha -- -c --timeout 30000 --exit --require ts-node/register --require tsconfig-paths/register --bail {}" \
+ "echo Trying {} >> $joblog; npm run mocha -- -c --timeout 30000 --exit --require ./dist/server/tests/register.js --bail {}" \
::: $files
cat "$joblog" | uniq -c
}
findTestFiles () {
- find $1 -type f -name "*.ts" | grep -v "/index.ts" | xargs echo
+ find $1 -type f -name "*.js" | grep -v "/index.js" | xargs echo
}
if [ "$1" = "misc" ]; then
npm run build
- feedsFiles=$(findTestFiles server/tests/feeds)
- helperFiles=$(findTestFiles server/tests/helpers)
- pluginsFiles=$(findTestFiles server/tests/plugins)
- miscFiles="server/tests/client.ts server/tests/misc-endpoints.ts"
+ feedsFiles=$(findTestFiles ./dist/server/tests/feeds)
+ helperFiles=$(findTestFiles ./dist/server/tests/helpers)
+ pluginsFiles=$(findTestFiles ./dist/server/tests/plugins)
+ miscFiles="./dist/server/tests/client.js ./dist/server/tests/misc-endpoints.js"
- MOCHA_PARALLEL=true TS_NODE_FILES=true runTest "$1" 2 $feedsFiles $helperFiles $pluginsFiles $miscFiles
+ MOCHA_PARALLEL=true runTest "$1" 2 $feedsFiles $helperFiles $pluginsFiles $miscFiles
elif [ "$1" = "cli" ]; then
npm run build:server
npm run setup:cli
- cliFiles=$(findTestFiles server/tests/cli)
+ cliFiles=$(findTestFiles ./dist/server/tests/cli)
runTest "$1" 1 $cliFiles
elif [ "$1" = "api-1" ]; then
npm run build:server
- checkParamFiles=$(findTestFiles server/tests/api/check-params)
- notificationsFiles=$(findTestFiles server/tests/api/notifications)
- searchFiles=$(findTestFiles server/tests/api/search)
+ checkParamFiles=$(findTestFiles ./dist/server/tests/api/check-params)
+ notificationsFiles=$(findTestFiles ./dist/server/tests/api/notifications)
+ searchFiles=$(findTestFiles ./dist/server/tests/api/search)
MOCHA_PARALLEL=true runTest "$1" 3 $notificationsFiles $searchFiles $checkParamFiles
elif [ "$1" = "api-2" ]; then
npm run build:server
- serverFiles=$(findTestFiles server/tests/api/server)
- usersFiles=$(findTestFiles server/tests/api/users)
- liveFiles=$(findTestFiles server/tests/api/live)
+ serverFiles=$(findTestFiles ./dist/server/tests/api/server)
+ usersFiles=$(findTestFiles ./dist/server/tests/api/users)
+ liveFiles=$(findTestFiles ./dist/server/tests/api/live)
MOCHA_PARALLEL=true runTest "$1" 3 $serverFiles $usersFiles $liveFiles
elif [ "$1" = "api-3" ]; then
npm run build:server
- videosFiles=$(findTestFiles server/tests/api/videos)
+ videosFiles=$(findTestFiles ./dist/server/tests/api/videos)
MOCHA_PARALLEL=true runTest "$1" 3 $videosFiles
elif [ "$1" = "api-4" ]; then
npm run build:server
- moderationFiles=$(findTestFiles server/tests/api/moderation)
- redundancyFiles=$(findTestFiles server/tests/api/redundancy)
- activitypubFiles=$(findTestFiles server/tests/api/activitypub)
+ moderationFiles=$(findTestFiles ./dist/server/tests/api/moderation)
+ redundancyFiles=$(findTestFiles ./dist/server/tests/api/redundancy)
+ activitypubFiles=$(findTestFiles ./dist/server/tests/api/activitypub)
MOCHA_PARALLEL=true TS_NODE_FILES=true runTest "$1" 2 $moderationFiles $redundancyFiles $activitypubFiles
elif [ "$1" = "external-plugins" ]; then
npm run build:server
- externalPluginsFiles=$(findTestFiles server/tests/external-plugins)
+ externalPluginsFiles=$(findTestFiles ./dist/server/tests/external-plugins)
runTest "$1" 1 $externalPluginsFiles
elif [ "$1" = "lint" ]; then
- npm run eslint -- --ext .ts "server/**/*.ts" "shared/**/*.ts" "scripts/**/*.ts"
+ npm run eslint -- --ext .ts "./server/**/*.ts" "shared/**/*.ts" "scripts/**/*.ts"
npm run swagger-cli -- validate support/doc/api/openapi.yaml
( cd client
import { isHTTPSignatureVerified, isJsonLDSignatureVerified, parseHTTPSignature } from '../../../helpers/peertube-crypto'
import { cloneDeep } from 'lodash'
import { buildSignedActivity } from '../../../helpers/activitypub'
+import { buildAbsoluteFixturePath } from '@shared/extra-utils'
describe('Test activity pub helpers', function () {
describe('When checking the Linked Signature', function () {
it('Should fail with an invalid Mastodon signature', async function () {
- const body = require('./json/mastodon/create-bad-signature.json')
- const publicKey = require('./json/mastodon/public-key.json').publicKey
+ const body = require(buildAbsoluteFixturePath('./ap-json/mastodon/create-bad-signature.json'))
+ const publicKey = require(buildAbsoluteFixturePath('./ap-json/mastodon/public-key.json')).publicKey
const fromActor = { publicKey, url: 'http://localhost:9002/accounts/peertube' }
const result = await isJsonLDSignatureVerified(fromActor as any, body)
})
it('Should fail with an invalid public key', async function () {
- const body = require('./json/mastodon/create.json')
- const publicKey = require('./json/mastodon/bad-public-key.json').publicKey
+ const body = require(buildAbsoluteFixturePath('./ap-json/mastodon/create.json'))
+ const publicKey = require(buildAbsoluteFixturePath('./ap-json/mastodon/bad-public-key.json')).publicKey
const fromActor = { publicKey, url: 'http://localhost:9002/accounts/peertube' }
const result = await isJsonLDSignatureVerified(fromActor as any, body)
})
it('Should succeed with a valid Mastodon signature', async function () {
- const body = require('./json/mastodon/create.json')
- const publicKey = require('./json/mastodon/public-key.json').publicKey
+ const body = require(buildAbsoluteFixturePath('./ap-json/mastodon/create.json'))
+ const publicKey = require(buildAbsoluteFixturePath('./ap-json/mastodon/public-key.json')).publicKey
const fromActor = { publicKey, url: 'http://localhost:9002/accounts/peertube' }
const result = await isJsonLDSignatureVerified(fromActor as any, body)
})
it('Should fail with an invalid PeerTube signature', async function () {
- const keys = require('./json/peertube/invalid-keys.json')
- const body = require('./json/peertube/announce-without-context.json')
+ const keys = require(buildAbsoluteFixturePath('./ap-json/peertube/invalid-keys.json'))
+ const body = require(buildAbsoluteFixturePath('./ap-json/peertube/announce-without-context.json'))
const actorSignature = { url: 'http://localhost:9002/accounts/peertube', privateKey: keys.privateKey }
const signedBody = await buildSignedActivity(actorSignature as any, body)
})
it('Should succeed with a valid PeerTube signature', async function () {
- const keys = require('./json/peertube/keys.json')
- const body = require('./json/peertube/announce-without-context.json')
+ const keys = require(buildAbsoluteFixturePath('./ap-json/peertube/keys.json'))
+ const body = require(buildAbsoluteFixturePath('./ap-json/peertube/announce-without-context.json'))
const actorSignature = { url: 'http://localhost:9002/accounts/peertube', privateKey: keys.privateKey }
const signedBody = await buildSignedActivity(actorSignature as any, body)
req.method = 'POST'
req.url = '/accounts/ronan/inbox'
- const mastodonObject = cloneDeep(require('./json/mastodon/bad-http-signature.json'))
+ const mastodonObject = cloneDeep(require(buildAbsoluteFixturePath('./ap-json/mastodon/bad-http-signature.json')))
req.body = mastodonObject.body
req.headers = mastodonObject.headers
const parsed = parseHTTPSignature(req, 3600 * 1000 * 365 * 10)
- const publicKey = require('./json/mastodon/public-key.json').publicKey
+ const publicKey = require(buildAbsoluteFixturePath('./ap-json/mastodon/public-key.json')).publicKey
const actor = { publicKey }
const verified = isHTTPSignatureVerified(parsed, actor as any)
req.method = 'POST'
req.url = '/accounts/ronan/inbox'
- const mastodonObject = cloneDeep(require('./json/mastodon/http-signature.json'))
+ const mastodonObject = cloneDeep(require(buildAbsoluteFixturePath('./ap-json/mastodon/http-signature.json')))
req.body = mastodonObject.body
req.headers = mastodonObject.headers
const parsed = parseHTTPSignature(req, 3600 * 1000 * 365 * 10)
- const publicKey = require('./json/mastodon/bad-public-key.json').publicKey
+ const publicKey = require(buildAbsoluteFixturePath('./ap-json/mastodon/bad-public-key.json')).publicKey
const actor = { publicKey }
const verified = isHTTPSignatureVerified(parsed, actor as any)
req.method = 'POST'
req.url = '/accounts/ronan/inbox'
- const mastodonObject = cloneDeep(require('./json/mastodon/http-signature.json'))
+ const mastodonObject = cloneDeep(require(buildAbsoluteFixturePath('./ap-json/mastodon/http-signature.json')))
req.body = mastodonObject.body
req.headers = mastodonObject.headers
req.method = 'POST'
req.url = '/accounts/ronan/inbox'
- const mastodonObject = cloneDeep(require('./json/mastodon/http-signature.json'))
+ const mastodonObject = cloneDeep(require(buildAbsoluteFixturePath('./ap-json/mastodon/http-signature.json')))
req.body = mastodonObject.body
req.headers = mastodonObject.headers
req.headers = 'Signature ' + mastodonObject.headers
req.method = 'POST'
req.url = '/accounts/ronan/inbox'
- const mastodonObject = cloneDeep(require('./json/mastodon/http-signature.json'))
+ const mastodonObject = cloneDeep(require(buildAbsoluteFixturePath('./ap-json/mastodon/http-signature.json')))
req.body = mastodonObject.body
req.headers = mastodonObject.headers
const parsed = parseHTTPSignature(req, 3600 * 1000 * 365 * 10)
- const publicKey = require('./json/mastodon/public-key.json').publicKey
+ const publicKey = require(buildAbsoluteFixturePath('./ap-json/mastodon/public-key.json')).publicKey
const actor = { publicKey }
const verified = isHTTPSignatureVerified(parsed, actor as any)
import { buildDigest } from '@server/helpers/peertube-crypto'
import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
import {
+ buildAbsoluteFixturePath,
cleanupTests,
closeAllSequelize,
flushAndRunMultipleServers,
}
function getAnnounceWithoutContext (server: ServerInfo) {
- const json = require('./json/peertube/announce-without-context.json')
+ const json = require(buildAbsoluteFixturePath('./ap-json/peertube/announce-without-context.json'))
const result: typeof json = {}
for (const key of Object.keys(json)) {
let servers: ServerInfo[]
let url: string
- const keys = require('./json/peertube/keys.json')
- const invalidKeys = require('./json/peertube/invalid-keys.json')
+ const keys = require(buildAbsoluteFixturePath('./ap-json/peertube/keys.json'))
+ const invalidKeys = require(buildAbsoluteFixturePath('./ap-json/peertube/invalid-keys.json'))
const baseHttpSignature = () => ({
algorithm: HTTP_SIGNATURE.ALGORITHM,
authorizationHeaderName: HTTP_SIGNATURE.HEADER_NAME,
import 'mocha'
import { omit } from 'lodash'
-import { join } from 'path'
import { LiveVideo, VideoPrivacy } from '@shared/models'
+import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
import {
+ buildAbsoluteFixturePath,
cleanupTests,
createUser,
flushAndRunServer,
userLogin,
waitUntilLivePublished
} from '../../../../shared/extra-utils'
-import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
describe('Test video lives API validator', function () {
const path = '/api/v1/videos/live'
it('Should fail with an incorrect thumbnail file', async function () {
const fields = baseCorrectParams
const attaches = {
- thumbnailfile: join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
+ thumbnailfile: buildAbsoluteFixturePath('video_short.mp4')
}
await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
it('Should fail with a big thumbnail file', async function () {
const fields = baseCorrectParams
const attaches = {
- thumbnailfile: join(__dirname, '..', '..', 'fixtures', 'preview-big.png')
+ thumbnailfile: buildAbsoluteFixturePath('preview-big.png')
}
await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
it('Should fail with an incorrect preview file', async function () {
const fields = baseCorrectParams
const attaches = {
- previewfile: join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
+ previewfile: buildAbsoluteFixturePath('video_short.mp4')
}
await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
it('Should fail with a big preview file', async function () {
const fields = baseCorrectParams
const attaches = {
- previewfile: join(__dirname, '..', '..', 'fixtures', 'preview-big.png')
+ previewfile: buildAbsoluteFixturePath('preview-big.png')
}
await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
import 'mocha'
import { omit } from 'lodash'
-import { join } from 'path'
import { User, UserRole } from '../../../../shared'
import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
import {
addVideoChannel,
blockUser,
+ buildAbsoluteFixturePath,
cleanupTests,
createUser,
deleteMe,
it('Should fail without an incorrect input file', async function () {
const fields = {}
const attaches = {
- avatarfile: join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
+ avatarfile: buildAbsoluteFixturePath('video_short.mp4')
}
await makeUploadRequest({ url: server.url, path: path + '/me/avatar/pick', token: server.accessToken, fields, attaches })
})
it('Should fail with a big file', async function () {
const fields = {}
const attaches = {
- avatarfile: join(__dirname, '..', '..', 'fixtures', 'avatar-big.png')
+ avatarfile: buildAbsoluteFixturePath('avatar-big.png')
}
await makeUploadRequest({ url: server.url, path: path + '/me/avatar/pick', token: server.accessToken, fields, attaches })
})
it('Should fail with an unauthenticated user', async function () {
const fields = {}
const attaches = {
- avatarfile: join(__dirname, '..', '..', 'fixtures', 'avatar.png')
+ avatarfile: buildAbsoluteFixturePath('avatar.png')
}
await makeUploadRequest({
url: server.url,
it('Should succeed with the correct params', async function () {
const fields = {}
const attaches = {
- avatarfile: join(__dirname, '..', '..', 'fixtures', 'avatar.png')
+ avatarfile: buildAbsoluteFixturePath('avatar.png')
}
await makeUploadRequest({
url: server.url,
/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
import 'mocha'
+
+import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
import {
+ buildAbsoluteFixturePath,
cleanupTests,
createUser,
flushAndRunServer,
uploadVideo,
userLogin
} from '../../../../shared/extra-utils'
-import { join } from 'path'
import { createVideoCaption } from '../../../../shared/extra-utils/videos/video-captions'
-import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
describe('Test video captions API validator', function () {
const path = '/api/v1/videos/'
describe('When adding video caption', function () {
const fields = { }
const attaches = {
- captionfile: join(__dirname, '..', '..', 'fixtures', 'subtitle-good1.vtt')
+ captionfile: buildAbsoluteFixturePath('subtitle-good1.vtt')
}
it('Should fail without a valid uuid', async function () {
// We accept any file now
// it('Should fail with an invalid captionfile extension', async function () {
// const attaches = {
- // 'captionfile': join(__dirname, '..', '..', 'fixtures', 'subtitle-bad.txt')
+ // 'captionfile': buildAbsoluteFixturePath('subtitle-bad.txt')
// }
//
// const captionPath = path + videoUUID + '/captions/fr'
// We don't check the file validity yet
// it('Should fail with an invalid captionfile srt', async function () {
// const attaches = {
- // 'captionfile': join(__dirname, '..', '..', 'fixtures', 'subtitle-bad.srt')
+ // 'captionfile': buildAbsoluteFixturePath('subtitle-bad.srt')
// }
//
// const captionPath = path + videoUUID + '/captions/fr'
/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
+import 'mocha'
import * as chai from 'chai'
import { omit } from 'lodash'
-import 'mocha'
+import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
import {
+ buildAbsoluteFixturePath,
cleanupTests,
createUser,
deleteVideoChannel,
checkBadSortPagination,
checkBadStartPagination
} from '../../../../shared/extra-utils/requests/check-api-params'
-import { join } from 'path'
import { VideoChannelUpdate } from '../../../../shared/models/videos'
-import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
const expect = chai.expect
for (const type of types) {
const fields = {}
const attaches = {
- [type + 'file']: join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
+ [type + 'file']: buildAbsoluteFixturePath('video_short.mp4')
}
await makeUploadRequest({ url: server.url, path: `${path}/${type}/pick`, token: server.accessToken, fields, attaches })
for (const type of types) {
const fields = {}
const attaches = {
- [type + 'file']: join(__dirname, '..', '..', 'fixtures', 'avatar-big.png')
+ [type + 'file']: buildAbsoluteFixturePath('avatar-big.png')
}
await makeUploadRequest({ url: server.url, path: `${path}/${type}/pick`, token: server.accessToken, fields, attaches })
}
for (const type of types) {
const fields = {}
const attaches = {
- [type + 'file']: join(__dirname, '..', '..', 'fixtures', 'avatar.png')
+ [type + 'file']: buildAbsoluteFixturePath('avatar.png')
}
await makeUploadRequest({
url: server.url,
for (const type of types) {
const fields = {}
const attaches = {
- [type + 'file']: join(__dirname, '..', '..', 'fixtures', 'avatar.png')
+ [type + 'file']: buildAbsoluteFixturePath('avatar.png')
}
await makeUploadRequest({
url: server.url,
import 'mocha'
import { omit } from 'lodash'
-import { join } from 'path'
+import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
import {
+ buildAbsoluteFixturePath,
cleanupTests,
createUser,
flushAndRunServer,
checkBadSortPagination,
checkBadStartPagination
} from '../../../../shared/extra-utils/requests/check-api-params'
-import { getMagnetURI, getGoodVideoUrl } from '../../../../shared/extra-utils/videos/video-imports'
+import { getGoodVideoUrl, getMagnetURI } from '../../../../shared/extra-utils/videos/video-imports'
import { VideoPrivacy } from '../../../../shared/models/videos/video-privacy.enum'
-import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
describe('Test video imports API validator', function () {
const path = '/api/v1/videos/imports'
it('Should fail with an incorrect thumbnail file', async function () {
const fields = baseCorrectParams
const attaches = {
- thumbnailfile: join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
+ thumbnailfile: buildAbsoluteFixturePath('video_short.mp4')
}
await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
it('Should fail with a big thumbnail file', async function () {
const fields = baseCorrectParams
const attaches = {
- thumbnailfile: join(__dirname, '..', '..', 'fixtures', 'preview-big.png')
+ thumbnailfile: buildAbsoluteFixturePath('preview-big.png')
}
await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
it('Should fail with an incorrect preview file', async function () {
const fields = baseCorrectParams
const attaches = {
- previewfile: join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
+ previewfile: buildAbsoluteFixturePath('video_short.mp4')
}
await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
it('Should fail with a big preview file', async function () {
const fields = baseCorrectParams
const attaches = {
- previewfile: join(__dirname, '..', '..', 'fixtures', 'preview-big.png')
+ previewfile: buildAbsoluteFixturePath('preview-big.png')
}
await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
it('Should fail with an invalid torrent file', async function () {
const fields = omit(baseCorrectParams, 'targetUrl')
const attaches = {
- torrentfile: join(__dirname, '..', '..', 'fixtures', 'avatar-big.png')
+ torrentfile: buildAbsoluteFixturePath('avatar-big.png')
}
await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
fields = omit(fields, 'magnetUri')
const attaches = {
- torrentfile: join(__dirname, '..', '..', 'fixtures', 'video-720p.torrent')
+ torrentfile: buildAbsoluteFixturePath('video-720p.torrent')
}
await makeUploadRequest({
})
it('Should not be able to send another contact form because of the anti spam checker', async function () {
+ this.timeout(10000)
+
+ await wait(1000)
+
await sendContactForm({
url: server.url,
fromEmail: 'toto@example.com',
import 'mocha'
import * as chai from 'chai'
-import { join } from 'path'
import * as request from 'supertest'
import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
import {
addVideoChannel,
+ buildAbsoluteFixturePath,
checkTmpIsEmpty,
checkVideoFilesWereRemoved,
cleanupTests,
.field('privacy', '1')
.field('channelId', '1')
- const filePath = join(__dirname, '..', '..', 'fixtures', 'video_short.webm')
-
- await req.attach('videofile', filePath)
+ await req.attach('videofile', buildAbsoluteFixturePath('video_short.webm'))
.expect(HttpStatusCode.OK_200)
await waitJobs(servers)
})
it('Should blacklist on remote upload', async function () {
- this.timeout(60000)
+ this.timeout(120000)
const res = await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'remote please blacklist me' })
await waitJobs(servers)
})
it('Should blacklist on remote update', async function () {
- this.timeout(60000)
+ this.timeout(120000)
const res = await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'video' })
await waitJobs(servers)
--- /dev/null
+import { registerTSPaths } from '../helpers/register-ts-paths'
+
+registerTSPaths()
+++ /dev/null
-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: msg.port,
- 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 })
- })
- }
-})
-import { ChildProcess, fork } from 'child_process'
-import { join } from 'path'
+import { ChildProcess } from 'child_process'
import { randomInt } from '../../core-utils/miscs/miscs'
import { parallelTests } from '../server/servers'
+const MailDev = require('maildev')
+
class MockSmtpServer {
private static instance: MockSmtpServer
private emailChildProcess: ChildProcess
private emails: object[]
- private constructor () {
- this.emailChildProcess = fork(join(__dirname, 'email-child-process'), [])
-
- this.emailChildProcess.on('message', (msg: any) => {
- if (msg.email) {
- return this.emails.push(msg.email)
- }
- })
-
- process.on('exit', () => this.kill())
- }
+ private constructor () { }
collectEmails (emailsCollection: object[]) {
return new Promise<number>((res, rej) => {
const port = parallelTests() ? randomInt(1000, 2000) : 1025
+ this.emails = emailsCollection
if (this.started) {
- this.emails = emailsCollection
return res(undefined)
}
- // ensure maildev isn't started until
- // unexpected exit can be reported to test runner
- this.emailChildProcess.send({ start: true, port })
- this.emailChildProcess.on('exit', () => {
- return rej(new Error('maildev exited unexpectedly, confirm port not in use'))
+ const maildev = new MailDev({
+ ip: '127.0.0.1',
+ smtp: port,
+ disableWeb: true,
+ silent: true
+ })
+
+ maildev.on('new', email => {
+ this.emails.push(email)
})
- this.emailChildProcess.on('message', (msg: any) => {
- if (msg.err) return rej(new Error(msg.err))
+
+ maildev.listen(err => {
+ if (err) return rej(err)
this.started = true
- this.emails = emailsCollection
return res(port)
})