run()
.catch(err => console.error(err))
.finally(() => {
- if (server) killallServers([ server ])
+ if (server) return killallServers([ server ])
})
function buildAuthorizationHeader () {
import * as chai from 'chai'
import {
cleanupTests,
- closeAllSequelize,
- deleteAll,
doubleFollow,
flushAndRunMultipleServers,
- getCount,
getVideo,
rateVideo,
- selectQuery,
ServerInfo,
setAccessTokensToServers,
- setVideoField,
- updateQuery,
uploadVideoAndGetId,
wait,
waitJobs
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)
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)
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)
})
expect(total).to.equal(3)
}
- await deleteAll(servers[2].internalServerNumber, 'videoComment')
+ await servers[2].sqlCommand.deleteAll('videoComment')
await wait(5000)
await waitJobs(servers)
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}$`)
{
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)
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}`)
{
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)
after(async function () {
await cleanupTests(servers)
-
- await closeAllSequelize(servers)
})
})
/* 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
{
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)
}
})
this.timeout(20000)
await cleanupTests(servers)
-
- await closeAllSequelize(servers)
})
})
import { HttpStatusCode } from '@shared/core-utils'
import {
cleanupTests,
- closeAllSequelize,
doubleFollow,
flushAndRunMultipleServers,
generateUserAccessToken,
reRunServer,
ServerInfo,
setAccessTokensToServers,
- setActorField,
setDefaultVideoChannel,
- setPlaylistField,
- setVideoField,
uploadVideo,
uploadVideoAndGetId,
wait,
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)
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)
// 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 })
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 })
this.timeout(10000)
await cleanupTests(servers)
-
- await closeAllSequelize(servers)
})
})
import {
buildAbsoluteFixturePath,
cleanupTests,
- closeAllSequelize,
flushAndRunMultipleServers,
killallServers,
reRunServer,
ServerInfo,
- setActorField,
wait
} from '../../../../shared/extra-utils'
import { makeFollowRequest, makePOSTAPRequest } from '../../../../shared/extra-utils/requests/activitypub'
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)
])
}
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)
])
}
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]))
this.timeout(10000)
await cleanupTests(servers)
-
- await closeAllSequelize(servers)
})
})
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 } })
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 } })
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: {
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)
before(async function () {
this.timeout(20000)
- killallServers([ servers[0] ])
+ await killallServers([ servers[0] ])
const config = {
auto_blacklist: {
MockSmtpServer,
prepareNotificationsTest,
ServerInfo,
- setPluginLatestVersion,
- setPluginVersion,
wait
} from '@shared/extra-utils'
import { PluginType, UserNotification, UserNotificationType } from '@shared/models'
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')
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)
}
}
}
- await killallServers([ localServer ])
+ await await killallServers([ localServer ])
await reRunServer(localServer, config)
await uploadWrapper('video 2 server 2')
}
}
}
- killallServers([ localServer ])
+ await killallServers([ localServer ])
await reRunServer(localServer, config)
await uploadWrapper('video 3 server 2')
it('Should stop server 1 and expire video redundancy', async function () {
this.timeout(80000)
- killallServers([ servers[0] ])
+ await killallServers([ servers[0] ])
await wait(15000)
await waitJobs(servers)
- killallServers([ servers[0] ])
+ await killallServers([ servers[0] ])
await reRunServer(servers[0], {
redundancy: {
videos: {
it('Should have the configuration updated after a restart', async function () {
this.timeout(10000)
- killallServers([ server ])
+ await killallServers([ server ])
await reRunServer(server)
expect(res.headers['x-frame-options']).to.exist
}
- killallServers([ server ])
+ await killallServers([ server ])
const config = {
security: {
import { HttpStatusCode } from '@shared/core-utils'
import {
cleanupTests,
- closeAllSequelize,
CommentsCommand,
completeVideoCheck,
flushAndRunMultipleServers,
reRunServer,
ServerInfo,
setAccessTokensToServers,
- setActorFollowScores,
updateVideo,
uploadVideo,
uploadVideoAndGetId,
}
// Kill server 2
- killallServers([ servers[1] ])
+ await killallServers([ servers[1] ])
// Remove server 2 follower
for (let i = 0; i < 10; i++) {
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
}
await waitJobs(servers)
- await setActorFollowScores(servers[1].internalServerNumber, 20)
+ await servers[1].sqlCommand.setActorFollowScores(20)
// Wait video expiration
await wait(11000)
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)
})
after(async function () {
- await closeAllSequelize([ servers[1] ])
-
await cleanupTests(servers)
})
})
it('Should have the same homepage after a restart', async function () {
this.timeout(30000)
- killallServers([ server ])
+ await killallServers([ server ])
await reRunServer(server)
it('Should not log ping requests', async function () {
this.timeout(30000)
- killallServers([ server ])
+ await killallServers([ server ])
await reRunServer(server, { log: { log_ping_requests: false } })
import { HttpStatusCode } from '@shared/core-utils'
import {
cleanupTests,
- closeAllSequelize,
flushAndRunServer,
getMyUserInformation,
killallServers,
reRunServer,
ServerInfo,
setAccessTokensToServers,
- setPluginVersion,
testHelloWorldRegisteredSettings,
updateMyUser,
wait,
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')
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)
{
await check()
- killallServers([ server ])
+ await killallServers([ server ])
await reRunServer(server)
await check()
})
after(async function () {
- await closeAllSequelize([ server ])
await cleanupTests([ server ])
})
})
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()
this.timeout(20000)
killallServers([ server ])
-
- reRunServer(server)
+ .then(() => reRunServer(server))
.then(() => {
const webtorrent = new WebTorrent()
import {
blockUser,
cleanupTests,
- closeAllSequelize,
createUser,
deleteMe,
flushAndRunServer,
reRunServer,
ServerInfo,
setAccessTokensToServers,
- setTokenField,
testImage,
unblockUser,
updateMyAvatar,
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)
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)
})
after(async function () {
- await closeAllSequelize([ server ])
await cleanupTests([ server ])
})
})
createUser,
doubleFollow,
flushAndRunMultipleServers,
- getActorImage,
getVideo,
getVideoChannelVideos,
setDefaultVideoChannel,
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)
}
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)
}
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' } } })
it('Should clean old history', async function () {
this.timeout(50000)
- killallServers([ server ])
+ await killallServers([ server ])
await reRunServer(server, { history: { videos: { max_age: '5 seconds' } } })
/* 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,
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' } } } })
{
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')
}
}
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' } } } })
{
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)
})
})
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()
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()
await wait(1000)
await waitJobs(servers)
- killallServers(servers)
+ await killallServers(servers)
await wait(1000)
})
it('Should run update host', async function () {
this.timeout(30000)
- killallServers([ server ])
+ await killallServers([ server ])
// Run server with standard configuration
await reRunServer(server)
await check(servers[0], video.uuid, true)
- killallServers([ servers[0] ])
+ await killallServers([ servers[0] ])
await reRunServer(servers[0])
await wait(2000)
expect(res.body.total).to.equal(2)
}
- killallServers([ servers[0] ])
+ await killallServers([ servers[0] ])
await reRunServer(servers[0])
await wait(2000)
await servers[0].pluginsCommand.install({ path: PluginsCommand.getPluginTestPath() })
- killallServers([ servers[0] ])
+ await killallServers([ servers[0] ])
await reRunServer(servers[0], {
live: {
const cleanup = () => {
console.log('Killing server')
- killallServers([ server ])
+ await killallServers([ server ])
}
process.on('exit', cleanup)
export * from './miscs'
-export * from './sql'
+export * from './sql-command'
export * from './stubs'
--- /dev/null
+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
+ }
+
+}
+++ /dev/null
-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
-}
return { }
}
-function buildResponseStub (): any {
- return {
- locals: {}
- }
-}
-
export {
- buildResponseStub,
buildRequestStub
}
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'
streamingPlaylistsCommand?: StreamingPlaylistsCommand
channelsCommand?: ChannelsCommand
commentsCommand?: CommentsCommand
+ sqlCommand?: SQLCommand
}
function parallelTests () {
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) {
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')
import { isAbsolute, join } from 'path'
import { HttpStatusCode } from '@shared/core-utils'
-import { root } from '../miscs'
+import { root } from '../miscs/miscs'
import {
makeDeleteRequest,
makeGetRequest,