From 3a4992633ee62d5edfbb484d9c6bcb3cf158489d Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 31 Jul 2023 14:34:36 +0200 Subject: Migrate server to ESM Sorry for the very big commit that may lead to git log issues and merge conflicts, but it's a major step forward: * Server can be faster at startup because imports() are async and we can easily lazy import big modules * Angular doesn't seem to support ES import (with .js extension), so we had to correctly organize peertube into a monorepo: * Use yarn workspace feature * Use typescript reference projects for dependencies * Shared projects have been moved into "packages", each one is now a node module (with a dedicated package.json/tsconfig.json) * server/tools have been moved into apps/ and is now a dedicated app bundled and published on NPM so users don't have to build peertube cli tools manually * server/tests have been moved into packages/ so we don't compile them every time we want to run the server * Use isolatedModule option: * Had to move from const enum to const (https://www.typescriptlang.org/docs/handbook/enums.html#objects-vs-enums) * Had to explictely specify "type" imports when used in decorators * Prefer tsx (that uses esbuild under the hood) instead of ts-node to load typescript files (tests with mocha or scripts): * To reduce test complexity as esbuild doesn't support decorator metadata, we only test server files that do not import server models * We still build tests files into js files for a faster CI * Remove unmaintained peertube CLI import script * Removed some barrels to speed up execution (less imports) --- .../api/check-params/channel-import-videos.ts | 209 --------------------- 1 file changed, 209 deletions(-) delete mode 100644 server/tests/api/check-params/channel-import-videos.ts (limited to 'server/tests/api/check-params/channel-import-videos.ts') diff --git a/server/tests/api/check-params/channel-import-videos.ts b/server/tests/api/check-params/channel-import-videos.ts deleted file mode 100644 index 2de13b629..000000000 --- a/server/tests/api/check-params/channel-import-videos.ts +++ /dev/null @@ -1,209 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ - -import { FIXTURE_URLS } from '@server/tests/shared' -import { areHttpImportTestsDisabled } from '@shared/core-utils' -import { HttpStatusCode } from '@shared/models' -import { - ChannelsCommand, - cleanupTests, - createSingleServer, - PeerTubeServer, - setAccessTokensToServers, - setDefaultVideoChannel -} from '@shared/server-commands' - -describe('Test videos import in a channel API validator', function () { - let server: PeerTubeServer - const userInfo = { - accessToken: '', - channelName: 'fake_channel', - channelId: -1, - id: -1, - videoQuota: -1, - videoQuotaDaily: -1, - channelSyncId: -1 - } - let command: ChannelsCommand - - // --------------------------------------------------------------- - - before(async function () { - this.timeout(120000) - - server = await createSingleServer(1) - - await setAccessTokensToServers([ server ]) - await setDefaultVideoChannel([ server ]) - - await server.config.enableImports() - await server.config.enableChannelSync() - - const userCreds = { - username: 'fake', - password: 'fake_password' - } - - { - const user = await server.users.create({ username: userCreds.username, password: userCreds.password }) - userInfo.id = user.id - userInfo.accessToken = await server.login.getAccessToken(userCreds) - - const info = await server.users.getMyInfo({ token: userInfo.accessToken }) - userInfo.channelId = info.videoChannels[0].id - } - - { - const { videoChannelSync } = await server.channelSyncs.create({ - token: userInfo.accessToken, - attributes: { - externalChannelUrl: FIXTURE_URLS.youtubeChannel, - videoChannelId: userInfo.channelId - } - }) - userInfo.channelSyncId = videoChannelSync.id - } - - command = server.channels - }) - - it('Should fail when HTTP upload is disabled', async function () { - await server.config.disableChannelSync() - await server.config.disableImports() - - await command.importVideos({ - channelName: server.store.channel.name, - externalChannelUrl: FIXTURE_URLS.youtubeChannel, - token: server.accessToken, - expectedStatus: HttpStatusCode.FORBIDDEN_403 - }) - - await server.config.enableImports() - }) - - it('Should fail when externalChannelUrl is not provided', async function () { - await command.importVideos({ - channelName: server.store.channel.name, - externalChannelUrl: null, - token: server.accessToken, - expectedStatus: HttpStatusCode.BAD_REQUEST_400 - }) - }) - - it('Should fail when externalChannelUrl is malformed', async function () { - await command.importVideos({ - channelName: server.store.channel.name, - externalChannelUrl: 'not-a-url', - token: server.accessToken, - expectedStatus: HttpStatusCode.BAD_REQUEST_400 - }) - }) - - it('Should fail with a bad sync id', async function () { - await command.importVideos({ - channelName: server.store.channel.name, - externalChannelUrl: FIXTURE_URLS.youtubeChannel, - videoChannelSyncId: 'toto' as any, - token: server.accessToken, - expectedStatus: HttpStatusCode.BAD_REQUEST_400 - }) - }) - - it('Should fail with a unknown sync id', async function () { - await command.importVideos({ - channelName: server.store.channel.name, - externalChannelUrl: FIXTURE_URLS.youtubeChannel, - videoChannelSyncId: 42, - token: server.accessToken, - expectedStatus: HttpStatusCode.NOT_FOUND_404 - }) - }) - - it('Should fail with a sync id of another channel', async function () { - await command.importVideos({ - channelName: server.store.channel.name, - externalChannelUrl: FIXTURE_URLS.youtubeChannel, - videoChannelSyncId: userInfo.channelSyncId, - token: server.accessToken, - expectedStatus: HttpStatusCode.FORBIDDEN_403 - }) - }) - - it('Should fail with no authentication', async function () { - await command.importVideos({ - channelName: server.store.channel.name, - externalChannelUrl: FIXTURE_URLS.youtubeChannel, - token: null, - expectedStatus: HttpStatusCode.UNAUTHORIZED_401 - }) - }) - - it('Should fail when sync is not owned by the user', async function () { - await command.importVideos({ - channelName: server.store.channel.name, - externalChannelUrl: FIXTURE_URLS.youtubeChannel, - token: userInfo.accessToken, - expectedStatus: HttpStatusCode.FORBIDDEN_403 - }) - }) - - it('Should fail when the user has no quota', async function () { - await server.users.update({ - userId: userInfo.id, - videoQuota: 0 - }) - - await command.importVideos({ - channelName: 'fake_channel', - externalChannelUrl: FIXTURE_URLS.youtubeChannel, - token: userInfo.accessToken, - expectedStatus: HttpStatusCode.PAYLOAD_TOO_LARGE_413 - }) - - await server.users.update({ - userId: userInfo.id, - videoQuota: userInfo.videoQuota - }) - }) - - it('Should fail when the user has no daily quota', async function () { - await server.users.update({ - userId: userInfo.id, - videoQuotaDaily: 0 - }) - - await command.importVideos({ - channelName: 'fake_channel', - externalChannelUrl: FIXTURE_URLS.youtubeChannel, - token: userInfo.accessToken, - expectedStatus: HttpStatusCode.PAYLOAD_TOO_LARGE_413 - }) - - await server.users.update({ - userId: userInfo.id, - videoQuotaDaily: userInfo.videoQuotaDaily - }) - }) - - it('Should succeed when sync is run by its owner', async function () { - if (!areHttpImportTestsDisabled()) return - - await command.importVideos({ - channelName: 'fake_channel', - externalChannelUrl: FIXTURE_URLS.youtubeChannel, - token: userInfo.accessToken - }) - }) - - it('Should succeed when sync is run with root and for another user\'s channel', async function () { - if (!areHttpImportTestsDisabled()) return - - await command.importVideos({ - channelName: 'fake_channel', - externalChannelUrl: FIXTURE_URLS.youtubeChannel - }) - }) - - after(async function () { - await cleanupTests([ server ]) - }) -}) -- cgit v1.2.3