aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2021-06-14 16:52:22 +0200
committerChocobozzz <chocobozzz@cpy.re>2021-06-15 08:21:12 +0200
commit3d470a530c4a48b2e4f4a9e7d4f223e14f32cea4 (patch)
tree7305399caecbf7380319bd08e21c933de88096dc
parent79db409a41bd28fd2773626c9a93b5d326a38bc0 (diff)
downloadPeerTube-3d470a530c4a48b2e4f4a9e7d4f223e14f32cea4.tar.gz
PeerTube-3d470a530c4a48b2e4f4a9e7d4f223e14f32cea4.tar.zst
PeerTube-3d470a530c4a48b2e4f4a9e7d4f223e14f32cea4.zip
Faster ci using compiled ts files
-rwxr-xr-xscripts/ci.sh40
-rw-r--r--server/tests/api/activitypub/helpers.ts37
-rw-r--r--server/tests/api/activitypub/security.ts7
-rw-r--r--server/tests/api/check-params/live.ts12
-rw-r--r--server/tests/api/check-params/users.ts10
-rw-r--r--server/tests/api/check-params/video-captions.ts11
-rw-r--r--server/tests/api/check-params/video-channels.ts14
-rw-r--r--server/tests/api/check-params/video-imports.ts18
-rw-r--r--server/tests/api/server/contact-form.ts4
-rw-r--r--server/tests/api/videos/multiple-servers.ts6
-rw-r--r--server/tests/fixtures/ap-json/mastodon/bad-body-http-signature.json (renamed from server/tests/api/activitypub/json/mastodon/bad-body-http-signature.json)0
-rw-r--r--server/tests/fixtures/ap-json/mastodon/bad-http-signature.json (renamed from server/tests/api/activitypub/json/mastodon/bad-http-signature.json)0
-rw-r--r--server/tests/fixtures/ap-json/mastodon/bad-public-key.json (renamed from server/tests/api/activitypub/json/mastodon/bad-public-key.json)0
-rw-r--r--server/tests/fixtures/ap-json/mastodon/create-bad-signature.json (renamed from server/tests/api/activitypub/json/mastodon/create-bad-signature.json)0
-rw-r--r--server/tests/fixtures/ap-json/mastodon/create.json (renamed from server/tests/api/activitypub/json/mastodon/create.json)0
-rw-r--r--server/tests/fixtures/ap-json/mastodon/http-signature.json (renamed from server/tests/api/activitypub/json/mastodon/http-signature.json)0
-rw-r--r--server/tests/fixtures/ap-json/mastodon/public-key.json (renamed from server/tests/api/activitypub/json/mastodon/public-key.json)0
-rw-r--r--server/tests/fixtures/ap-json/peertube/announce-without-context.json (renamed from server/tests/api/activitypub/json/peertube/announce-without-context.json)0
-rw-r--r--server/tests/fixtures/ap-json/peertube/invalid-keys.json (renamed from server/tests/api/activitypub/json/peertube/invalid-keys.json)0
-rw-r--r--server/tests/fixtures/ap-json/peertube/keys.json (renamed from server/tests/api/activitypub/json/peertube/keys.json)0
-rw-r--r--server/tests/plugins/filter-hooks.ts4
-rw-r--r--server/tests/register.ts3
-rw-r--r--shared/extra-utils/miscs/email-child-process.js27
-rw-r--r--shared/extra-utils/miscs/email.ts39
24 files changed, 104 insertions, 128 deletions
diff --git a/scripts/ci.sh b/scripts/ci.sh
index f4a200a00..7360a03ce 100755
--- a/scripts/ci.sh
+++ b/scripts/ci.sh
@@ -25,7 +25,7 @@ runTest () {
25 joblog="$jobname-ci.log" 25 joblog="$jobname-ci.log"
26 26
27 parallel -j $jobs --retries $retries \ 27 parallel -j $jobs --retries $retries \
28 "echo Trying {} >> $joblog; npm run mocha -- -c --timeout 30000 --exit --require ts-node/register --require tsconfig-paths/register --bail {}" \ 28 "echo Trying {} >> $joblog; npm run mocha -- -c --timeout 30000 --exit --require ./dist/server/tests/register.js --bail {}" \
29 ::: $files 29 ::: $files
30 30
31 cat "$joblog" | uniq -c 31 cat "$joblog" | uniq -c
@@ -33,63 +33,63 @@ runTest () {
33} 33}
34 34
35findTestFiles () { 35findTestFiles () {
36 find $1 -type f -name "*.ts" | grep -v "/index.ts" | xargs echo 36 find $1 -type f -name "*.js" | grep -v "/index.js" | xargs echo
37} 37}
38 38
39if [ "$1" = "misc" ]; then 39if [ "$1" = "misc" ]; then
40 npm run build 40 npm run build
41 41
42 feedsFiles=$(findTestFiles server/tests/feeds) 42 feedsFiles=$(findTestFiles ./dist/server/tests/feeds)
43 helperFiles=$(findTestFiles server/tests/helpers) 43 helperFiles=$(findTestFiles ./dist/server/tests/helpers)
44 pluginsFiles=$(findTestFiles server/tests/plugins) 44 pluginsFiles=$(findTestFiles ./dist/server/tests/plugins)
45 miscFiles="server/tests/client.ts server/tests/misc-endpoints.ts" 45 miscFiles="./dist/server/tests/client.js ./dist/server/tests/misc-endpoints.js"
46 46
47 MOCHA_PARALLEL=true TS_NODE_FILES=true runTest "$1" 2 $feedsFiles $helperFiles $pluginsFiles $miscFiles 47 MOCHA_PARALLEL=true runTest "$1" 2 $feedsFiles $helperFiles $pluginsFiles $miscFiles
48elif [ "$1" = "cli" ]; then 48elif [ "$1" = "cli" ]; then
49 npm run build:server 49 npm run build:server
50 npm run setup:cli 50 npm run setup:cli
51 51
52 cliFiles=$(findTestFiles server/tests/cli) 52 cliFiles=$(findTestFiles ./dist/server/tests/cli)
53 53
54 runTest "$1" 1 $cliFiles 54 runTest "$1" 1 $cliFiles
55elif [ "$1" = "api-1" ]; then 55elif [ "$1" = "api-1" ]; then
56 npm run build:server 56 npm run build:server
57 57
58 checkParamFiles=$(findTestFiles server/tests/api/check-params) 58 checkParamFiles=$(findTestFiles ./dist/server/tests/api/check-params)
59 notificationsFiles=$(findTestFiles server/tests/api/notifications) 59 notificationsFiles=$(findTestFiles ./dist/server/tests/api/notifications)
60 searchFiles=$(findTestFiles server/tests/api/search) 60 searchFiles=$(findTestFiles ./dist/server/tests/api/search)
61 61
62 MOCHA_PARALLEL=true runTest "$1" 3 $notificationsFiles $searchFiles $checkParamFiles 62 MOCHA_PARALLEL=true runTest "$1" 3 $notificationsFiles $searchFiles $checkParamFiles
63elif [ "$1" = "api-2" ]; then 63elif [ "$1" = "api-2" ]; then
64 npm run build:server 64 npm run build:server
65 65
66 serverFiles=$(findTestFiles server/tests/api/server) 66 serverFiles=$(findTestFiles ./dist/server/tests/api/server)
67 usersFiles=$(findTestFiles server/tests/api/users) 67 usersFiles=$(findTestFiles ./dist/server/tests/api/users)
68 liveFiles=$(findTestFiles server/tests/api/live) 68 liveFiles=$(findTestFiles ./dist/server/tests/api/live)
69 69
70 MOCHA_PARALLEL=true runTest "$1" 3 $serverFiles $usersFiles $liveFiles 70 MOCHA_PARALLEL=true runTest "$1" 3 $serverFiles $usersFiles $liveFiles
71elif [ "$1" = "api-3" ]; then 71elif [ "$1" = "api-3" ]; then
72 npm run build:server 72 npm run build:server
73 73
74 videosFiles=$(findTestFiles server/tests/api/videos) 74 videosFiles=$(findTestFiles ./dist/server/tests/api/videos)
75 75
76 MOCHA_PARALLEL=true runTest "$1" 3 $videosFiles 76 MOCHA_PARALLEL=true runTest "$1" 3 $videosFiles
77elif [ "$1" = "api-4" ]; then 77elif [ "$1" = "api-4" ]; then
78 npm run build:server 78 npm run build:server
79 79
80 moderationFiles=$(findTestFiles server/tests/api/moderation) 80 moderationFiles=$(findTestFiles ./dist/server/tests/api/moderation)
81 redundancyFiles=$(findTestFiles server/tests/api/redundancy) 81 redundancyFiles=$(findTestFiles ./dist/server/tests/api/redundancy)
82 activitypubFiles=$(findTestFiles server/tests/api/activitypub) 82 activitypubFiles=$(findTestFiles ./dist/server/tests/api/activitypub)
83 83
84 MOCHA_PARALLEL=true TS_NODE_FILES=true runTest "$1" 2 $moderationFiles $redundancyFiles $activitypubFiles 84 MOCHA_PARALLEL=true TS_NODE_FILES=true runTest "$1" 2 $moderationFiles $redundancyFiles $activitypubFiles
85elif [ "$1" = "external-plugins" ]; then 85elif [ "$1" = "external-plugins" ]; then
86 npm run build:server 86 npm run build:server
87 87
88 externalPluginsFiles=$(findTestFiles server/tests/external-plugins) 88 externalPluginsFiles=$(findTestFiles ./dist/server/tests/external-plugins)
89 89
90 runTest "$1" 1 $externalPluginsFiles 90 runTest "$1" 1 $externalPluginsFiles
91elif [ "$1" = "lint" ]; then 91elif [ "$1" = "lint" ]; then
92 npm run eslint -- --ext .ts "server/**/*.ts" "shared/**/*.ts" "scripts/**/*.ts" 92 npm run eslint -- --ext .ts "./server/**/*.ts" "shared/**/*.ts" "scripts/**/*.ts"
93 npm run swagger-cli -- validate support/doc/api/openapi.yaml 93 npm run swagger-cli -- validate support/doc/api/openapi.yaml
94 94
95 ( cd client 95 ( cd client
diff --git a/server/tests/api/activitypub/helpers.ts b/server/tests/api/activitypub/helpers.ts
index 60d95b823..66d7631b7 100644
--- a/server/tests/api/activitypub/helpers.ts
+++ b/server/tests/api/activitypub/helpers.ts
@@ -6,13 +6,14 @@ import { buildRequestStub } from '../../../../shared/extra-utils/miscs/stubs'
6import { isHTTPSignatureVerified, isJsonLDSignatureVerified, parseHTTPSignature } from '../../../helpers/peertube-crypto' 6import { isHTTPSignatureVerified, isJsonLDSignatureVerified, parseHTTPSignature } from '../../../helpers/peertube-crypto'
7import { cloneDeep } from 'lodash' 7import { cloneDeep } from 'lodash'
8import { buildSignedActivity } from '../../../helpers/activitypub' 8import { buildSignedActivity } from '../../../helpers/activitypub'
9import { buildAbsoluteFixturePath } from '@shared/extra-utils'
9 10
10describe('Test activity pub helpers', function () { 11describe('Test activity pub helpers', function () {
11 describe('When checking the Linked Signature', function () { 12 describe('When checking the Linked Signature', function () {
12 13
13 it('Should fail with an invalid Mastodon signature', async function () { 14 it('Should fail with an invalid Mastodon signature', async function () {
14 const body = require('./json/mastodon/create-bad-signature.json') 15 const body = require(buildAbsoluteFixturePath('./ap-json/mastodon/create-bad-signature.json'))
15 const publicKey = require('./json/mastodon/public-key.json').publicKey 16 const publicKey = require(buildAbsoluteFixturePath('./ap-json/mastodon/public-key.json')).publicKey
16 const fromActor = { publicKey, url: 'http://localhost:9002/accounts/peertube' } 17 const fromActor = { publicKey, url: 'http://localhost:9002/accounts/peertube' }
17 18
18 const result = await isJsonLDSignatureVerified(fromActor as any, body) 19 const result = await isJsonLDSignatureVerified(fromActor as any, body)
@@ -21,8 +22,8 @@ describe('Test activity pub helpers', function () {
21 }) 22 })
22 23
23 it('Should fail with an invalid public key', async function () { 24 it('Should fail with an invalid public key', async function () {
24 const body = require('./json/mastodon/create.json') 25 const body = require(buildAbsoluteFixturePath('./ap-json/mastodon/create.json'))
25 const publicKey = require('./json/mastodon/bad-public-key.json').publicKey 26 const publicKey = require(buildAbsoluteFixturePath('./ap-json/mastodon/bad-public-key.json')).publicKey
26 const fromActor = { publicKey, url: 'http://localhost:9002/accounts/peertube' } 27 const fromActor = { publicKey, url: 'http://localhost:9002/accounts/peertube' }
27 28
28 const result = await isJsonLDSignatureVerified(fromActor as any, body) 29 const result = await isJsonLDSignatureVerified(fromActor as any, body)
@@ -31,8 +32,8 @@ describe('Test activity pub helpers', function () {
31 }) 32 })
32 33
33 it('Should succeed with a valid Mastodon signature', async function () { 34 it('Should succeed with a valid Mastodon signature', async function () {
34 const body = require('./json/mastodon/create.json') 35 const body = require(buildAbsoluteFixturePath('./ap-json/mastodon/create.json'))
35 const publicKey = require('./json/mastodon/public-key.json').publicKey 36 const publicKey = require(buildAbsoluteFixturePath('./ap-json/mastodon/public-key.json')).publicKey
36 const fromActor = { publicKey, url: 'http://localhost:9002/accounts/peertube' } 37 const fromActor = { publicKey, url: 'http://localhost:9002/accounts/peertube' }
37 38
38 const result = await isJsonLDSignatureVerified(fromActor as any, body) 39 const result = await isJsonLDSignatureVerified(fromActor as any, body)
@@ -41,8 +42,8 @@ describe('Test activity pub helpers', function () {
41 }) 42 })
42 43
43 it('Should fail with an invalid PeerTube signature', async function () { 44 it('Should fail with an invalid PeerTube signature', async function () {
44 const keys = require('./json/peertube/invalid-keys.json') 45 const keys = require(buildAbsoluteFixturePath('./ap-json/peertube/invalid-keys.json'))
45 const body = require('./json/peertube/announce-without-context.json') 46 const body = require(buildAbsoluteFixturePath('./ap-json/peertube/announce-without-context.json'))
46 47
47 const actorSignature = { url: 'http://localhost:9002/accounts/peertube', privateKey: keys.privateKey } 48 const actorSignature = { url: 'http://localhost:9002/accounts/peertube', privateKey: keys.privateKey }
48 const signedBody = await buildSignedActivity(actorSignature as any, body) 49 const signedBody = await buildSignedActivity(actorSignature as any, body)
@@ -54,8 +55,8 @@ describe('Test activity pub helpers', function () {
54 }) 55 })
55 56
56 it('Should succeed with a valid PeerTube signature', async function () { 57 it('Should succeed with a valid PeerTube signature', async function () {
57 const keys = require('./json/peertube/keys.json') 58 const keys = require(buildAbsoluteFixturePath('./ap-json/peertube/keys.json'))
58 const body = require('./json/peertube/announce-without-context.json') 59 const body = require(buildAbsoluteFixturePath('./ap-json/peertube/announce-without-context.json'))
59 60
60 const actorSignature = { url: 'http://localhost:9002/accounts/peertube', privateKey: keys.privateKey } 61 const actorSignature = { url: 'http://localhost:9002/accounts/peertube', privateKey: keys.privateKey }
61 const signedBody = await buildSignedActivity(actorSignature as any, body) 62 const signedBody = await buildSignedActivity(actorSignature as any, body)
@@ -73,12 +74,12 @@ describe('Test activity pub helpers', function () {
73 req.method = 'POST' 74 req.method = 'POST'
74 req.url = '/accounts/ronan/inbox' 75 req.url = '/accounts/ronan/inbox'
75 76
76 const mastodonObject = cloneDeep(require('./json/mastodon/bad-http-signature.json')) 77 const mastodonObject = cloneDeep(require(buildAbsoluteFixturePath('./ap-json/mastodon/bad-http-signature.json')))
77 req.body = mastodonObject.body 78 req.body = mastodonObject.body
78 req.headers = mastodonObject.headers 79 req.headers = mastodonObject.headers
79 80
80 const parsed = parseHTTPSignature(req, 3600 * 1000 * 365 * 10) 81 const parsed = parseHTTPSignature(req, 3600 * 1000 * 365 * 10)
81 const publicKey = require('./json/mastodon/public-key.json').publicKey 82 const publicKey = require(buildAbsoluteFixturePath('./ap-json/mastodon/public-key.json')).publicKey
82 83
83 const actor = { publicKey } 84 const actor = { publicKey }
84 const verified = isHTTPSignatureVerified(parsed, actor as any) 85 const verified = isHTTPSignatureVerified(parsed, actor as any)
@@ -91,12 +92,12 @@ describe('Test activity pub helpers', function () {
91 req.method = 'POST' 92 req.method = 'POST'
92 req.url = '/accounts/ronan/inbox' 93 req.url = '/accounts/ronan/inbox'
93 94
94 const mastodonObject = cloneDeep(require('./json/mastodon/http-signature.json')) 95 const mastodonObject = cloneDeep(require(buildAbsoluteFixturePath('./ap-json/mastodon/http-signature.json')))
95 req.body = mastodonObject.body 96 req.body = mastodonObject.body
96 req.headers = mastodonObject.headers 97 req.headers = mastodonObject.headers
97 98
98 const parsed = parseHTTPSignature(req, 3600 * 1000 * 365 * 10) 99 const parsed = parseHTTPSignature(req, 3600 * 1000 * 365 * 10)
99 const publicKey = require('./json/mastodon/bad-public-key.json').publicKey 100 const publicKey = require(buildAbsoluteFixturePath('./ap-json/mastodon/bad-public-key.json')).publicKey
100 101
101 const actor = { publicKey } 102 const actor = { publicKey }
102 const verified = isHTTPSignatureVerified(parsed, actor as any) 103 const verified = isHTTPSignatureVerified(parsed, actor as any)
@@ -109,7 +110,7 @@ describe('Test activity pub helpers', function () {
109 req.method = 'POST' 110 req.method = 'POST'
110 req.url = '/accounts/ronan/inbox' 111 req.url = '/accounts/ronan/inbox'
111 112
112 const mastodonObject = cloneDeep(require('./json/mastodon/http-signature.json')) 113 const mastodonObject = cloneDeep(require(buildAbsoluteFixturePath('./ap-json/mastodon/http-signature.json')))
113 req.body = mastodonObject.body 114 req.body = mastodonObject.body
114 req.headers = mastodonObject.headers 115 req.headers = mastodonObject.headers
115 116
@@ -128,7 +129,7 @@ describe('Test activity pub helpers', function () {
128 req.method = 'POST' 129 req.method = 'POST'
129 req.url = '/accounts/ronan/inbox' 130 req.url = '/accounts/ronan/inbox'
130 131
131 const mastodonObject = cloneDeep(require('./json/mastodon/http-signature.json')) 132 const mastodonObject = cloneDeep(require(buildAbsoluteFixturePath('./ap-json/mastodon/http-signature.json')))
132 req.body = mastodonObject.body 133 req.body = mastodonObject.body
133 req.headers = mastodonObject.headers 134 req.headers = mastodonObject.headers
134 req.headers = 'Signature ' + mastodonObject.headers 135 req.headers = 'Signature ' + mastodonObject.headers
@@ -148,12 +149,12 @@ describe('Test activity pub helpers', function () {
148 req.method = 'POST' 149 req.method = 'POST'
149 req.url = '/accounts/ronan/inbox' 150 req.url = '/accounts/ronan/inbox'
150 151
151 const mastodonObject = cloneDeep(require('./json/mastodon/http-signature.json')) 152 const mastodonObject = cloneDeep(require(buildAbsoluteFixturePath('./ap-json/mastodon/http-signature.json')))
152 req.body = mastodonObject.body 153 req.body = mastodonObject.body
153 req.headers = mastodonObject.headers 154 req.headers = mastodonObject.headers
154 155
155 const parsed = parseHTTPSignature(req, 3600 * 1000 * 365 * 10) 156 const parsed = parseHTTPSignature(req, 3600 * 1000 * 365 * 10)
156 const publicKey = require('./json/mastodon/public-key.json').publicKey 157 const publicKey = require(buildAbsoluteFixturePath('./ap-json/mastodon/public-key.json')).publicKey
157 158
158 const actor = { publicKey } 159 const actor = { publicKey }
159 const verified = isHTTPSignatureVerified(parsed, actor as any) 160 const verified = isHTTPSignatureVerified(parsed, actor as any)
diff --git a/server/tests/api/activitypub/security.ts b/server/tests/api/activitypub/security.ts
index 364b53e0f..61db272f6 100644
--- a/server/tests/api/activitypub/security.ts
+++ b/server/tests/api/activitypub/security.ts
@@ -5,6 +5,7 @@ import * as chai from 'chai'
5import { buildDigest } from '@server/helpers/peertube-crypto' 5import { buildDigest } from '@server/helpers/peertube-crypto'
6import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes' 6import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
7import { 7import {
8 buildAbsoluteFixturePath,
8 cleanupTests, 9 cleanupTests,
9 closeAllSequelize, 10 closeAllSequelize,
10 flushAndRunMultipleServers, 11 flushAndRunMultipleServers,
@@ -40,7 +41,7 @@ function setUpdatedAtOfServer (onServer: ServerInfo, ofServer: ServerInfo, updat
40} 41}
41 42
42function getAnnounceWithoutContext (server: ServerInfo) { 43function getAnnounceWithoutContext (server: ServerInfo) {
43 const json = require('./json/peertube/announce-without-context.json') 44 const json = require(buildAbsoluteFixturePath('./ap-json/peertube/announce-without-context.json'))
44 const result: typeof json = {} 45 const result: typeof json = {}
45 46
46 for (const key of Object.keys(json)) { 47 for (const key of Object.keys(json)) {
@@ -58,8 +59,8 @@ describe('Test ActivityPub security', function () {
58 let servers: ServerInfo[] 59 let servers: ServerInfo[]
59 let url: string 60 let url: string
60 61
61 const keys = require('./json/peertube/keys.json') 62 const keys = require(buildAbsoluteFixturePath('./ap-json/peertube/keys.json'))
62 const invalidKeys = require('./json/peertube/invalid-keys.json') 63 const invalidKeys = require(buildAbsoluteFixturePath('./ap-json/peertube/invalid-keys.json'))
63 const baseHttpSignature = () => ({ 64 const baseHttpSignature = () => ({
64 algorithm: HTTP_SIGNATURE.ALGORITHM, 65 algorithm: HTTP_SIGNATURE.ALGORITHM,
65 authorizationHeaderName: HTTP_SIGNATURE.HEADER_NAME, 66 authorizationHeaderName: HTTP_SIGNATURE.HEADER_NAME,
diff --git a/server/tests/api/check-params/live.ts b/server/tests/api/check-params/live.ts
index c171b1f81..32233c9da 100644
--- a/server/tests/api/check-params/live.ts
+++ b/server/tests/api/check-params/live.ts
@@ -2,9 +2,10 @@
2 2
3import 'mocha' 3import 'mocha'
4import { omit } from 'lodash' 4import { omit } from 'lodash'
5import { join } from 'path'
6import { LiveVideo, VideoPrivacy } from '@shared/models' 5import { LiveVideo, VideoPrivacy } from '@shared/models'
6import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
7import { 7import {
8 buildAbsoluteFixturePath,
8 cleanupTests, 9 cleanupTests,
9 createUser, 10 createUser,
10 flushAndRunServer, 11 flushAndRunServer,
@@ -24,7 +25,6 @@ import {
24 userLogin, 25 userLogin,
25 waitUntilLivePublished 26 waitUntilLivePublished
26} from '../../../../shared/extra-utils' 27} from '../../../../shared/extra-utils'
27import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
28 28
29describe('Test video lives API validator', function () { 29describe('Test video lives API validator', function () {
30 const path = '/api/v1/videos/live' 30 const path = '/api/v1/videos/live'
@@ -180,7 +180,7 @@ describe('Test video lives API validator', function () {
180 it('Should fail with an incorrect thumbnail file', async function () { 180 it('Should fail with an incorrect thumbnail file', async function () {
181 const fields = baseCorrectParams 181 const fields = baseCorrectParams
182 const attaches = { 182 const attaches = {
183 thumbnailfile: join(__dirname, '..', '..', 'fixtures', 'video_short.mp4') 183 thumbnailfile: buildAbsoluteFixturePath('video_short.mp4')
184 } 184 }
185 185
186 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches }) 186 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
@@ -189,7 +189,7 @@ describe('Test video lives API validator', function () {
189 it('Should fail with a big thumbnail file', async function () { 189 it('Should fail with a big thumbnail file', async function () {
190 const fields = baseCorrectParams 190 const fields = baseCorrectParams
191 const attaches = { 191 const attaches = {
192 thumbnailfile: join(__dirname, '..', '..', 'fixtures', 'preview-big.png') 192 thumbnailfile: buildAbsoluteFixturePath('preview-big.png')
193 } 193 }
194 194
195 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches }) 195 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
@@ -198,7 +198,7 @@ describe('Test video lives API validator', function () {
198 it('Should fail with an incorrect preview file', async function () { 198 it('Should fail with an incorrect preview file', async function () {
199 const fields = baseCorrectParams 199 const fields = baseCorrectParams
200 const attaches = { 200 const attaches = {
201 previewfile: join(__dirname, '..', '..', 'fixtures', 'video_short.mp4') 201 previewfile: buildAbsoluteFixturePath('video_short.mp4')
202 } 202 }
203 203
204 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches }) 204 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
@@ -207,7 +207,7 @@ describe('Test video lives API validator', function () {
207 it('Should fail with a big preview file', async function () { 207 it('Should fail with a big preview file', async function () {
208 const fields = baseCorrectParams 208 const fields = baseCorrectParams
209 const attaches = { 209 const attaches = {
210 previewfile: join(__dirname, '..', '..', 'fixtures', 'preview-big.png') 210 previewfile: buildAbsoluteFixturePath('preview-big.png')
211 } 211 }
212 212
213 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches }) 213 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
diff --git a/server/tests/api/check-params/users.ts b/server/tests/api/check-params/users.ts
index dcff0d52b..36482ee17 100644
--- a/server/tests/api/check-params/users.ts
+++ b/server/tests/api/check-params/users.ts
@@ -2,12 +2,12 @@
2 2
3import 'mocha' 3import 'mocha'
4import { omit } from 'lodash' 4import { omit } from 'lodash'
5import { join } from 'path'
6import { User, UserRole } from '../../../../shared' 5import { User, UserRole } from '../../../../shared'
7import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes' 6import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
8import { 7import {
9 addVideoChannel, 8 addVideoChannel,
10 blockUser, 9 blockUser,
10 buildAbsoluteFixturePath,
11 cleanupTests, 11 cleanupTests,
12 createUser, 12 createUser,
13 deleteMe, 13 deleteMe,
@@ -600,7 +600,7 @@ describe('Test users API validators', function () {
600 it('Should fail without an incorrect input file', async function () { 600 it('Should fail without an incorrect input file', async function () {
601 const fields = {} 601 const fields = {}
602 const attaches = { 602 const attaches = {
603 avatarfile: join(__dirname, '..', '..', 'fixtures', 'video_short.mp4') 603 avatarfile: buildAbsoluteFixturePath('video_short.mp4')
604 } 604 }
605 await makeUploadRequest({ url: server.url, path: path + '/me/avatar/pick', token: server.accessToken, fields, attaches }) 605 await makeUploadRequest({ url: server.url, path: path + '/me/avatar/pick', token: server.accessToken, fields, attaches })
606 }) 606 })
@@ -608,7 +608,7 @@ describe('Test users API validators', function () {
608 it('Should fail with a big file', async function () { 608 it('Should fail with a big file', async function () {
609 const fields = {} 609 const fields = {}
610 const attaches = { 610 const attaches = {
611 avatarfile: join(__dirname, '..', '..', 'fixtures', 'avatar-big.png') 611 avatarfile: buildAbsoluteFixturePath('avatar-big.png')
612 } 612 }
613 await makeUploadRequest({ url: server.url, path: path + '/me/avatar/pick', token: server.accessToken, fields, attaches }) 613 await makeUploadRequest({ url: server.url, path: path + '/me/avatar/pick', token: server.accessToken, fields, attaches })
614 }) 614 })
@@ -616,7 +616,7 @@ describe('Test users API validators', function () {
616 it('Should fail with an unauthenticated user', async function () { 616 it('Should fail with an unauthenticated user', async function () {
617 const fields = {} 617 const fields = {}
618 const attaches = { 618 const attaches = {
619 avatarfile: join(__dirname, '..', '..', 'fixtures', 'avatar.png') 619 avatarfile: buildAbsoluteFixturePath('avatar.png')
620 } 620 }
621 await makeUploadRequest({ 621 await makeUploadRequest({
622 url: server.url, 622 url: server.url,
@@ -630,7 +630,7 @@ describe('Test users API validators', function () {
630 it('Should succeed with the correct params', async function () { 630 it('Should succeed with the correct params', async function () {
631 const fields = {} 631 const fields = {}
632 const attaches = { 632 const attaches = {
633 avatarfile: join(__dirname, '..', '..', 'fixtures', 'avatar.png') 633 avatarfile: buildAbsoluteFixturePath('avatar.png')
634 } 634 }
635 await makeUploadRequest({ 635 await makeUploadRequest({
636 url: server.url, 636 url: server.url,
diff --git a/server/tests/api/check-params/video-captions.ts b/server/tests/api/check-params/video-captions.ts
index 2f049c03d..1ce2202d2 100644
--- a/server/tests/api/check-params/video-captions.ts
+++ b/server/tests/api/check-params/video-captions.ts
@@ -1,7 +1,10 @@
1/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ 1/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
2 2
3import 'mocha' 3import 'mocha'
4
5import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
4import { 6import {
7 buildAbsoluteFixturePath,
5 cleanupTests, 8 cleanupTests,
6 createUser, 9 createUser,
7 flushAndRunServer, 10 flushAndRunServer,
@@ -13,9 +16,7 @@ import {
13 uploadVideo, 16 uploadVideo,
14 userLogin 17 userLogin
15} from '../../../../shared/extra-utils' 18} from '../../../../shared/extra-utils'
16import { join } from 'path'
17import { createVideoCaption } from '../../../../shared/extra-utils/videos/video-captions' 19import { createVideoCaption } from '../../../../shared/extra-utils/videos/video-captions'
18import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
19 20
20describe('Test video captions API validator', function () { 21describe('Test video captions API validator', function () {
21 const path = '/api/v1/videos/' 22 const path = '/api/v1/videos/'
@@ -51,7 +52,7 @@ describe('Test video captions API validator', function () {
51 describe('When adding video caption', function () { 52 describe('When adding video caption', function () {
52 const fields = { } 53 const fields = { }
53 const attaches = { 54 const attaches = {
54 captionfile: join(__dirname, '..', '..', 'fixtures', 'subtitle-good1.vtt') 55 captionfile: buildAbsoluteFixturePath('subtitle-good1.vtt')
55 } 56 }
56 57
57 it('Should fail without a valid uuid', async function () { 58 it('Should fail without a valid uuid', async function () {
@@ -129,7 +130,7 @@ describe('Test video captions API validator', function () {
129 // We accept any file now 130 // We accept any file now
130 // it('Should fail with an invalid captionfile extension', async function () { 131 // it('Should fail with an invalid captionfile extension', async function () {
131 // const attaches = { 132 // const attaches = {
132 // 'captionfile': join(__dirname, '..', '..', 'fixtures', 'subtitle-bad.txt') 133 // 'captionfile': buildAbsoluteFixturePath('subtitle-bad.txt')
133 // } 134 // }
134 // 135 //
135 // const captionPath = path + videoUUID + '/captions/fr' 136 // const captionPath = path + videoUUID + '/captions/fr'
@@ -171,7 +172,7 @@ describe('Test video captions API validator', function () {
171 // We don't check the file validity yet 172 // We don't check the file validity yet
172 // it('Should fail with an invalid captionfile srt', async function () { 173 // it('Should fail with an invalid captionfile srt', async function () {
173 // const attaches = { 174 // const attaches = {
174 // 'captionfile': join(__dirname, '..', '..', 'fixtures', 'subtitle-bad.srt') 175 // 'captionfile': buildAbsoluteFixturePath('subtitle-bad.srt')
175 // } 176 // }
176 // 177 //
177 // const captionPath = path + videoUUID + '/captions/fr' 178 // const captionPath = path + videoUUID + '/captions/fr'
diff --git a/server/tests/api/check-params/video-channels.ts b/server/tests/api/check-params/video-channels.ts
index bc2e6192e..5c02afd31 100644
--- a/server/tests/api/check-params/video-channels.ts
+++ b/server/tests/api/check-params/video-channels.ts
@@ -1,9 +1,11 @@
1/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ 1/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
2 2
3import 'mocha'
3import * as chai from 'chai' 4import * as chai from 'chai'
4import { omit } from 'lodash' 5import { omit } from 'lodash'
5import 'mocha' 6import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
6import { 7import {
8 buildAbsoluteFixturePath,
7 cleanupTests, 9 cleanupTests,
8 createUser, 10 createUser,
9 deleteVideoChannel, 11 deleteVideoChannel,
@@ -23,9 +25,7 @@ import {
23 checkBadSortPagination, 25 checkBadSortPagination,
24 checkBadStartPagination 26 checkBadStartPagination
25} from '../../../../shared/extra-utils/requests/check-api-params' 27} from '../../../../shared/extra-utils/requests/check-api-params'
26import { join } from 'path'
27import { VideoChannelUpdate } from '../../../../shared/models/videos' 28import { VideoChannelUpdate } from '../../../../shared/models/videos'
28import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
29 29
30const expect = chai.expect 30const expect = chai.expect
31 31
@@ -246,7 +246,7 @@ describe('Test video channels API validator', function () {
246 for (const type of types) { 246 for (const type of types) {
247 const fields = {} 247 const fields = {}
248 const attaches = { 248 const attaches = {
249 [type + 'file']: join(__dirname, '..', '..', 'fixtures', 'video_short.mp4') 249 [type + 'file']: buildAbsoluteFixturePath('video_short.mp4')
250 } 250 }
251 251
252 await makeUploadRequest({ url: server.url, path: `${path}/${type}/pick`, token: server.accessToken, fields, attaches }) 252 await makeUploadRequest({ url: server.url, path: `${path}/${type}/pick`, token: server.accessToken, fields, attaches })
@@ -257,7 +257,7 @@ describe('Test video channels API validator', function () {
257 for (const type of types) { 257 for (const type of types) {
258 const fields = {} 258 const fields = {}
259 const attaches = { 259 const attaches = {
260 [type + 'file']: join(__dirname, '..', '..', 'fixtures', 'avatar-big.png') 260 [type + 'file']: buildAbsoluteFixturePath('avatar-big.png')
261 } 261 }
262 await makeUploadRequest({ url: server.url, path: `${path}/${type}/pick`, token: server.accessToken, fields, attaches }) 262 await makeUploadRequest({ url: server.url, path: `${path}/${type}/pick`, token: server.accessToken, fields, attaches })
263 } 263 }
@@ -267,7 +267,7 @@ describe('Test video channels API validator', function () {
267 for (const type of types) { 267 for (const type of types) {
268 const fields = {} 268 const fields = {}
269 const attaches = { 269 const attaches = {
270 [type + 'file']: join(__dirname, '..', '..', 'fixtures', 'avatar.png') 270 [type + 'file']: buildAbsoluteFixturePath('avatar.png')
271 } 271 }
272 await makeUploadRequest({ 272 await makeUploadRequest({
273 url: server.url, 273 url: server.url,
@@ -283,7 +283,7 @@ describe('Test video channels API validator', function () {
283 for (const type of types) { 283 for (const type of types) {
284 const fields = {} 284 const fields = {}
285 const attaches = { 285 const attaches = {
286 [type + 'file']: join(__dirname, '..', '..', 'fixtures', 'avatar.png') 286 [type + 'file']: buildAbsoluteFixturePath('avatar.png')
287 } 287 }
288 await makeUploadRequest({ 288 await makeUploadRequest({
289 url: server.url, 289 url: server.url,
diff --git a/server/tests/api/check-params/video-imports.ts b/server/tests/api/check-params/video-imports.ts
index 6de6b40c8..a27b624d0 100644
--- a/server/tests/api/check-params/video-imports.ts
+++ b/server/tests/api/check-params/video-imports.ts
@@ -2,8 +2,9 @@
2 2
3import 'mocha' 3import 'mocha'
4import { omit } from 'lodash' 4import { omit } from 'lodash'
5import { join } from 'path' 5import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
6import { 6import {
7 buildAbsoluteFixturePath,
7 cleanupTests, 8 cleanupTests,
8 createUser, 9 createUser,
9 flushAndRunServer, 10 flushAndRunServer,
@@ -22,9 +23,8 @@ import {
22 checkBadSortPagination, 23 checkBadSortPagination,
23 checkBadStartPagination 24 checkBadStartPagination
24} from '../../../../shared/extra-utils/requests/check-api-params' 25} from '../../../../shared/extra-utils/requests/check-api-params'
25import { getMagnetURI, getGoodVideoUrl } from '../../../../shared/extra-utils/videos/video-imports' 26import { getGoodVideoUrl, getMagnetURI } from '../../../../shared/extra-utils/videos/video-imports'
26import { VideoPrivacy } from '../../../../shared/models/videos/video-privacy.enum' 27import { VideoPrivacy } from '../../../../shared/models/videos/video-privacy.enum'
27import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
28 28
29describe('Test video imports API validator', function () { 29describe('Test video imports API validator', function () {
30 const path = '/api/v1/videos/imports' 30 const path = '/api/v1/videos/imports'
@@ -201,7 +201,7 @@ describe('Test video imports API validator', function () {
201 it('Should fail with an incorrect thumbnail file', async function () { 201 it('Should fail with an incorrect thumbnail file', async function () {
202 const fields = baseCorrectParams 202 const fields = baseCorrectParams
203 const attaches = { 203 const attaches = {
204 thumbnailfile: join(__dirname, '..', '..', 'fixtures', 'video_short.mp4') 204 thumbnailfile: buildAbsoluteFixturePath('video_short.mp4')
205 } 205 }
206 206
207 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches }) 207 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
@@ -210,7 +210,7 @@ describe('Test video imports API validator', function () {
210 it('Should fail with a big thumbnail file', async function () { 210 it('Should fail with a big thumbnail file', async function () {
211 const fields = baseCorrectParams 211 const fields = baseCorrectParams
212 const attaches = { 212 const attaches = {
213 thumbnailfile: join(__dirname, '..', '..', 'fixtures', 'preview-big.png') 213 thumbnailfile: buildAbsoluteFixturePath('preview-big.png')
214 } 214 }
215 215
216 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches }) 216 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
@@ -219,7 +219,7 @@ describe('Test video imports API validator', function () {
219 it('Should fail with an incorrect preview file', async function () { 219 it('Should fail with an incorrect preview file', async function () {
220 const fields = baseCorrectParams 220 const fields = baseCorrectParams
221 const attaches = { 221 const attaches = {
222 previewfile: join(__dirname, '..', '..', 'fixtures', 'video_short.mp4') 222 previewfile: buildAbsoluteFixturePath('video_short.mp4')
223 } 223 }
224 224
225 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches }) 225 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
@@ -228,7 +228,7 @@ describe('Test video imports API validator', function () {
228 it('Should fail with a big preview file', async function () { 228 it('Should fail with a big preview file', async function () {
229 const fields = baseCorrectParams 229 const fields = baseCorrectParams
230 const attaches = { 230 const attaches = {
231 previewfile: join(__dirname, '..', '..', 'fixtures', 'preview-big.png') 231 previewfile: buildAbsoluteFixturePath('preview-big.png')
232 } 232 }
233 233
234 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches }) 234 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
@@ -237,7 +237,7 @@ describe('Test video imports API validator', function () {
237 it('Should fail with an invalid torrent file', async function () { 237 it('Should fail with an invalid torrent file', async function () {
238 const fields = omit(baseCorrectParams, 'targetUrl') 238 const fields = omit(baseCorrectParams, 'targetUrl')
239 const attaches = { 239 const attaches = {
240 torrentfile: join(__dirname, '..', '..', 'fixtures', 'avatar-big.png') 240 torrentfile: buildAbsoluteFixturePath('avatar-big.png')
241 } 241 }
242 242
243 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches }) 243 await makeUploadRequest({ url: server.url, path, token: server.accessToken, fields, attaches })
@@ -312,7 +312,7 @@ describe('Test video imports API validator', function () {
312 312
313 fields = omit(fields, 'magnetUri') 313 fields = omit(fields, 'magnetUri')
314 const attaches = { 314 const attaches = {
315 torrentfile: join(__dirname, '..', '..', 'fixtures', 'video-720p.torrent') 315 torrentfile: buildAbsoluteFixturePath('video-720p.torrent')
316 } 316 }
317 317
318 await makeUploadRequest({ 318 await makeUploadRequest({
diff --git a/server/tests/api/server/contact-form.ts b/server/tests/api/server/contact-form.ts
index 9b4af1915..8851ad55e 100644
--- a/server/tests/api/server/contact-form.ts
+++ b/server/tests/api/server/contact-form.ts
@@ -54,6 +54,10 @@ describe('Test contact form', function () {
54 }) 54 })
55 55
56 it('Should not be able to send another contact form because of the anti spam checker', async function () { 56 it('Should not be able to send another contact form because of the anti spam checker', async function () {
57 this.timeout(10000)
58
59 await wait(1000)
60
57 await sendContactForm({ 61 await sendContactForm({
58 url: server.url, 62 url: server.url,
59 fromEmail: 'toto@example.com', 63 fromEmail: 'toto@example.com',
diff --git a/server/tests/api/videos/multiple-servers.ts b/server/tests/api/videos/multiple-servers.ts
index e80d69cf3..a8c8a889b 100644
--- a/server/tests/api/videos/multiple-servers.ts
+++ b/server/tests/api/videos/multiple-servers.ts
@@ -2,11 +2,11 @@
2 2
3import 'mocha' 3import 'mocha'
4import * as chai from 'chai' 4import * as chai from 'chai'
5import { join } from 'path'
6import * as request from 'supertest' 5import * as request from 'supertest'
7import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes' 6import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
8import { 7import {
9 addVideoChannel, 8 addVideoChannel,
9 buildAbsoluteFixturePath,
10 checkTmpIsEmpty, 10 checkTmpIsEmpty,
11 checkVideoFilesWereRemoved, 11 checkVideoFilesWereRemoved,
12 cleanupTests, 12 cleanupTests,
@@ -1018,9 +1018,7 @@ describe('Test multiple servers', function () {
1018 .field('privacy', '1') 1018 .field('privacy', '1')
1019 .field('channelId', '1') 1019 .field('channelId', '1')
1020 1020
1021 const filePath = join(__dirname, '..', '..', 'fixtures', 'video_short.webm') 1021 await req.attach('videofile', buildAbsoluteFixturePath('video_short.webm'))
1022
1023 await req.attach('videofile', filePath)
1024 .expect(HttpStatusCode.OK_200) 1022 .expect(HttpStatusCode.OK_200)
1025 1023
1026 await waitJobs(servers) 1024 await waitJobs(servers)
diff --git a/server/tests/api/activitypub/json/mastodon/bad-body-http-signature.json b/server/tests/fixtures/ap-json/mastodon/bad-body-http-signature.json
index 4e7bc3af5..4e7bc3af5 100644
--- a/server/tests/api/activitypub/json/mastodon/bad-body-http-signature.json
+++ b/server/tests/fixtures/ap-json/mastodon/bad-body-http-signature.json
diff --git a/server/tests/api/activitypub/json/mastodon/bad-http-signature.json b/server/tests/fixtures/ap-json/mastodon/bad-http-signature.json
index 098597db0..098597db0 100644
--- a/server/tests/api/activitypub/json/mastodon/bad-http-signature.json
+++ b/server/tests/fixtures/ap-json/mastodon/bad-http-signature.json
diff --git a/server/tests/api/activitypub/json/mastodon/bad-public-key.json b/server/tests/fixtures/ap-json/mastodon/bad-public-key.json
index 73d18b3ad..73d18b3ad 100644
--- a/server/tests/api/activitypub/json/mastodon/bad-public-key.json
+++ b/server/tests/fixtures/ap-json/mastodon/bad-public-key.json
diff --git a/server/tests/api/activitypub/json/mastodon/create-bad-signature.json b/server/tests/fixtures/ap-json/mastodon/create-bad-signature.json
index 2cd037241..2cd037241 100644
--- a/server/tests/api/activitypub/json/mastodon/create-bad-signature.json
+++ b/server/tests/fixtures/ap-json/mastodon/create-bad-signature.json
diff --git a/server/tests/api/activitypub/json/mastodon/create.json b/server/tests/fixtures/ap-json/mastodon/create.json
index 0be271bb8..0be271bb8 100644
--- a/server/tests/api/activitypub/json/mastodon/create.json
+++ b/server/tests/fixtures/ap-json/mastodon/create.json
diff --git a/server/tests/api/activitypub/json/mastodon/http-signature.json b/server/tests/fixtures/ap-json/mastodon/http-signature.json
index 4e7bc3af5..4e7bc3af5 100644
--- a/server/tests/api/activitypub/json/mastodon/http-signature.json
+++ b/server/tests/fixtures/ap-json/mastodon/http-signature.json
diff --git a/server/tests/api/activitypub/json/mastodon/public-key.json b/server/tests/fixtures/ap-json/mastodon/public-key.json
index b7b9b8308..b7b9b8308 100644
--- a/server/tests/api/activitypub/json/mastodon/public-key.json
+++ b/server/tests/fixtures/ap-json/mastodon/public-key.json
diff --git a/server/tests/api/activitypub/json/peertube/announce-without-context.json b/server/tests/fixtures/ap-json/peertube/announce-without-context.json
index 5f2af0cde..5f2af0cde 100644
--- a/server/tests/api/activitypub/json/peertube/announce-without-context.json
+++ b/server/tests/fixtures/ap-json/peertube/announce-without-context.json
diff --git a/server/tests/api/activitypub/json/peertube/invalid-keys.json b/server/tests/fixtures/ap-json/peertube/invalid-keys.json
index 0544e96b9..0544e96b9 100644
--- a/server/tests/api/activitypub/json/peertube/invalid-keys.json
+++ b/server/tests/fixtures/ap-json/peertube/invalid-keys.json
diff --git a/server/tests/api/activitypub/json/peertube/keys.json b/server/tests/fixtures/ap-json/peertube/keys.json
index 1a7700865..1a7700865 100644
--- a/server/tests/api/activitypub/json/peertube/keys.json
+++ b/server/tests/fixtures/ap-json/peertube/keys.json
diff --git a/server/tests/plugins/filter-hooks.ts b/server/tests/plugins/filter-hooks.ts
index 1d6bb6cf4..e78246d2d 100644
--- a/server/tests/plugins/filter-hooks.ts
+++ b/server/tests/plugins/filter-hooks.ts
@@ -326,7 +326,7 @@ describe('Test plugin filter hooks', function () {
326 }) 326 })
327 327
328 it('Should blacklist on remote upload', async function () { 328 it('Should blacklist on remote upload', async function () {
329 this.timeout(60000) 329 this.timeout(120000)
330 330
331 const res = await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'remote please blacklist me' }) 331 const res = await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'remote please blacklist me' })
332 await waitJobs(servers) 332 await waitJobs(servers)
@@ -335,7 +335,7 @@ describe('Test plugin filter hooks', function () {
335 }) 335 })
336 336
337 it('Should blacklist on remote update', async function () { 337 it('Should blacklist on remote update', async function () {
338 this.timeout(60000) 338 this.timeout(120000)
339 339
340 const res = await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'video' }) 340 const res = await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'video' })
341 await waitJobs(servers) 341 await waitJobs(servers)
diff --git a/server/tests/register.ts b/server/tests/register.ts
new file mode 100644
index 000000000..af6c8c644
--- /dev/null
+++ b/server/tests/register.ts
@@ -0,0 +1,3 @@
1import { registerTSPaths } from '../helpers/register-ts-paths'
2
3registerTSPaths()
diff --git a/shared/extra-utils/miscs/email-child-process.js b/shared/extra-utils/miscs/email-child-process.js
deleted file mode 100644
index 088a5a08c..000000000
--- a/shared/extra-utils/miscs/email-child-process.js
+++ /dev/null
@@ -1,27 +0,0 @@
1const MailDev = require('maildev')
2
3// must run maildev as forked ChildProcess
4// failed instantiation stops main process with exit code 0
5process.on('message', (msg) => {
6 if (msg.start) {
7 const maildev = new MailDev({
8 ip: '127.0.0.1',
9 smtp: msg.port,
10 disableWeb: true,
11 silent: true
12 })
13
14 maildev.on('new', email => {
15 process.send({ email })
16 })
17
18 maildev.listen(err => {
19 if (err) {
20 // cannot send as Error object
21 return process.send({ err: err.message })
22 }
23
24 return process.send({ err: null })
25 })
26 }
27})
diff --git a/shared/extra-utils/miscs/email.ts b/shared/extra-utils/miscs/email.ts
index 758b15b58..9fc9a5ad0 100644
--- a/shared/extra-utils/miscs/email.ts
+++ b/shared/extra-utils/miscs/email.ts
@@ -1,8 +1,9 @@
1import { ChildProcess, fork } from 'child_process' 1import { ChildProcess } from 'child_process'
2import { join } from 'path'
3import { randomInt } from '../../core-utils/miscs/miscs' 2import { randomInt } from '../../core-utils/miscs/miscs'
4import { parallelTests } from '../server/servers' 3import { parallelTests } from '../server/servers'
5 4
5const MailDev = require('maildev')
6
6class MockSmtpServer { 7class MockSmtpServer {
7 8
8 private static instance: MockSmtpServer 9 private static instance: MockSmtpServer
@@ -10,38 +11,32 @@ class MockSmtpServer {
10 private emailChildProcess: ChildProcess 11 private emailChildProcess: ChildProcess
11 private emails: object[] 12 private emails: object[]
12 13
13 private constructor () { 14 private constructor () { }
14 this.emailChildProcess = fork(join(__dirname, 'email-child-process'), [])
15
16 this.emailChildProcess.on('message', (msg: any) => {
17 if (msg.email) {
18 return this.emails.push(msg.email)
19 }
20 })
21
22 process.on('exit', () => this.kill())
23 }
24 15
25 collectEmails (emailsCollection: object[]) { 16 collectEmails (emailsCollection: object[]) {
26 return new Promise<number>((res, rej) => { 17 return new Promise<number>((res, rej) => {
27 const port = parallelTests() ? randomInt(1000, 2000) : 1025 18 const port = parallelTests() ? randomInt(1000, 2000) : 1025
19 this.emails = emailsCollection
28 20
29 if (this.started) { 21 if (this.started) {
30 this.emails = emailsCollection
31 return res(undefined) 22 return res(undefined)
32 } 23 }
33 24
34 // ensure maildev isn't started until 25 const maildev = new MailDev({
35 // unexpected exit can be reported to test runner 26 ip: '127.0.0.1',
36 this.emailChildProcess.send({ start: true, port }) 27 smtp: port,
37 this.emailChildProcess.on('exit', () => { 28 disableWeb: true,
38 return rej(new Error('maildev exited unexpectedly, confirm port not in use')) 29 silent: true
30 })
31
32 maildev.on('new', email => {
33 this.emails.push(email)
39 }) 34 })
40 this.emailChildProcess.on('message', (msg: any) => { 35
41 if (msg.err) return rej(new Error(msg.err)) 36 maildev.listen(err => {
37 if (err) return rej(err)
42 38
43 this.started = true 39 this.started = true
44 this.emails = emailsCollection
45 40
46 return res(port) 41 return res(port)
47 }) 42 })