+/* tslint:disable:no-unused-expression */
+
+import 'mocha'
+import * as chai from 'chai'
+const expect = chai.expect
+
+import {
+ ServerInfo,
+ flushTests,
+ uploadVideo,
+ makeFriends,
+ getVideosList,
+ wait,
+ setAccessTokensToServers,
+ flushAndRunMultipleServers,
+ killallServers
+} from '../utils'
+import { VideoPrivacy } from '../../../shared/models/videos/video-privacy.enum'
+import { getMyVideos, getVideo, getVideoWithToken, updateVideo } from '../utils/videos'
+import { createUser } from '../utils/users'
+import { getUserAccessToken } from '../utils/login'
+
+describe('Test video privacy', function () {
+ let servers: ServerInfo[] = []
+ let privateVideoId
+ let privateVideoUUID
+ let unlistedVideoUUID
+
+ before(async function () {
+ this.timeout(120000)
+
+ // Run servers
+ servers = await flushAndRunMultipleServers(2)
+
+ // Get the access tokens
+ await setAccessTokensToServers(servers)
+
+ // Pod 1 makes friend with pod 2
+ await makeFriends(servers[0].url, servers[0].accessToken)
+ })
+
+ it('Should upload a private video on pod 1', async function () {
+ this.timeout(15000)
+
+ const attributes = {
+ privacy: VideoPrivacy.PRIVATE
+ }
+ await uploadVideo(servers[0].url, servers[0].accessToken, attributes)
+
+ await wait(11000)
+ })
+
+ it('Should not have this private video on pod 2', async function () {
+ const res = await getVideosList(servers[1].url)
+
+ expect(res.body.total).to.equal(0)
+ expect(res.body.data).to.have.lengthOf(0)
+ })
+
+ it('Should list my (private) videos', async function () {
+ const res = await getMyVideos(servers[0].url, servers[0].accessToken, 0, 1)
+
+ expect(res.body.total).to.equal(1)
+ expect(res.body.data).to.have.lengthOf(1)
+
+ privateVideoId = res.body.data[0].id
+ privateVideoUUID = res.body.data[0].uuid
+ })
+
+ it('Should not be able to watch this video with non authenticated user', async function () {
+ await getVideo(servers[0].url, privateVideoUUID, 401)
+ })
+
+ it('Should not be able to watch this private video with another user', async function () {
+ const user = {
+ username: 'hello',
+ password: 'super password'
+ }
+ await createUser(servers[0].url, servers[0].accessToken, user.username, user.password)
+
+ const token = await getUserAccessToken(servers[0], user)
+ await getVideoWithToken(servers[0].url, token, privateVideoUUID, 403)
+ })
+
+ it('Should be able to watch this video with the correct user', async function () {
+ await getVideoWithToken(servers[0].url, servers[0].accessToken, privateVideoUUID)
+ })
+
+ it('Should upload a unlisted video on pod 2', async function () {
+ this.timeout(30000)
+
+ const attributes = {
+ name: 'unlisted video',
+ privacy: VideoPrivacy.UNLISTED
+ }
+ await uploadVideo(servers[1].url, servers[1].accessToken, attributes)
+
+ await wait(22000)
+ })
+
+ it('Should not have this unlisted video listed on pod 1 and 2', async function () {
+ for (const server of servers) {
+ const res = await getVideosList(server.url)
+
+ expect(res.body.total).to.equal(0)
+ expect(res.body.data).to.have.lengthOf(0)
+ }
+ })
+
+ it('Should list my (unlisted) videos', async function () {
+ const res = await getMyVideos(servers[1].url, servers[1].accessToken, 0, 1)
+
+ expect(res.body.total).to.equal(1)
+ expect(res.body.data).to.have.lengthOf(1)
+
+ unlistedVideoUUID = res.body.data[0].uuid
+ })
+
+ it('Should be able to get this unlisted video', async function () {
+ for (const server of servers) {
+ const res = await getVideo(server.url, unlistedVideoUUID)
+
+ expect(res.body.name).to.equal('unlisted video')
+ }
+ })
+
+ it('Should update the private video to public on pod 1', async function () {
+ this.timeout(15000)
+
+ const attribute = {
+ name: 'super video public',
+ privacy: VideoPrivacy.PUBLIC
+ }
+
+ await updateVideo(servers[0].url, servers[0].accessToken, privateVideoId, attribute)
+
+ await wait(11000)
+ })
+
+ it('Should not have this new unlisted video listed on pod 1 and 2', async function () {
+ for (const server of servers) {
+ const res = await getVideosList(server.url)
+
+ expect(res.body.total).to.equal(1)
+ expect(res.body.data).to.have.lengthOf(1)
+ expect(res.body.data[0].name).to.equal('super video public')
+ }
+ })
+
+ after(async function () {
+ killallServers(servers)
+
+ // Keep the logs if the test failed
+ if (this['ok']) {
+ await flushTests()
+ }
+ })
+})