Fix lint and tests

This commit is contained in:
Chocobozzz 2024-06-21 15:24:49 +02:00
parent 4f4d3adf73
commit 985e79f61e
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
7 changed files with 40 additions and 37 deletions

View File

@ -96,14 +96,14 @@ describe('Test server plugins API validators', function () {
it('Should fail with invalid paths', async function () { it('Should fail with invalid paths', async function () {
const paths = [ const paths = [
'/plugins/' + pluginName + '/' + npmVersion + '/static/images/../chocobo.png', '/plugins/' + pluginName + '/' + npmVersion + '/static/images/../chocobo.png',
'/plugins/' + pluginName + '/' + npmVersion + '/client-scripts/../client/common-client-plugin.js', '/plugins/' + pluginName + '/' + npmVersion + '/client-scripts/h/o/../client/common-client-plugin.js',
'/themes/' + themeName + '/' + themeVersion + '/static/../images/chocobo.png', '/themes/' + themeName + '/' + themeVersion + '/static/hola/a/../images/chocobo.png',
'/themes/' + themeName + '/' + themeVersion + '/client-scripts/client/video-watch-client-plugin.js/..', '/themes/' + themeName + '/' + themeVersion + '/client-scripts/client/video-watch-client-plugin.js/..',
'/themes/' + themeName + '/' + themeVersion + '/css/../assets/style1.css' '/themes/' + themeName + '/' + themeVersion + '/css/hiha//j../assets/style1.css'
] ]
for (const p of paths) { for (const p of paths) {
await makeGetRequest({ url: server.url, path: p, expectedStatus: HttpStatusCode.BAD_REQUEST_400 }) await makeGetRequest({ url: server.url, path: p, expectedStatus: HttpStatusCode.NOT_FOUND_404 })
} }
}) })

View File

@ -1,6 +1,5 @@
/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await,@typescript-eslint/no-floating-promises */ /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await,@typescript-eslint/no-floating-promises */
import WebTorrent from 'webtorrent'
import { import {
cleanupTests, cleanupTests,
createSingleServer, createSingleServer,
@ -9,11 +8,13 @@ import {
setAccessTokensToServers setAccessTokensToServers
} from '@peertube/peertube-server-commands' } from '@peertube/peertube-server-commands'
import { magnetUriDecode, magnetUriEncode } from '@tests/shared/webtorrent.js' import { magnetUriDecode, magnetUriEncode } from '@tests/shared/webtorrent.js'
import WebTorrent from 'webtorrent'
describe('Test tracker', function () { describe('Test tracker', function () {
let server: PeerTubeServer let server: PeerTubeServer
let badMagnet: string let badMagnet: string
let goodMagnet: string let goodMagnet: string
let webtorrent: WebTorrent.Instance
before(async function () { before(async function () {
this.timeout(60000) this.timeout(60000)
@ -32,9 +33,15 @@ describe('Test tracker', function () {
} }
}) })
it('Should succeed with the correct infohash', function (done) { beforeEach(() => {
const webtorrent = new WebTorrent() webtorrent = new WebTorrent()
})
afterEach(() => {
webtorrent.destroy()
})
it('Should succeed with the correct infohash', function (done) {
const torrent = webtorrent.add(goodMagnet) const torrent = webtorrent.add(goodMagnet)
torrent.on('error', done) torrent.on('error', done)
@ -54,8 +61,6 @@ describe('Test tracker', function () {
killallServers([ server ]) killallServers([ server ])
.then(() => server.run({ tracker: { enabled: false } })) .then(() => server.run({ tracker: { enabled: false } }))
.then(() => { .then(() => {
const webtorrent = new WebTorrent()
const torrent = webtorrent.add(goodMagnet) const torrent = webtorrent.add(goodMagnet)
torrent.on('error', done) torrent.on('error', done)
@ -78,14 +83,16 @@ describe('Test tracker', function () {
killallServers([ server ]) killallServers([ server ])
.then(() => server.run()) .then(() => server.run())
.then(() => { .then(() => {
const webtorrent = new WebTorrent()
const torrent = webtorrent.add(badMagnet) const torrent = webtorrent.add(badMagnet)
torrent.on('error', done) torrent.on('error', done)
torrent.on('warning', warn => { torrent.on('warning', function onWarn (warn) {
const message = typeof warn === 'string' ? warn : warn.message const message = typeof warn === 'string' ? warn : warn.message
if (message.includes('Unknown infoHash ')) return done() if (message.includes('Unknown infoHash ')) {
torrent.off('warning', onWarn)
return done()
}
}) })
torrent.on('done', () => done(new Error('No error on infohash'))) torrent.on('done', () => done(new Error('No error on infohash')))
@ -100,7 +107,7 @@ describe('Test tracker', function () {
torrent.on('error', done) torrent.on('error', done)
torrent.on('warning', warn => { torrent.on('warning', warn => {
const message = typeof warn === 'string' ? warn : warn.message const message = typeof warn === 'string' ? warn : warn.message
if (message.includes('Unsupported tracker protocol')) return done() if (message.includes('Error connecting')) return done()
}) })
}) })

View File

@ -1,10 +1,11 @@
import config from 'config'
import { readFileSync, writeFileSync } from 'fs'
import { URL } from 'url'
import { uniqify } from '@peertube/peertube-core-utils' import { uniqify } from '@peertube/peertube-core-utils'
import { getFFmpegVersion } from '@peertube/peertube-ffmpeg' import { getFFmpegVersion } from '@peertube/peertube-ffmpeg'
import { RecentlyAddedStrategy, VideoRedundancyConfigFilter } from '@peertube/peertube-models' import { VideoRedundancyConfigFilter } from '@peertube/peertube-models'
import { isProdInstance } from '@peertube/peertube-node-utils' import { isProdInstance } from '@peertube/peertube-node-utils'
import config from 'config'
import { readFileSync, writeFileSync } from 'fs'
import { basename } from 'path'
import { URL } from 'url'
import { parseBytes, parseSemVersion } from '../helpers/core-utils.js' import { parseBytes, parseSemVersion } from '../helpers/core-utils.js'
import { isArray } from '../helpers/custom-validators/misc.js' import { isArray } from '../helpers/custom-validators/misc.js'
import { logger } from '../helpers/logger.js' import { logger } from '../helpers/logger.js'
@ -13,7 +14,6 @@ import { OAuthClientModel } from '../models/oauth/oauth-client.js'
import { UserModel } from '../models/user/user.js' import { UserModel } from '../models/user/user.js'
import { CONFIG, getLocalConfigFilePath, isEmailEnabled, reloadConfig } from './config.js' import { CONFIG, getLocalConfigFilePath, isEmailEnabled, reloadConfig } from './config.js'
import { WEBSERVER } from './constants.js' import { WEBSERVER } from './constants.js'
import { basename } from 'path'
async function checkActivityPubUrls () { async function checkActivityPubUrls () {
const actor = await getServerActor() const actor = await getServerActor()
@ -101,12 +101,8 @@ async function checkFFmpegVersion () {
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
export { export {
checkConfig,
clientsExist,
checkFFmpegVersion,
usersExist,
applicationExist, applicationExist,
checkActivityPubUrls checkActivityPubUrls, checkConfig, checkFFmpegVersion, clientsExist, usersExist
} }
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@ -194,7 +190,7 @@ function checkLocalRedundancyConfig () {
throw new Error('Redundancy video entries should have unique strategies') throw new Error('Redundancy video entries should have unique strategies')
} }
const recentlyAddedStrategy = redundancyVideos.find(r => r.strategy === 'recently-added') as RecentlyAddedStrategy const recentlyAddedStrategy = redundancyVideos.find(r => r.strategy === 'recently-added')
if (recentlyAddedStrategy && isNaN(recentlyAddedStrategy.minViews)) { if (recentlyAddedStrategy && isNaN(recentlyAddedStrategy.minViews)) {
throw new Error('Min views in recently added strategy is not a number') throw new Error('Min views in recently added strategy is not a number')
} }

View File

@ -52,7 +52,7 @@ export function getFileAttributesFromUrl (
videoOrPlaylist: MVideo | MStreamingPlaylistVideo, videoOrPlaylist: MVideo | MStreamingPlaylistVideo,
urls: (ActivityTagObject | ActivityUrlObject)[] urls: (ActivityTagObject | ActivityUrlObject)[]
) { ) {
const fileUrls = urls.filter(u => isAPVideoUrlObject(u)) as ActivityVideoUrlObject[] const fileUrls = urls.filter(u => isAPVideoUrlObject(u))
if (fileUrls.length === 0) return [] if (fileUrls.length === 0) return []
const attributes: FilteredModelAttributes<VideoFileModel>[] = [] const attributes: FilteredModelAttributes<VideoFileModel>[] = []
@ -107,14 +107,14 @@ export function getFileAttributesFromUrl (
} }
export function getStreamingPlaylistAttributesFromObject (video: MVideoId, videoObject: VideoObject) { export function getStreamingPlaylistAttributesFromObject (video: MVideoId, videoObject: VideoObject) {
const playlistUrls = videoObject.url.filter(u => isAPStreamingPlaylistUrlObject(u)) as ActivityPlaylistUrlObject[] const playlistUrls = videoObject.url.filter(u => isAPStreamingPlaylistUrlObject(u))
if (playlistUrls.length === 0) return [] if (playlistUrls.length === 0) return []
const attributes: (FilteredModelAttributes<VideoStreamingPlaylistModel> & { tagAPObject?: ActivityTagObject[] })[] = [] const attributes: (FilteredModelAttributes<VideoStreamingPlaylistModel> & { tagAPObject?: ActivityTagObject[] })[] = []
for (const playlistUrlObject of playlistUrls) { for (const playlistUrlObject of playlistUrls) {
const segmentsSha256UrlObject = playlistUrlObject.tag.find(isAPPlaylistSegmentHashesUrlObject) const segmentsSha256UrlObject = playlistUrlObject.tag.find(isAPPlaylistSegmentHashesUrlObject)
const files: unknown[] = playlistUrlObject.tag.filter(u => isAPVideoUrlObject(u)) as ActivityVideoUrlObject[] const files: unknown[] = playlistUrlObject.tag.filter(u => isAPVideoUrlObject(u))
const attribute = { const attribute = {
type: VideoStreamingPlaylistType.HLS, type: VideoStreamingPlaylistType.HLS,

View File

@ -1,8 +1,8 @@
import { Job } from 'bullmq' import { RefreshPayload } from '@peertube/peertube-models'
import { refreshVideoPlaylistIfNeeded } from '@server/lib/activitypub/playlists/index.js' import { refreshVideoPlaylistIfNeeded } from '@server/lib/activitypub/playlists/index.js'
import { refreshVideoIfNeeded } from '@server/lib/activitypub/videos/index.js' import { refreshVideoIfNeeded } from '@server/lib/activitypub/videos/index.js'
import { loadVideoByUrl } from '@server/lib/model-loaders/index.js' import { loadVideoByUrl, VideoLoadByUrlType } from '@server/lib/model-loaders/index.js'
import { RefreshPayload } from '@peertube/peertube-models' import { Job } from 'bullmq'
import { logger } from '../../../helpers/logger.js' import { logger } from '../../../helpers/logger.js'
import { ActorModel } from '../../../models/actor/actor.js' import { ActorModel } from '../../../models/actor/actor.js'
import { VideoPlaylistModel } from '../../../models/video/video-playlist.js' import { VideoPlaylistModel } from '../../../models/video/video-playlist.js'
@ -27,14 +27,14 @@ export {
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
async function refreshVideo (videoUrl: string) { async function refreshVideo (videoUrl: string) {
const fetchType = 'all' as 'all' const fetchType = 'all'
const syncParam = { rates: true, shares: true, comments: true } const syncParam = { rates: true, shares: true, comments: true }
const videoFromDatabase = await loadVideoByUrl(videoUrl, fetchType) const videoFromDatabase = await loadVideoByUrl(videoUrl, fetchType)
if (videoFromDatabase) { if (videoFromDatabase) {
const refreshOptions = { const refreshOptions = {
video: videoFromDatabase, video: videoFromDatabase,
fetchedType: fetchType, fetchedType: fetchType as VideoLoadByUrlType,
syncParam syncParam
} }
@ -43,7 +43,7 @@ async function refreshVideo (videoUrl: string) {
} }
async function refreshActor (actorUrl: string) { async function refreshActor (actorUrl: string) {
const fetchType = 'all' as 'all' const fetchType = 'all'
const actor = await ActorModel.loadByUrlAndPopulateAccountAndChannel(actorUrl) const actor = await ActorModel.loadByUrlAndPopulateAccountAndChannel(actorUrl)
if (actor) { if (actor) {

View File

@ -1,6 +1,6 @@
import { ExpressPromiseHandler } from '@server/types/express-handler.js'
import { NextFunction, Request, RequestHandler, Response } from 'express' import { NextFunction, Request, RequestHandler, Response } from 'express'
import { ValidationChain } from 'express-validator' import { ValidationChain } from 'express-validator'
import { ExpressPromiseHandler } from '@server/types/express-handler.js'
import { retryTransactionWrapper } from '../helpers/database-utils.js' import { retryTransactionWrapper } from '../helpers/database-utils.js'
// Syntactic sugar to avoid try/catch in express controllers/middlewares // Syntactic sugar to avoid try/catch in express controllers/middlewares
@ -15,7 +15,7 @@ function asyncMiddleware (fun: RequestPromiseHandler | RequestPromiseHandler[])
} }
try { try {
for (const f of (fun as RequestPromiseHandler[])) { for (const f of fun) {
await new Promise<void>((resolve, reject) => { await new Promise<void>((resolve, reject) => {
return asyncMiddleware(f)(req, res, err => { return asyncMiddleware(f)(req, res, err => {
if (err) return reject(err) if (err) return reject(err)

View File

@ -354,7 +354,7 @@ export class ActorModel extends SequelizeModel<ActorModel> {
const options = { const options = {
type: QueryTypes.SELECT as QueryTypes.SELECT, type: QueryTypes.SELECT as QueryTypes.SELECT,
replacements: { videoId }, replacements: { videoId },
plain: true as true, plain: true,
transaction transaction
} }