]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Introduce sql command
authorChocobozzz <me@florianbigard.com>
Fri, 9 Jul 2021 13:37:43 +0000 (15:37 +0200)
committerChocobozzz <me@florianbigard.com>
Tue, 20 Jul 2021 13:27:18 +0000 (15:27 +0200)
35 files changed:
scripts/benchmark.ts
server/tests/api/activitypub/cleaner.ts
server/tests/api/activitypub/fetch.ts
server/tests/api/activitypub/refresher.ts
server/tests/api/activitypub/security.ts
server/tests/api/check-params/contact-form.ts
server/tests/api/check-params/users.ts
server/tests/api/live/live.ts
server/tests/api/moderation/video-blacklist.ts
server/tests/api/notifications/admin-notifications.ts
server/tests/api/redundancy/redundancy-constraints.ts
server/tests/api/redundancy/redundancy.ts
server/tests/api/server/config.ts
server/tests/api/server/handle-down.ts
server/tests/api/server/homepage.ts
server/tests/api/server/logs.ts
server/tests/api/server/plugins.ts
server/tests/api/server/tracker.ts
server/tests/api/users/users.ts
server/tests/api/videos/video-channels.ts
server/tests/api/videos/videos-history.ts
server/tests/api/videos/videos-views-cleaner.ts
server/tests/cli/plugins.ts
server/tests/cli/prune-storage.ts
server/tests/cli/update-host.ts
server/tests/external-plugins/auto-block-videos.ts
server/tests/external-plugins/auto-mute.ts
server/tests/plugins/action-hooks.ts
server/tools/test-live.ts
shared/extra-utils/miscs/index.ts
shared/extra-utils/miscs/sql-command.ts [new file with mode: 0644]
shared/extra-utils/miscs/sql.ts [deleted file]
shared/extra-utils/miscs/stubs.ts
shared/extra-utils/server/servers.ts
shared/extra-utils/shared/abstract-command.ts

