X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=server%2Ftests%2Fapi%2Fvideos%2Fvideo-privacy.ts;h=5ec62615554e4980629a65755d9e10db06345052;hb=254d3579f5338f5fd775c17d15cdfc37078bcfb4;hp=4bbbb90f3df9a63d00d937b60561055c5a5bab9e;hpb=a30a136c9896c656cab98d2c92cde32c534dc098;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/tests/api/videos/video-privacy.ts b/server/tests/api/videos/video-privacy.ts index 4bbbb90f3..5ec626155 100644 --- a/server/tests/api/videos/video-privacy.ts +++ b/server/tests/api/videos/video-privacy.ts @@ -1,28 +1,15 @@ /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ -import * as chai from 'chai' import 'mocha' -import { VideoPrivacy } from '../../../../shared/models/videos/video-privacy.enum' -import { - cleanupTests, - flushAndRunMultipleServers, - getVideosList, - getVideosListWithToken, - ServerInfo, - setAccessTokensToServers, - uploadVideo -} from '../../../../shared/extra-utils/index' -import { doubleFollow } from '../../../../shared/extra-utils/server/follows' -import { userLogin } from '../../../../shared/extra-utils/users/login' -import { createUser } from '../../../../shared/extra-utils/users/users' -import { getMyVideos, getVideo, getVideoWithToken, updateVideo } from '../../../../shared/extra-utils/videos/videos' -import { waitJobs } from '../../../../shared/extra-utils/server/jobs' -import { Video } from '@shared/models' +import * as chai from 'chai' +import { HttpStatusCode } from '@shared/core-utils' +import { cleanupTests, doubleFollow, createSingleServer, PeerTubeServer, setAccessTokensToServers, waitJobs } from '@shared/extra-utils' +import { VideoCreateResult, VideoPrivacy } from '@shared/models' const expect = chai.expect describe('Test video privacy', function () { - let servers: ServerInfo[] = [] + const servers: PeerTubeServer[] = [] let anotherUserToken: string let privateVideoId: number @@ -31,15 +18,25 @@ describe('Test video privacy', function () { let internalVideoId: number let internalVideoUUID: string - let unlistedVideoUUID: string + let unlistedVideo: VideoCreateResult + let nonFederatedUnlistedVideoUUID: string let now: number + const dontFederateUnlistedConfig = { + federation: { + videos: { + federate_unlisted: false + } + } + } + before(async function () { this.timeout(50000) // Run servers - servers = await flushAndRunMultipleServers(2) + servers.push(await createSingleServer(1, dontFederateUnlistedConfig)) + servers.push(await createSingleServer(2)) // Get the access tokens await setAccessTokensToServers(servers) @@ -48,200 +45,246 @@ describe('Test video privacy', function () { await doubleFollow(servers[0], servers[1]) }) - it('Should upload a private and internal videos on server 1', async function () { - this.timeout(10000) + describe('Private and internal videos', function () { - for (const privacy of [ VideoPrivacy.PRIVATE, VideoPrivacy.INTERNAL ]) { - const attributes = { privacy } - await uploadVideo(servers[0].url, servers[0].accessToken, attributes) - } + it('Should upload a private and internal videos on server 1', async function () { + this.timeout(10000) - await waitJobs(servers) - }) + for (const privacy of [ VideoPrivacy.PRIVATE, VideoPrivacy.INTERNAL ]) { + const attributes = { privacy } + await servers[0].videos.upload({ attributes }) + } - it('Should not have these private and internal videos on server 2', async function () { - const res = await getVideosList(servers[1].url) + await waitJobs(servers) + }) - expect(res.body.total).to.equal(0) - expect(res.body.data).to.have.lengthOf(0) - }) + it('Should not have these private and internal videos on server 2', async function () { + const { total, data } = await servers[1].videos.list() - it('Should not list the private and internal videos for an unauthenticated user on server 1', async function () { - const res = await getVideosList(servers[0].url) + expect(total).to.equal(0) + expect(data).to.have.lengthOf(0) + }) - expect(res.body.total).to.equal(0) - expect(res.body.data).to.have.lengthOf(0) - }) + it('Should not list the private and internal videos for an unauthenticated user on server 1', async function () { + const { total, data } = await servers[0].videos.list() - it('Should not list the private video and list the internal video for an authenticated user on server 1', async function () { - const res = await getVideosListWithToken(servers[0].url, servers[0].accessToken) + expect(total).to.equal(0) + expect(data).to.have.lengthOf(0) + }) - expect(res.body.total).to.equal(1) - expect(res.body.data).to.have.lengthOf(1) + it('Should not list the private video and list the internal video for an authenticated user on server 1', async function () { + const { total, data } = await servers[0].videos.listWithToken() - expect(res.body.data[0].privacy.id).to.equal(VideoPrivacy.INTERNAL) - }) + expect(total).to.equal(1) + expect(data).to.have.lengthOf(1) - it('Should list my (private and internal) videos', async function () { - const res = await getMyVideos(servers[0].url, servers[0].accessToken, 0, 10) + expect(data[0].privacy.id).to.equal(VideoPrivacy.INTERNAL) + }) - expect(res.body.total).to.equal(2) - expect(res.body.data).to.have.lengthOf(2) + it('Should list my (private and internal) videos', async function () { + const { total, data } = await servers[0].videos.listMyVideos() - const videos: Video[] = res.body.data + expect(total).to.equal(2) + expect(data).to.have.lengthOf(2) - const privateVideo = videos.find(v => v.privacy.id === VideoPrivacy.PRIVATE) - privateVideoId = privateVideo.id - privateVideoUUID = privateVideo.uuid + const privateVideo = data.find(v => v.privacy.id === VideoPrivacy.PRIVATE) + privateVideoId = privateVideo.id + privateVideoUUID = privateVideo.uuid - const internalVideo = videos.find(v => v.privacy.id === VideoPrivacy.INTERNAL) - internalVideoId = internalVideo.id - internalVideoUUID = internalVideo.uuid - }) + const internalVideo = data.find(v => v.privacy.id === VideoPrivacy.INTERNAL) + internalVideoId = internalVideo.id + internalVideoUUID = internalVideo.uuid + }) - it('Should not be able to watch the private/internal video with non authenticated user', async function () { - await getVideo(servers[0].url, privateVideoUUID, 401) - await getVideo(servers[0].url, internalVideoUUID, 401) - }) + it('Should not be able to watch the private/internal video with non authenticated user', async function () { + await servers[0].videos.get({ id: privateVideoUUID, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 }) + await servers[0].videos.get({ id: internalVideoUUID, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 }) + }) - it('Should not be able to watch the private video with another user', async function () { - this.timeout(10000) + it('Should not be able to watch the private video with another user', async function () { + this.timeout(10000) - const user = { - username: 'hello', - password: 'super password' - } - await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: user.username, password: user.password }) + const user = { + username: 'hello', + password: 'super password' + } + await servers[0].users.create({ username: user.username, password: user.password }) - anotherUserToken = await userLogin(servers[0], user) - await getVideoWithToken(servers[0].url, anotherUserToken, privateVideoUUID, 403) - }) + anotherUserToken = await servers[0].login.getAccessToken(user) - it('Should be able to watch the internal video with another user', async function () { - await getVideoWithToken(servers[0].url, anotherUserToken, internalVideoUUID, 200) - }) + await servers[0].videos.getWithToken({ + token: anotherUserToken, + id: privateVideoUUID, + expectedStatus: HttpStatusCode.FORBIDDEN_403 + }) + }) - it('Should be able to watch the private video with the correct user', async function () { - await getVideoWithToken(servers[0].url, servers[0].accessToken, privateVideoUUID, 200) + it('Should be able to watch the internal video with another user', async function () { + await servers[0].videos.getWithToken({ token: anotherUserToken, id: internalVideoUUID }) + }) + + it('Should be able to watch the private video with the correct user', async function () { + await servers[0].videos.getWithToken({ id: privateVideoUUID }) + }) }) - it('Should upload an unlisted video on server 2', async function () { - this.timeout(30000) + describe('Unlisted videos', function () { - const attributes = { - name: 'unlisted video', - privacy: VideoPrivacy.UNLISTED - } - await uploadVideo(servers[1].url, servers[1].accessToken, attributes) + it('Should upload an unlisted video on server 2', async function () { + this.timeout(60000) - // Server 2 has transcoding enabled - await waitJobs(servers) - }) + const attributes = { + name: 'unlisted video', + privacy: VideoPrivacy.UNLISTED + } + await servers[1].videos.upload({ attributes }) - it('Should not have this unlisted video listed on server 1 and 2', async function () { - for (const server of servers) { - const res = await getVideosList(server.url) + // Server 2 has transcoding enabled + await waitJobs(servers) + }) - expect(res.body.total).to.equal(0) - expect(res.body.data).to.have.lengthOf(0) - } - }) + it('Should not have this unlisted video listed on server 1 and 2', async function () { + for (const server of servers) { + const { total, data } = await server.videos.list() - it('Should list my (unlisted) videos', async function () { - const res = await getMyVideos(servers[1].url, servers[1].accessToken, 0, 1) + expect(total).to.equal(0) + expect(data).to.have.lengthOf(0) + } + }) - expect(res.body.total).to.equal(1) - expect(res.body.data).to.have.lengthOf(1) + it('Should list my (unlisted) videos', async function () { + const { total, data } = await servers[1].videos.listMyVideos() - unlistedVideoUUID = res.body.data[0].uuid - }) + expect(total).to.equal(1) + expect(data).to.have.lengthOf(1) - it('Should be able to get this unlisted video', async function () { - for (const server of servers) { - const res = await getVideo(server.url, unlistedVideoUUID) + unlistedVideo = data[0] + }) - expect(res.body.name).to.equal('unlisted video') - } - }) - - it('Should update the private and internal videos to public on server 1', async function () { - this.timeout(10000) + it('Should not be able to get this unlisted video using its id', async function () { + await servers[1].videos.get({ id: unlistedVideo.id, expectedStatus: HttpStatusCode.BAD_REQUEST_400 }) + }) - now = Date.now() + it('Should be able to get this unlisted video using its uuid/shortUUID', async function () { + for (const server of servers) { + for (const id of [ unlistedVideo.uuid, unlistedVideo.shortUUID ]) { + const video = await server.videos.get({ id }) - { - const attribute = { - name: 'private video becomes public', - privacy: VideoPrivacy.PUBLIC + expect(video.name).to.equal('unlisted video') + } } + }) - await updateVideo(servers[0].url, servers[0].accessToken, privateVideoId, attribute) - } + it('Should upload a non-federating unlisted video to server 1', async function () { + this.timeout(30000) - { - const attribute = { - name: 'internal video becomes public', - privacy: VideoPrivacy.PUBLIC + const attributes = { + name: 'unlisted video', + privacy: VideoPrivacy.UNLISTED } - await updateVideo(servers[0].url, servers[0].accessToken, internalVideoId, attribute) - } + await servers[0].videos.upload({ attributes }) - await waitJobs(servers) - }) + await waitJobs(servers) + }) - it('Should have this new public video listed on server 1 and 2', async function () { - for (const server of servers) { - const res = await getVideosList(server.url) - expect(res.body.total).to.equal(2) - expect(res.body.data).to.have.lengthOf(2) + it('Should list my new unlisted video', async function () { + const { total, data } = await servers[0].videos.listMyVideos() - const videos: Video[] = res.body.data - const privateVideo = videos.find(v => v.name === 'private video becomes public') - const internalVideo = videos.find(v => v.name === 'internal video becomes public') + expect(total).to.equal(3) + expect(data).to.have.lengthOf(3) - expect(privateVideo).to.not.be.undefined - expect(internalVideo).to.not.be.undefined + nonFederatedUnlistedVideoUUID = data[0].uuid + }) - expect(new Date(privateVideo.publishedAt).getTime()).to.be.at.least(now) - // We don't change the publish date of internal videos - expect(new Date(internalVideo.publishedAt).getTime()).to.be.below(now) + it('Should be able to get non-federated unlisted video from origin', async function () { + const video = await servers[0].videos.get({ id: nonFederatedUnlistedVideoUUID }) - expect(privateVideo.privacy.id).to.equal(VideoPrivacy.PUBLIC) - expect(internalVideo.privacy.id).to.equal(VideoPrivacy.PUBLIC) - } + expect(video.name).to.equal('unlisted video') + }) + + it('Should not be able to get non-federated unlisted video from federated server', async function () { + await servers[1].videos.get({ id: nonFederatedUnlistedVideoUUID, expectedStatus: HttpStatusCode.NOT_FOUND_404 }) + }) }) - it('Should set these videos as private and internal', async function () { - this.timeout(10000) + describe('Privacy update', function () { - await updateVideo(servers[0].url, servers[0].accessToken, internalVideoId, { privacy: VideoPrivacy.PRIVATE }) - await updateVideo(servers[0].url, servers[0].accessToken, privateVideoId, { privacy: VideoPrivacy.INTERNAL }) + it('Should update the private and internal videos to public on server 1', async function () { + this.timeout(10000) - await waitJobs(servers) + now = Date.now() - for (const server of servers) { - const res = await getVideosList(server.url) + { + const attributes = { + name: 'private video becomes public', + privacy: VideoPrivacy.PUBLIC + } - expect(res.body.total).to.equal(0) - expect(res.body.data).to.have.lengthOf(0) - } + await servers[0].videos.update({ id: privateVideoId, attributes }) + } + + { + const attributes = { + name: 'internal video becomes public', + privacy: VideoPrivacy.PUBLIC + } + await servers[0].videos.update({ id: internalVideoId, attributes }) + } - { - const res = await getMyVideos(servers[0].url, servers[0].accessToken, 0, 5) - const videos = res.body.data + await waitJobs(servers) + }) - expect(res.body.total).to.equal(2) - expect(videos).to.have.lengthOf(2) + it('Should have this new public video listed on server 1 and 2', async function () { + for (const server of servers) { + const { total, data } = await server.videos.list() + expect(total).to.equal(2) + expect(data).to.have.lengthOf(2) - const privateVideo = videos.find(v => v.name === 'private video becomes public') - const internalVideo = videos.find(v => v.name === 'internal video becomes public') + const privateVideo = data.find(v => v.name === 'private video becomes public') + const internalVideo = data.find(v => v.name === 'internal video becomes public') - expect(privateVideo).to.not.be.undefined - expect(internalVideo).to.not.be.undefined + expect(privateVideo).to.not.be.undefined + expect(internalVideo).to.not.be.undefined - expect(privateVideo.privacy.id).to.equal(VideoPrivacy.INTERNAL) - expect(internalVideo.privacy.id).to.equal(VideoPrivacy.PRIVATE) - } + expect(new Date(privateVideo.publishedAt).getTime()).to.be.at.least(now) + // We don't change the publish date of internal videos + expect(new Date(internalVideo.publishedAt).getTime()).to.be.below(now) + + expect(privateVideo.privacy.id).to.equal(VideoPrivacy.PUBLIC) + expect(internalVideo.privacy.id).to.equal(VideoPrivacy.PUBLIC) + } + }) + + it('Should set these videos as private and internal', async function () { + this.timeout(10000) + + await servers[0].videos.update({ id: internalVideoId, attributes: { privacy: VideoPrivacy.PRIVATE } }) + await servers[0].videos.update({ id: privateVideoId, attributes: { privacy: VideoPrivacy.INTERNAL } }) + + await waitJobs(servers) + + for (const server of servers) { + const { total, data } = await server.videos.list() + + expect(total).to.equal(0) + expect(data).to.have.lengthOf(0) + } + + { + const { total, data } = await servers[0].videos.listMyVideos() + expect(total).to.equal(3) + expect(data).to.have.lengthOf(3) + + const privateVideo = data.find(v => v.name === 'private video becomes public') + const internalVideo = data.find(v => v.name === 'internal video becomes public') + + expect(privateVideo).to.not.be.undefined + expect(internalVideo).to.not.be.undefined + + expect(privateVideo.privacy.id).to.equal(VideoPrivacy.INTERNAL) + expect(internalVideo.privacy.id).to.equal(VideoPrivacy.PRIVATE) + } + }) }) after(async function () {