index 321b07c9473c75b9f10e5c56632e1f945e27ca57..272f9e8b19e79bfaa729e638d136c2689908c901 100644 (file)
@@ -15,7 +15,7 @@ const outfile = process.argv[2]
 run()
   .catch(err => console.error(err))
   .finally(() => {
-    if (server) killallServers([ server ])
+    if (server) return killallServers([ server ])
   })
 
 function buildAuthorizationHeader () {
index 27f17b4d63756c1081e60e5e9515774872263315..5b08880bf009fadd0c9ce9089c735b634b6225da 100644 (file)
@@ -4,18 +4,12 @@ import 'mocha'
 import * as chai from 'chai'
 import {
   cleanupTests,
-  closeAllSequelize,
-  deleteAll,
   doubleFollow,
   flushAndRunMultipleServers,
-  getCount,
   getVideo,
   rateVideo,
-  selectQuery,
   ServerInfo,
   setAccessTokensToServers,
-  setVideoField,
-  updateQuery,
   uploadVideoAndGetId,
   wait,
   waitJobs
@@ -86,9 +80,9 @@ describe('Test AP cleaner', function () {
   it('Should destroy server 3 internal likes and correctly clean them', async function () {
     this.timeout(20000)
 
-    await deleteAll(servers[2].internalServerNumber, 'accountVideoRate')
+    await servers[2].sqlCommand.deleteAll('accountVideoRate')
     for (const uuid of videoUUIDs) {
-      await setVideoField(servers[2].internalServerNumber, uuid, 'likes', '0')
+      await servers[2].sqlCommand.setVideoField(uuid, 'likes', '0')
     }
 
     await wait(5000)
@@ -132,10 +126,10 @@ describe('Test AP cleaner', function () {
   it('Should destroy server 3 internal dislikes and correctly clean them', async function () {
     this.timeout(20000)
 
-    await deleteAll(servers[2].internalServerNumber, 'accountVideoRate')
+    await servers[2].sqlCommand.deleteAll('accountVideoRate')
 
     for (const uuid of videoUUIDs) {
-      await setVideoField(servers[2].internalServerNumber, uuid, 'dislikes', '0')
+      await servers[2].sqlCommand.setVideoField(uuid, 'dislikes', '0')
     }
 
     await wait(5000)
@@ -159,15 +153,15 @@ describe('Test AP cleaner', function () {
   it('Should destroy server 3 internal shares and correctly clean them', async function () {
     this.timeout(20000)
 
-    const preCount = await getCount(servers[0].internalServerNumber, 'videoShare')
+    const preCount = await servers[0].sqlCommand.getCount('videoShare')
     expect(preCount).to.equal(6)
 
-    await deleteAll(servers[2].internalServerNumber, 'videoShare')
+    await servers[2].sqlCommand.deleteAll('videoShare')
     await wait(5000)
     await waitJobs(servers)
 
     // Still 6 because we don't have remote shares on local videos
-    const postCount = await getCount(servers[0].internalServerNumber, 'videoShare')
+    const postCount = await servers[0].sqlCommand.getCount('videoShare')
     expect(postCount).to.equal(6)
   })
 
@@ -179,7 +173,7 @@ describe('Test AP cleaner', function () {
       expect(total).to.equal(3)
     }
 
-    await deleteAll(servers[2].internalServerNumber, 'videoComment')
+    await servers[2].sqlCommand.deleteAll('videoComment')
 
     await wait(5000)
     await waitJobs(servers)
@@ -196,7 +190,7 @@ describe('Test AP cleaner', function () {
     async function check (like: string, ofServerUrl: string, urlSuffix: string, remote: 'true' | 'false') {
       const query = `SELECT "videoId", "accountVideoRate".url FROM "accountVideoRate" ` +
         `INNER JOIN video ON "accountVideoRate"."videoId" = video.id AND remote IS ${remote} WHERE "accountVideoRate"."url" LIKE '${like}'`
-      const res = await selectQuery(servers[0].internalServerNumber, query)
+      const res = await servers[0].sqlCommand.selectQuery(query)
 
       for (const rate of res) {
         const matcher = new RegExp(`^${ofServerUrl}/accounts/root/dislikes/\\d+${urlSuffix}$`)
@@ -225,7 +219,7 @@ describe('Test AP cleaner', function () {
 
     {
       const query = `UPDATE "accountVideoRate" SET url = url || 'stan'`
-      await updateQuery(servers[1].internalServerNumber, query)
+      await servers[1].sqlCommand.updateQuery(query)
 
       await wait(5000)
       await waitJobs(servers)
@@ -242,7 +236,7 @@ describe('Test AP cleaner', function () {
       const query = `SELECT "videoId", "videoComment".url, uuid as "videoUUID" FROM "videoComment" ` +
         `INNER JOIN video ON "videoComment"."videoId" = video.id AND remote IS ${remote} WHERE "videoComment"."url" LIKE '${like}'`
 
-      const res = await selectQuery(servers[0].internalServerNumber, query)
+      const res = await servers[0].sqlCommand.selectQuery(query)
 
       for (const comment of res) {
         const matcher = new RegExp(`${ofServerUrl}/videos/watch/${comment.videoUUID}/comments/\\d+${urlSuffix}`)
@@ -268,7 +262,7 @@ describe('Test AP cleaner', function () {
 
     {
       const query = `UPDATE "videoComment" SET url = url || 'kyle'`
-      await updateQuery(servers[1].internalServerNumber, query)
+      await servers[1].sqlCommand.updateQuery(query)
 
       await wait(5000)
       await waitJobs(servers)
@@ -280,7 +274,5 @@ describe('Test AP cleaner', function () {
 
   after(async function () {
     await cleanupTests(servers)
-
-    await closeAllSequelize(servers)
   })
 })
index 35fd94eed6b66cd4181c47badc6fb2e8a03d3f18..d5e21404c39eeed956022697f6f17142ef8a33a5 100644 (file)
@@ -1,23 +1,19 @@
 /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
 
 import 'mocha'
-
+import * as chai from 'chai'
 import {
   cleanupTests,
-  closeAllSequelize,
   createUser,
   doubleFollow,
   flushAndRunMultipleServers,
   getVideosListSort,
   ServerInfo,
   setAccessTokensToServers,
-  setActorField,
-  setVideoField,
   uploadVideo,
   userLogin,
   waitJobs
 } from '../../../../shared/extra-utils'
-import * as chai from 'chai'
 import { Video } from '../../../../shared/models/videos'
 
 const expect = chai.expect
@@ -50,12 +46,12 @@ describe('Test ActivityPub fetcher', function () {
     {
       const to = 'http://localhost:' + servers[0].port + '/accounts/user1'
       const value = 'http://localhost:' + servers[1].port + '/accounts/user1'
-      await setActorField(servers[0].internalServerNumber, to, 'url', value)
+      await servers[0].sqlCommand.setActorField(to, 'url', value)
     }
 
     {
       const value = 'http://localhost:' + servers[2].port + '/videos/watch/' + badVideoUUID
-      await setVideoField(servers[0].internalServerNumber, badVideoUUID, 'url', value)
+      await servers[0].sqlCommand.setVideoField(badVideoUUID, 'url', value)
     }
   })
 
@@ -88,7 +84,5 @@ describe('Test ActivityPub fetcher', function () {
     this.timeout(20000)
 
     await cleanupTests(servers)
-
-    await closeAllSequelize(servers)
   })
 })
index f295dfab76a4e879d52e90fa5e8d93740e679971..af919f2f35d2f78d827ef056b38da9e1ea6484e8 100644 (file)
@@ -4,7 +4,6 @@ import 'mocha'
 import { HttpStatusCode } from '@shared/core-utils'
 import {
   cleanupTests,
-  closeAllSequelize,
   doubleFollow,
   flushAndRunMultipleServers,
   generateUserAccessToken,
@@ -13,10 +12,7 @@ import {
   reRunServer,
   ServerInfo,
   setAccessTokensToServers,
-  setActorField,
   setDefaultVideoChannel,
-  setPlaylistField,
-  setVideoField,
   uploadVideo,
   uploadVideoAndGetId,
   wait,
@@ -78,7 +74,7 @@ describe('Test AP refresher', function () {
       await wait(10000)
 
       // Change UUID so the remote server returns a 404
-      await setVideoField(servers[1].internalServerNumber, videoUUID1, 'uuid', '304afe4f-39f9-4d49-8ed7-ac57b86b174f')
+      await servers[1].sqlCommand.setVideoField(videoUUID1, 'uuid', '304afe4f-39f9-4d49-8ed7-ac57b86b174f')
 
       await getVideo(servers[0].url, videoUUID1)
       await getVideo(servers[0].url, videoUUID2)
@@ -92,9 +88,9 @@ describe('Test AP refresher', function () {
     it('Should not update a remote video if the remote instance is down', async function () {
       this.timeout(70000)
 
-      killallServers([ servers[1] ])
+      await killallServers([ servers[1] ])
 
-      await setVideoField(servers[1].internalServerNumber, videoUUID3, 'uuid', '304afe4f-39f9-4d49-8ed7-ac57b86b174e')
+      await servers[1].sqlCommand.setVideoField(videoUUID3, 'uuid', '304afe4f-39f9-4d49-8ed7-ac57b86b174e')
 
       // Video will need a refresh
       await wait(10000)
@@ -120,7 +116,7 @@ describe('Test AP refresher', function () {
 
       // Change actor name so the remote server returns a 404
       const to = 'http://localhost:' + servers[1].port + '/accounts/user2'
-      await setActorField(servers[1].internalServerNumber, to, 'preferredUsername', 'toto')
+      await servers[1].sqlCommand.setActorField(to, 'preferredUsername', 'toto')
 
       await command.get({ accountName: 'user1@localhost:' + servers[1].port })
       await command.get({ accountName: 'user2@localhost:' + servers[1].port })
@@ -140,7 +136,7 @@ describe('Test AP refresher', function () {
       await wait(10000)
 
       // Change UUID so the remote server returns a 404
-      await setPlaylistField(servers[1].internalServerNumber, playlistUUID2, 'uuid', '304afe4f-39f9-4d49-8ed7-ac57b86b178e')
+      await servers[1].sqlCommand.setPlaylistField(playlistUUID2, 'uuid', '304afe4f-39f9-4d49-8ed7-ac57b86b178e')
 
       await servers[0].playlistsCommand.get({ playlistId: playlistUUID1 })
       await servers[0].playlistsCommand.get({ playlistId: playlistUUID2 })
@@ -156,7 +152,5 @@ describe('Test AP refresher', function () {
     this.timeout(10000)
 
     await cleanupTests(servers)
-
-    await closeAllSequelize(servers)
   })
 })
index 61db272f634ff36981439558336c9e32425efb43..c329400705cb6037bb0711d5ffffe10d3ab3fdca 100644 (file)
@@ -7,12 +7,10 @@ import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-c
 import {
   buildAbsoluteFixturePath,
   cleanupTests,
-  closeAllSequelize,
   flushAndRunMultipleServers,
   killallServers,
   reRunServer,
   ServerInfo,
-  setActorField,
   wait
 } from '../../../../shared/extra-utils'
 import { makeFollowRequest, makePOSTAPRequest } from '../../../../shared/extra-utils/requests/activitypub'
@@ -26,8 +24,8 @@ function setKeysOfServer (onServer: ServerInfo, ofServer: ServerInfo, publicKey:
   const url = 'http://localhost:' + ofServer.port + '/accounts/peertube'
 
   return Promise.all([
-    setActorField(onServer.internalServerNumber, url, 'publicKey', publicKey),
-    setActorField(onServer.internalServerNumber, url, 'privateKey', privateKey)
+    onServer.sqlCommand.setActorField(url, 'publicKey', publicKey),
+    onServer.sqlCommand.setActorField(url, 'privateKey', privateKey)
   ])
 }
 
@@ -35,8 +33,8 @@ function setUpdatedAtOfServer (onServer: ServerInfo, ofServer: ServerInfo, updat
   const url = 'http://localhost:' + ofServer.port + '/accounts/peertube'
 
   return Promise.all([
-    setActorField(onServer.internalServerNumber, url, 'createdAt', updatedAt),
-    setActorField(onServer.internalServerNumber, url, 'updatedAt', updatedAt)
+    onServer.sqlCommand.setActorField(url, 'createdAt', updatedAt),
+    onServer.sqlCommand.setActorField(url, 'updatedAt', updatedAt)
   ])
 }
 
@@ -173,7 +171,7 @@ describe('Test ActivityPub security', function () {
       await setUpdatedAtOfServer(servers[0], servers[1], '2015-07-17 22:00:00+00')
 
       // Invalid peertube actor cache
-      killallServers([ servers[1] ])
+      await killallServers([ servers[1] ])
       await reRunServer(servers[1])
 
       const body = activityPubContextify(getAnnounceWithoutContext(servers[1]))
@@ -294,7 +292,5 @@ describe('Test ActivityPub security', function () {
     this.timeout(10000)
 
     await cleanupTests(servers)
-
-    await closeAllSequelize(servers)
   })
 })
index fb30766d90bca1991f0d5ea91448164ffbc8003e..5539266b897feaefa716acf4b2adcc5ac6e94d82 100644 (file)
@@ -36,7 +36,7 @@ describe('Test contact form API validators', function () {
   it('Should not accept a contact form if it is disabled in the configuration', async function () {
     this.timeout(10000)
 
-    killallServers([ server ])
+    await killallServers([ server ])
 
     // Contact form is disabled
     await reRunServer(server, { smtp: { hostname: 'localhost', port: emailPort }, contact_form: { enabled: false } })
@@ -46,7 +46,7 @@ describe('Test contact form API validators', function () {
   it('Should not accept a contact form if from email is invalid', async function () {
     this.timeout(10000)
 
-    killallServers([ server ])
+    await killallServers([ server ])
 
     // Email & contact form enabled
     await reRunServer(server, { smtp: { hostname: 'localhost', port: emailPort } })
index 88fc8e8b168557b7a1bef448233fc30b3c99cbc4..bffe29bcecc7ff992fe131444fe04cdbbc3e8773 100644 (file)
@@ -237,7 +237,7 @@ describe('Test users API validators', function () {
     it('Should succeed with no password on a server with smtp enabled', async function () {
       this.timeout(20000)
 
-      killallServers([ server ])
+      await killallServers([ server ])
 
       const config = immutableAssign(overrideConfig, {
         smtp: {
index 0b06df44c8d07d3a4dd5094b359b8de6c2847142..f9a162df6ba2e516126458f596555649ce181a38 100644 (file)
@@ -587,7 +587,7 @@ describe('Test live', function () {
       await commands[0].waitUntilSegmentGeneration({ videoUUID: liveVideoId, resolution: 0, segment: 2 })
       await commands[0].waitUntilSegmentGeneration({ videoUUID: liveVideoReplayId, resolution: 0, segment: 2 })
 
-      killallServers([ servers[0] ])
+      await killallServers([ servers[0] ])
       await reRunServer(servers[0])
 
       await wait(5000)
index c72ebc16b1bdcbbddf1ac37d68170833d3ea337f..8b4723a2b0ae091d601955d281f52a597702a30f 100644 (file)
@@ -342,7 +342,7 @@ describe('Test video blacklist', function () {
     before(async function () {
       this.timeout(20000)
 
-      killallServers([ servers[0] ])
+      await killallServers([ servers[0] ])
 
       const config = {
         auto_blacklist: {
index da9767b7401098a955ae949fc6c85170abe88e0d..03fbe0b700c5e3e9e2d66e080fa920970677c0b7 100644 (file)
@@ -11,8 +11,6 @@ import {
   MockSmtpServer,
   prepareNotificationsTest,
   ServerInfo,
-  setPluginLatestVersion,
-  setPluginVersion,
   wait
 } from '@shared/extra-utils'
 import { PluginType, UserNotification, UserNotificationType } from '@shared/models'
@@ -120,8 +118,8 @@ describe('Test admin notifications', function () {
     it('Should send a notification to admins on new plugin version', async function () {
       this.timeout(30000)
 
-      await setPluginVersion(server.internalServerNumber, 'hello-world', '0.0.1')
-      await setPluginLatestVersion(server.internalServerNumber, 'hello-world', '0.0.1')
+      await server.sqlCommand.setPluginVersion('hello-world', '0.0.1')
+      await server.sqlCommand.setPluginLatestVersion('hello-world', '0.0.1')
       await wait(6000)
 
       await checkNewPluginVersion(baseParams, PluginType.PLUGIN, 'hello-world', 'presence')
@@ -142,8 +140,8 @@ describe('Test admin notifications', function () {
     it('Should send a new notification after a new plugin release', async function () {
       this.timeout(30000)
 
-      await setPluginVersion(server.internalServerNumber, 'hello-world', '0.0.1')
-      await setPluginLatestVersion(server.internalServerNumber, 'hello-world', '0.0.1')
+      await server.sqlCommand.setPluginVersion('hello-world', '0.0.1')
+      await server.sqlCommand.setPluginLatestVersion('hello-world', '0.0.1')
       await wait(6000)
 
       expect(adminNotifications.filter(n => n.type === UserNotificationType.NEW_PEERTUBE_VERSION)).to.have.lengthOf(2)
index 500b967473634f0d6aa359dfa2e62b19467dfecf..82d952471cd6a3f905cbea19d2050e06e03656fe 100644 (file)
@@ -121,7 +121,7 @@ describe('Test redundancy constraints', function () {
         }
       }
     }
-    await killallServers([ localServer ])
+    await await killallServers([ localServer ])
     await reRunServer(localServer, config)
 
     await uploadWrapper('video 2 server 2')
@@ -150,7 +150,7 @@ describe('Test redundancy constraints', function () {
         }
       }
     }
-    killallServers([ localServer ])
+    await killallServers([ localServer ])
     await reRunServer(localServer, config)
 
     await uploadWrapper('video 3 server 2')
index d20cb80f10fd5e2bf5470fd1c8a258393f465a42..56a2af395d2334b5b2b43d12cd922e50f6f6c8ab 100644 (file)
@@ -634,7 +634,7 @@ describe('Test videos redundancy', function () {
     it('Should stop server 1 and expire video redundancy', async function () {
       this.timeout(80000)
 
-      killallServers([ servers[0] ])
+      await killallServers([ servers[0] ])
 
       await wait(15000)
 
@@ -703,7 +703,7 @@ describe('Test videos redundancy', function () {
 
       await waitJobs(servers)
 
-      killallServers([ servers[0] ])
+      await killallServers([ servers[0] ])
       await reRunServer(servers[0], {
         redundancy: {
           videos: {
index 037628c9d661426561b6c8335727c46554811b7d..55cf2a1b86fe684729027051b8c825cd016dc8b7 100644 (file)
@@ -456,7 +456,7 @@ describe('Test config', function () {
   it('Should have the configuration updated after a restart', async function () {
     this.timeout(10000)
 
-    killallServers([ server ])
+    await killallServers([ server ])
 
     await reRunServer(server)
 
@@ -507,7 +507,7 @@ describe('Test config', function () {
       expect(res.headers['x-frame-options']).to.exist
     }
 
-    killallServers([ server ])
+    await killallServers([ server ])
 
     const config = {
       security: {
index 94496a159f5453a3da075530806298c1d452ec9f..dd06acb5e90ebce06138a3f06af30f059f787c3a 100644 (file)
@@ -5,7 +5,6 @@ import * as chai from 'chai'
 import { HttpStatusCode } from '@shared/core-utils'
 import {
   cleanupTests,
-  closeAllSequelize,
   CommentsCommand,
   completeVideoCheck,
   flushAndRunMultipleServers,
@@ -16,7 +15,6 @@ import {
   reRunServer,
   ServerInfo,
   setAccessTokensToServers,
-  setActorFollowScores,
   updateVideo,
   uploadVideo,
   uploadVideoAndGetId,
@@ -129,7 +127,7 @@ describe('Test handle downs', function () {
     }
 
     // Kill server 2
-    killallServers([ servers[1] ])
+    await killallServers([ servers[1] ])
 
     // Remove server 2 follower
     for (let i = 0; i < 10; i++) {
@@ -139,7 +137,7 @@ describe('Test handle downs', function () {
     await waitJobs([ servers[0], servers[2] ])
 
     // Kill server 3
-    killallServers([ servers[2] ])
+    await killallServers([ servers[2] ])
 
     const resLastVideo1 = await uploadVideo(servers[0].url, servers[0].accessToken, videoAttributes)
     missedVideo1 = resLastVideo1.body.video
@@ -311,7 +309,7 @@ describe('Test handle downs', function () {
     }
 
     await waitJobs(servers)
-    await setActorFollowScores(servers[1].internalServerNumber, 20)
+    await servers[1].sqlCommand.setActorFollowScores(20)
 
     // Wait video expiration
     await wait(11000)
@@ -325,7 +323,7 @@ describe('Test handle downs', function () {
   it('Should remove followings that are down', async function () {
     this.timeout(120000)
 
-    killallServers([ servers[0] ])
+    await killallServers([ servers[0] ])
 
     // Wait video expiration
     await wait(11000)
@@ -344,8 +342,6 @@ describe('Test handle downs', function () {
   })
 
   after(async function () {
-    await closeAllSequelize([ servers[1] ])
-
     await cleanupTests(servers)
   })
 })
index c08067f3c9540e48cff738468fec7bc93fa6f458..18b9edc31db9c458412f0058e87a9ac550f9db81 100644 (file)
@@ -54,7 +54,7 @@ describe('Test instance homepage actions', function () {
   it('Should have the same homepage after a restart', async function () {
     this.timeout(30000)
 
-    killallServers([ server ])
+    await killallServers([ server ])
 
     await reRunServer(server)
 
index ab83a329f4966132f1d34ca221bc51137eac564c..365f6cc2b14f50ec62734ee673033a32d7ba0d09 100644 (file)
@@ -113,7 +113,7 @@ describe('Test logs', function () {
     it('Should not log ping requests', async function () {
       this.timeout(30000)
 
-      killallServers([ server ])
+      await killallServers([ server ])
 
       await reRunServer(server, { log: { log_ping_requests: false } })
 
index e22ecfad957e9b7aff59946152982410303157b9..655cf00fae7679e255ea23e54c7c0e063ff6a6f4 100644 (file)
@@ -5,7 +5,6 @@ import * as chai from 'chai'
 import { HttpStatusCode } from '@shared/core-utils'
 import {
   cleanupTests,
-  closeAllSequelize,
   flushAndRunServer,
   getMyUserInformation,
   killallServers,
@@ -13,7 +12,6 @@ import {
   reRunServer,
   ServerInfo,
   setAccessTokensToServers,
-  setPluginVersion,
   testHelloWorldRegisteredSettings,
   updateMyUser,
   wait,
@@ -244,7 +242,7 @@ describe('Test plugins', function () {
     await wait(6000)
 
     // Fake update our plugin version
-    await setPluginVersion(server.internalServerNumber, 'hello-world', '0.0.1')
+    await server.sqlCommand.setPluginVersion('hello-world', '0.0.1')
 
     // Fake update package.json
     const packageJSON = await command.getPackageJSON('peertube-plugin-hello-world')
@@ -254,7 +252,7 @@ describe('Test plugins', function () {
     await command.updatePackageJSON('peertube-plugin-hello-world', packageJSON)
 
     // Restart the server to take into account this change
-    killallServers([ server ])
+    await killallServers([ server ])
     await reRunServer(server)
 
     {
@@ -335,14 +333,13 @@ describe('Test plugins', function () {
 
     await check()
 
-    killallServers([ server ])
+    await killallServers([ server ])
     await reRunServer(server)
 
     await check()
   })
 
   after(async function () {
-    await closeAllSequelize([ server ])
     await cleanupTests([ server ])
   })
 })
index 4b86e0b904f3f888421d04ddd5d2c66ee445a562..868dc897710c57afe4e484ded32d0be022f12dbd 100644 (file)
@@ -61,8 +61,7 @@ describe('Test tracker', function () {
     const errCb = () => done(new Error('Tracker is enabled'))
 
     killallServers([ server ])
-
-    reRunServer(server, { tracker: { enabled: false } })
+      .then(() => reRunServer(server, { tracker: { enabled: false } }))
       .then(() => {
         const webtorrent = new WebTorrent()
 
@@ -86,8 +85,7 @@ describe('Test tracker', function () {
     this.timeout(20000)
 
     killallServers([ server ])
-
-    reRunServer(server)
+      .then(() => reRunServer(server))
       .then(() => {
         const webtorrent = new WebTorrent()
 
index 4d255f3409de4a7487442907ca8d20146246bc20..69a8dba346f8813e6f5e1f91bb18fc25e5dcd384 100644 (file)
@@ -6,7 +6,6 @@ import { HttpStatusCode } from '@shared/core-utils'
 import {
   blockUser,
   cleanupTests,
-  closeAllSequelize,
   createUser,
   deleteMe,
   flushAndRunServer,
@@ -30,7 +29,6 @@ import {
   reRunServer,
   ServerInfo,
   setAccessTokensToServers,
-  setTokenField,
   testImage,
   unblockUser,
   updateMyAvatar,
@@ -264,10 +262,10 @@ describe('Test users', function () {
     it('Should have an expired access token', async function () {
       this.timeout(15000)
 
-      await setTokenField(server.internalServerNumber, server.accessToken, 'accessTokenExpiresAt', new Date().toISOString())
-      await setTokenField(server.internalServerNumber, server.accessToken, 'refreshTokenExpiresAt', new Date().toISOString())
+      await server.sqlCommand.setTokenField(server.accessToken, 'accessTokenExpiresAt', new Date().toISOString())
+      await server.sqlCommand.setTokenField(server.accessToken, 'refreshTokenExpiresAt', new Date().toISOString())
 
-      killallServers([ server ])
+      await killallServers([ server ])
       await reRunServer(server)
 
       await getMyUserInformation(server.url, server.accessToken, 401)
@@ -281,9 +279,9 @@ describe('Test users', function () {
       this.timeout(15000)
 
       const futureDate = new Date(new Date().getTime() + 1000 * 60).toISOString()
-      await setTokenField(server.internalServerNumber, server.accessToken, 'refreshTokenExpiresAt', futureDate)
+      await server.sqlCommand.setTokenField(server.accessToken, 'refreshTokenExpiresAt', futureDate)
 
-      killallServers([ server ])
+      await killallServers([ server ])
       await reRunServer(server)
 
       const res = await refreshToken(server, server.refreshToken)
@@ -1013,7 +1011,6 @@ describe('Test users', function () {
   })
 
   after(async function () {
-    await closeAllSequelize([ server ])
     await cleanupTests([ server ])
   })
 })
index daf066eb1a06138efaaae6235026ba7b70733524..e441ebbd433ddf7d34995979fb3e34822d9d7a72 100644 (file)
@@ -9,7 +9,6 @@ import {
   createUser,
   doubleFollow,
   flushAndRunMultipleServers,
-  getActorImage,
   getVideo,
   getVideoChannelVideos,
   setDefaultVideoChannel,
@@ -268,7 +267,7 @@ describe('Test video channels', function () {
       await testImage(server.url, 'avatar-resized', avatarPaths[server.port], '.png')
       await testFileExistsOrNot(server, 'avatars', basename(avatarPaths[server.port]), true)
 
-      const row = await getActorImage(server.internalServerNumber, basename(avatarPaths[server.port]))
+      const row = await server.sqlCommand.getActorImage(basename(avatarPaths[server.port]))
       expect(row.height).to.equal(ACTOR_IMAGES_SIZE.AVATARS.height)
       expect(row.width).to.equal(ACTOR_IMAGES_SIZE.AVATARS.width)
     }
@@ -294,7 +293,7 @@ describe('Test video channels', function () {
       await testImage(server.url, 'banner-resized', bannerPaths[server.port])
       await testFileExistsOrNot(server, 'avatars', basename(bannerPaths[server.port]), true)
 
-      const row = await getActorImage(server.internalServerNumber, basename(bannerPaths[server.port]))
+      const row = await server.sqlCommand.getActorImage(basename(bannerPaths[server.port]))
       expect(row.height).to.equal(ACTOR_IMAGES_SIZE.BANNERS.height)
       expect(row.width).to.equal(ACTOR_IMAGES_SIZE.BANNERS.width)
     }
index 7314471354424840fe0c90d8f2fea6fda89dbfaa..9a7635c35f841603898fa872cbade3e8228cee3b 100644 (file)
@@ -204,7 +204,7 @@ describe('Test videos history', function () {
   it('Should not clean old history', async function () {
     this.timeout(50000)
 
-    killallServers([ server ])
+    await killallServers([ server ])
 
     await reRunServer(server, { history: { videos: { max_age: '10 days' } } })
 
@@ -219,7 +219,7 @@ describe('Test videos history', function () {
   it('Should clean old history', async function () {
     this.timeout(50000)
 
-    killallServers([ server ])
+    await killallServers([ server ])
 
     await reRunServer(server, { history: { videos: { max_age: '5 seconds' } } })
 
index b89f332171e90e5a12ed9db4a39f73068ba2b758..b6cde6b508acc7635269526e4a1091778c8f2f50 100644 (file)
@@ -1,11 +1,9 @@
 /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
 
-import * as chai from 'chai'
 import 'mocha'
+import * as chai from 'chai'
 import {
   cleanupTests,
-  closeAllSequelize,
-  countVideoViewsOf,
   doubleFollow,
   flushAndRunMultipleServers,
   killallServers,
@@ -50,7 +48,7 @@ describe('Test video views cleaner', function () {
   it('Should not clean old video views', async function () {
     this.timeout(50000)
 
-    killallServers([ servers[0] ])
+    await killallServers([ servers[0] ])
 
     await reRunServer(servers[0], { views: { videos: { remote: { max_age: '10 days' } } } })
 
@@ -60,14 +58,14 @@ describe('Test video views cleaner', function () {
 
     {
       for (const server of servers) {
-        const total = await countVideoViewsOf(server.internalServerNumber, videoIdServer1)
+        const total = await server.sqlCommand.countVideoViewsOf(videoIdServer1)
         expect(total).to.equal(2, 'Server ' + server.serverNumber + ' does not have the correct amount of views')
       }
     }
 
     {
       for (const server of servers) {
-        const total = await countVideoViewsOf(server.internalServerNumber, videoIdServer2)
+        const total = await server.sqlCommand.countVideoViewsOf(videoIdServer2)
         expect(total).to.equal(2, 'Server ' + server.serverNumber + ' does not have the correct amount of views')
       }
     }
@@ -76,7 +74,7 @@ describe('Test video views cleaner', function () {
   it('Should clean old video views', async function () {
     this.timeout(50000)
 
-    killallServers([ servers[0] ])
+    await killallServers([ servers[0] ])
 
     await reRunServer(servers[0], { views: { videos: { remote: { max_age: '5 seconds' } } } })
 
@@ -86,23 +84,21 @@ describe('Test video views cleaner', function () {
 
     {
       for (const server of servers) {
-        const total = await countVideoViewsOf(server.internalServerNumber, videoIdServer1)
+        const total = await server.sqlCommand.countVideoViewsOf(videoIdServer1)
         expect(total).to.equal(2)
       }
     }
 
     {
-      const totalServer1 = await countVideoViewsOf(servers[0].internalServerNumber, videoIdServer2)
+      const totalServer1 = await servers[0].sqlCommand.countVideoViewsOf(videoIdServer2)
       expect(totalServer1).to.equal(0)
 
-      const totalServer2 = await countVideoViewsOf(servers[1].internalServerNumber, videoIdServer2)
+      const totalServer2 = await servers[1].sqlCommand.countVideoViewsOf(videoIdServer2)
       expect(totalServer2).to.equal(2)
     }
   })
 
   after(async function () {
-    await closeAllSequelize(servers)
-
     await cleanupTests(servers)
   })
 })
index e5efae36bcfab54d8004b962c9a7223be2bd21db..5344bfc96e9e8cd6e702a5b033f0446ff0d9b008 100644 (file)
@@ -39,7 +39,7 @@ describe('Test plugin scripts', function () {
   it('Should have the theme and the plugin registered when we restart peertube', async function () {
     this.timeout(30000)
 
-    killallServers([ server ])
+    await killallServers([ server ])
     await reRunServer(server)
 
     const config = await server.configCommand.getConfig()
@@ -62,7 +62,7 @@ describe('Test plugin scripts', function () {
   it('Should have removed the plugin on another peertube restart', async function () {
     this.timeout(30000)
 
-    killallServers([ server ])
+    await killallServers([ server ])
     await reRunServer(server)
 
     const config = await server.configCommand.getConfig()
index fa1df65a9e664ed9ee13033bc47b4413807e7bbc..d4dbee682e00d64b08073ce33bd82711c82f3da4 100644 (file)
@@ -110,7 +110,7 @@ describe('Test prune storage scripts', function () {
     await wait(1000)
 
     await waitJobs(servers)
-    killallServers(servers)
+    await killallServers(servers)
 
     await wait(1000)
   })
index d3a1520cffcb21adccb866804b54f6305ae14331..e986a04f2f500cc5d2dc0735dfcb7c1526772c25 100644 (file)
@@ -61,7 +61,7 @@ describe('Test update host scripts', function () {
   it('Should run update host', async function () {
     this.timeout(30000)
 
-    killallServers([ server ])
+    await killallServers([ server ])
     // Run server with standard configuration
     await reRunServer(server)
 
index 6659b6f39acbf348c280d46de31694d03c68eafa..f4b55522a4b832b0e82968b2a916fdb63c3c7117 100644 (file)
@@ -164,7 +164,7 @@ describe('Official plugin auto-block videos', function () {
 
     await check(servers[0], video.uuid, true)
 
-    killallServers([ servers[0] ])
+    await killallServers([ servers[0] ])
     await reRunServer(servers[0])
     await wait(2000)
 
index f86c83808960adbe6d6cbfab67764fee0ac36e19..844023b83a1bea9f869a628ae0721db02ebba614 100644 (file)
@@ -151,7 +151,7 @@ describe('Official plugin auto-mute', function () {
       expect(res.body.total).to.equal(2)
     }
 
-    killallServers([ servers[0] ])
+    await killallServers([ servers[0] ])
     await reRunServer(servers[0])
     await wait(2000)
 
index 6975ca4bb0f3f2e8b5ff275964855acbf7cc4a14..bcf773854b1033353fd3d90a5288f2f8e46c9061 100644 (file)
@@ -44,7 +44,7 @@ describe('Test plugin action hooks', function () {
 
     await servers[0].pluginsCommand.install({ path: PluginsCommand.getPluginTestPath() })
 
-    killallServers([ servers[0] ])
+    await killallServers([ servers[0] ])
 
     await reRunServer(servers[0], {
       live: {
index 76fd6943598a168cfdf778fa675f0455aef07f5d..3c6a67cf78656ef5d5ce263706250325741d2f3d 100644 (file)
@@ -40,7 +40,7 @@ async function run () {
 
   const cleanup = () => {
     console.log('Killing server')
-    killallServers([ server ])
+    await killallServers([ server ])
   }
 
   process.on('exit', cleanup)
index ccacd4c792512668ef4fc233d637f2865f123c2c..7e236c32996473fabe05dd9840e960d0ec2971a2 100644 (file)
@@ -1,3 +1,3 @@
 export * from './miscs'
-export * from './sql'
+export * from './sql-command'
 export * from './stubs'
diff --git a/shared/extra-utils/miscs/sql-command.ts b/shared/extra-utils/miscs/sql-command.ts
new file mode 100644 (file)
index 0000000..2a3e9e6
--- /dev/null
@@ -0,0 +1,142 @@
+import { QueryTypes, Sequelize } from 'sequelize'
+import { AbstractCommand } from '../shared'
+
+export class SQLCommand extends AbstractCommand {
+  private sequelize: Sequelize
+
+  deleteAll (table: string) {
+    const seq = this.getSequelize()
+
+    const options = { type: QueryTypes.DELETE }
+
+    return seq.query(`DELETE FROM "${table}"`, options)
+  }
+
+  async getCount (table: string) {
+    const seq = this.getSequelize()
+
+    const options = { type: QueryTypes.SELECT as QueryTypes.SELECT }
+
+    const [ { total } ] = await seq.query<{ total: string }>(`SELECT COUNT(*) as total FROM "${table}"`, options)
+    if (total === null) return 0
+
+    return parseInt(total, 10)
+  }
+
+  setActorField (to: string, field: string, value: string) {
+    const seq = this.getSequelize()
+
+    const options = { type: QueryTypes.UPDATE }
+
+    return seq.query(`UPDATE actor SET "${field}" = '${value}' WHERE url = '${to}'`, options)
+  }
+
+  setVideoField (uuid: string, field: string, value: string) {
+    const seq = this.getSequelize()
+
+    const options = { type: QueryTypes.UPDATE }
+
+    return seq.query(`UPDATE video SET "${field}" = '${value}' WHERE uuid = '${uuid}'`, options)
+  }
+
+  setPlaylistField (uuid: string, field: string, value: string) {
+    const seq = this.getSequelize()
+
+    const options = { type: QueryTypes.UPDATE }
+
+    return seq.query(`UPDATE "videoPlaylist" SET "${field}" = '${value}' WHERE uuid = '${uuid}'`, options)
+  }
+
+  async countVideoViewsOf (uuid: string) {
+    const seq = this.getSequelize()
+
+    // tslint:disable
+    const query = 'SELECT SUM("videoView"."views") AS "total" FROM "videoView" ' +
+      `INNER JOIN "video" ON "video"."id" = "videoView"."videoId" WHERE "video"."uuid" = '${uuid}'`
+
+    const options = { type: QueryTypes.SELECT as QueryTypes.SELECT }
+    const [ { total } ] = await seq.query<{ total: number }>(query, options)
+
+    if (!total) return 0
+
+    return parseInt(total + '', 10)
+  }
+
+  getActorImage (filename: string) {
+    return this.selectQuery(`SELECT * FROM "actorImage" WHERE filename = '${filename}'`)
+      .then(rows => rows[0])
+  }
+
+  selectQuery (query: string) {
+    const seq = this.getSequelize()
+    const options = { type: QueryTypes.SELECT as QueryTypes.SELECT }
+
+    return seq.query<any>(query, options)
+  }
+
+  updateQuery (query: string) {
+    const seq = this.getSequelize()
+    const options = { type: QueryTypes.UPDATE as QueryTypes.UPDATE }
+
+    return seq.query(query, options)
+  }
+
+  setPluginField (pluginName: string, field: string, value: string) {
+    const seq = this.getSequelize()
+
+    const options = { type: QueryTypes.UPDATE }
+
+    return seq.query(`UPDATE "plugin" SET "${field}" = '${value}' WHERE "name" = '${pluginName}'`, options)
+  }
+
+  setPluginVersion (pluginName: string, newVersion: string) {
+    return this.setPluginField(pluginName, 'version', newVersion)
+  }
+
+  setPluginLatestVersion (pluginName: string, newVersion: string) {
+    return this.setPluginField(pluginName, 'latestVersion', newVersion)
+  }
+
+  setActorFollowScores (newScore: number) {
+    const seq = this.getSequelize()
+
+    const options = { type: QueryTypes.UPDATE }
+
+    return seq.query(`UPDATE "actorFollow" SET "score" = ${newScore}`, options)
+  }
+
+  setTokenField (accessToken: string, field: string, value: string) {
+    const seq = this.getSequelize()
+
+    const options = { type: QueryTypes.UPDATE }
+
+    return seq.query(`UPDATE "oAuthToken" SET "${field}" = '${value}' WHERE "accessToken" = '${accessToken}'`, options)
+  }
+
+  async cleanup () {
+    if (!this.sequelize) return
+
+    await this.sequelize.close()
+    this.sequelize = undefined
+  }
+
+  private getSequelize () {
+    if (this.sequelize) return this.sequelize
+
+    const dbname = 'peertube_test' + this.server.internalServerNumber
+    const username = 'peertube'
+    const password = 'peertube'
+    const host = 'localhost'
+    const port = 5432
+
+    this.sequelize = new Sequelize(dbname, username, password, {
+      dialect: 'postgres',
+      host,
+      port,
+      logging: false
+    })
+
+    return this.sequelize
+  }
+
+}
diff --git a/shared/extra-utils/miscs/sql.ts b/shared/extra-utils/miscs/sql.ts
deleted file mode 100644 (file)
index 65a0aa5..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-import { QueryTypes, Sequelize } from 'sequelize'
-import { ServerInfo } from '../server/servers'
-
-const sequelizes: { [ id: number ]: Sequelize } = {}
-
-function getSequelize (internalServerNumber: number) {
-  if (sequelizes[internalServerNumber]) return sequelizes[internalServerNumber]
-
-  const dbname = 'peertube_test' + internalServerNumber
-  const username = 'peertube'
-  const password = 'peertube'
-  const host = 'localhost'
-  const port = 5432
-
-  const seq = new Sequelize(dbname, username, password, {
-    dialect: 'postgres',
-    host,
-    port,
-    logging: false
-  })
-
-  sequelizes[internalServerNumber] = seq
-
-  return seq
-}
-
-function deleteAll (internalServerNumber: number, table: string) {
-  const seq = getSequelize(internalServerNumber)
-
-  const options = { type: QueryTypes.DELETE }
-
-  return seq.query(`DELETE FROM "${table}"`, options)
-}
-
-async function getCount (internalServerNumber: number, table: string) {
-  const seq = getSequelize(internalServerNumber)
-
-  const options = { type: QueryTypes.SELECT as QueryTypes.SELECT }
-
-  const [ { total } ] = await seq.query<{ total: string }>(`SELECT COUNT(*) as total FROM "${table}"`, options)
-  if (total === null) return 0
-
-  return parseInt(total, 10)
-}
-
-function setActorField (internalServerNumber: number, to: string, field: string, value: string) {
-  const seq = getSequelize(internalServerNumber)
-
-  const options = { type: QueryTypes.UPDATE }
-
-  return seq.query(`UPDATE actor SET "${field}" = '${value}' WHERE url = '${to}'`, options)
-}
-
-function setVideoField (internalServerNumber: number, uuid: string, field: string, value: string) {
-  const seq = getSequelize(internalServerNumber)
-
-  const options = { type: QueryTypes.UPDATE }
-
-  return seq.query(`UPDATE video SET "${field}" = '${value}' WHERE uuid = '${uuid}'`, options)
-}
-
-function setPlaylistField (internalServerNumber: number, uuid: string, field: string, value: string) {
-  const seq = getSequelize(internalServerNumber)
-
-  const options = { type: QueryTypes.UPDATE }
-
-  return seq.query(`UPDATE "videoPlaylist" SET "${field}" = '${value}' WHERE uuid = '${uuid}'`, options)
-}
-
-async function countVideoViewsOf (internalServerNumber: number, uuid: string) {
-  const seq = getSequelize(internalServerNumber)
-
-  // tslint:disable
-  const query = 'SELECT SUM("videoView"."views") AS "total" FROM "videoView" ' +
-    `INNER JOIN "video" ON "video"."id" = "videoView"."videoId" WHERE "video"."uuid" = '${uuid}'`
-
-  const options = { type: QueryTypes.SELECT as QueryTypes.SELECT }
-  const [ { total } ] = await seq.query<{ total: number }>(query, options)
-
-  if (!total) return 0
-
-  return parseInt(total + '', 10)
-}
-
-function getActorImage (internalServerNumber: number, filename: string) {
-  return selectQuery(internalServerNumber, `SELECT * FROM "actorImage" WHERE filename = '${filename}'`)
-    .then(rows => rows[0])
-}
-
-function selectQuery (internalServerNumber: number, query: string) {
-  const seq = getSequelize(internalServerNumber)
-  const options = { type: QueryTypes.SELECT as QueryTypes.SELECT }
-
-  return seq.query<any>(query, options)
-}
-
-function updateQuery (internalServerNumber: number, query: string) {
-  const seq = getSequelize(internalServerNumber)
-  const options = { type: QueryTypes.UPDATE as QueryTypes.UPDATE }
-
-  return seq.query(query, options)
-}
-
-async function closeAllSequelize (servers: ServerInfo[]) {
-  for (const server of servers) {
-    if (sequelizes[server.internalServerNumber]) {
-      await sequelizes[server.internalServerNumber].close()
-      // eslint-disable-next-line
-      delete sequelizes[server.internalServerNumber]
-    }
-  }
-}
-
-function setPluginField (internalServerNumber: number, pluginName: string, field: string, value: string) {
-  const seq = getSequelize(internalServerNumber)
-
-  const options = { type: QueryTypes.UPDATE }
-
-  return seq.query(`UPDATE "plugin" SET "${field}" = '${value}' WHERE "name" = '${pluginName}'`, options)
-}
-
-function setPluginVersion (internalServerNumber: number, pluginName: string, newVersion: string) {
-  return setPluginField(internalServerNumber, pluginName, 'version', newVersion)
-}
-
-function setPluginLatestVersion (internalServerNumber: number, pluginName: string, newVersion: string) {
-  return setPluginField(internalServerNumber, pluginName, 'latestVersion', newVersion)
-}
-
-function setActorFollowScores (internalServerNumber: number, newScore: number) {
-  const seq = getSequelize(internalServerNumber)
-
-  const options = { type: QueryTypes.UPDATE }
-
-  return seq.query(`UPDATE "actorFollow" SET "score" = ${newScore}`, options)
-}
-
-function setTokenField (internalServerNumber: number, accessToken: string, field: string, value: string) {
-  const seq = getSequelize(internalServerNumber)
-
-  const options = { type: QueryTypes.UPDATE }
-
-  return seq.query(`UPDATE "oAuthToken" SET "${field}" = '${value}' WHERE "accessToken" = '${accessToken}'`, options)
-}
-
-export {
-  setVideoField,
-  setPlaylistField,
-  setActorField,
-  countVideoViewsOf,
-  setPluginVersion,
-  setPluginLatestVersion,
-  selectQuery,
-  getActorImage,
-  deleteAll,
-  setTokenField,
-  updateQuery,
-  setActorFollowScores,
-  closeAllSequelize,
-  getCount
-}
index d1eb0e3b2f9a6fc5d545ca252524209c884afa2c..940e4bf299ca1ece518001fb9cf6b75b0f710357 100644 (file)
@@ -2,13 +2,6 @@ function buildRequestStub (): any {
   return { }
 }
 
-function buildResponseStub (): any {
-  return {
-    locals: {}
-  }
-}
-
 export {
-  buildResponseStub,
   buildRequestStub
 }
index 41b48a8ee00facb5aa96237ff12634739391c191..bd3be8373aed04676868c40e59aa62b9370c59e8 100644 (file)
@@ -30,6 +30,7 @@ import {
   ServicesCommand,
   StreamingPlaylistsCommand
 } from '../videos'
+import { SQLCommand } from '../miscs'
 import { CommentsCommand } from '../videos/comments-command'
 import { ConfigCommand } from './config-command'
 import { ContactFormCommand } from './contact-form-command'
@@ -123,6 +124,7 @@ interface ServerInfo {
   streamingPlaylistsCommand?: StreamingPlaylistsCommand
   channelsCommand?: ChannelsCommand
   commentsCommand?: CommentsCommand
+  sqlCommand?: SQLCommand
 }
 
 function parallelTests () {
@@ -367,6 +369,7 @@ function assignCommands (server: ServerInfo) {
   server.streamingPlaylistsCommand = new StreamingPlaylistsCommand(server)
   server.channelsCommand = new ChannelsCommand(server)
   server.commentsCommand = new CommentsCommand(server)
+  server.sqlCommand = new SQLCommand(server)
 }
 
 async function reRunServer (server: ServerInfo, configOverride?: any) {
@@ -398,17 +401,20 @@ async function checkDirectoryIsEmpty (server: ServerInfo, directory: string, exc
   expect(filtered).to.have.lengthOf(0)
 }
 
-function killallServers (servers: ServerInfo[]) {
+async function killallServers (servers: ServerInfo[]) {
   for (const server of servers) {
     if (!server.app) continue
 
+    await server.sqlCommand.cleanup()
+
     process.kill(-server.app.pid)
+
     server.app = null
   }
 }
 
 async function cleanupTests (servers: ServerInfo[]) {
-  killallServers(servers)
+  await killallServers(servers)
 
   if (isGithubCI()) {
     await ensureDir('artifacts')
index 6a9ab1348d8c37b533e91085195cbb17c5c73ecf..200db90d418ba92667870c9842799eabb008053e 100644 (file)
@@ -1,6 +1,6 @@
 import { isAbsolute, join } from 'path'
 import { HttpStatusCode } from '@shared/core-utils'
-import { root } from '../miscs'
+import { root } from '../miscs/miscs'
 import {
   makeDeleteRequest,
   makeGetRequest,