]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/tests/utils/videos/videos.ts
Precisions and security enhancements to the production guide (#287)
[github/Chocobozzz/PeerTube.git] / server / tests / utils / videos / videos.ts
index d6bf27dc7a8b5d10586d48c21cdb3134a6d1979d..9105b5f13650be2492c6989b636f2d929ffc337e 100644 (file)
@@ -1,12 +1,13 @@
 /* tslint:disable:no-unused-expression */
 
 import { expect } from 'chai'
-import { readFile } from 'fs'
+import { existsSync, readFile } from 'fs'
 import * as parseTorrent from 'parse-torrent'
 import { extname, isAbsolute, join } from 'path'
 import * as request from 'supertest'
-import { getMyUserInformation, makeGetRequest, readFilePromise, ServerInfo } from '../'
+import { getMyUserInformation, makeGetRequest, root, ServerInfo, testImage } from '../'
 import { VideoPrivacy } from '../../../../shared/models/videos'
+import { readdirPromise } from '../../../helpers/core-utils'
 import { VIDEO_CATEGORIES, VIDEO_LANGUAGES, VIDEO_LICENCES, VIDEO_PRIVACIES } from '../../../initializers'
 import { dateIsValid, webtorrentAdd } from '../index'
 
@@ -16,6 +17,7 @@ type VideoAttributes = {
   licence?: number
   language?: number
   nsfw?: boolean
+  commentsEnabled?: boolean
   description?: string
   tags?: string[]
   channelId?: number
@@ -201,20 +203,19 @@ function searchVideoWithSort (url: string, search: string, sort: string) {
           .expect('Content-Type', /json/)
 }
 
-async function testVideoImage (url: string, imageName: string, imagePath: string) {
-  // Don't test images if the node env is not set
-  // Because we need a special ffmpeg version for this test
-  if (process.env['NODE_TEST_IMAGE']) {
-    const res = await request(url)
-                        .get(imagePath)
-                        .expect(200)
+async function checkVideoFilesWereRemoved (videoUUID: string, serverNumber: number) {
+  const testDirectory = 'test' + serverNumber
 
-    const data = await readFilePromise(join(__dirname, '..', '..', 'api', 'fixtures', imageName + '.jpg'))
+  for (const directory of [ 'videos', 'thumbnails', 'torrents', 'previews' ]) {
+    const directoryPath = join(root(), testDirectory, directory)
 
-    return data.equals(res.body)
-  } else {
-    console.log('Do not test images. Enable it by setting NODE_TEST_IMAGE env variable.')
-    return true
+    const directoryExists = existsSync(directoryPath)
+    expect(directoryExists).to.be.true
+
+    const files = await readdirPromise(directoryPath)
+    for (const file of files) {
+      expect(file).to.not.contain(videoUUID)
+    }
   }
 }
 
@@ -238,6 +239,7 @@ async function uploadVideo (url: string, accessToken: string, videoAttributesArg
     description: 'my super description',
     tags: [ 'tag' ],
     privacy: VideoPrivacy.PUBLIC,
+    commentsEnabled: true,
     fixture: 'video_short.webm'
   }
   attributes = Object.assign(attributes, videoAttributesArg)
@@ -247,16 +249,23 @@ async function uploadVideo (url: string, accessToken: string, videoAttributesArg
               .set('Accept', 'application/json')
               .set('Authorization', 'Bearer ' + accessToken)
               .field('name', attributes.name)
-              .field('category', attributes.category.toString())
-              .field('licence', attributes.licence.toString())
               .field('nsfw', JSON.stringify(attributes.nsfw))
-              .field('description', attributes.description)
+              .field('commentsEnabled', JSON.stringify(attributes.commentsEnabled))
               .field('privacy', attributes.privacy.toString())
               .field('channelId', attributes.channelId)
 
+  if (attributes.description !== undefined) {
+    req.field('description', attributes.description)
+  }
   if (attributes.language !== undefined) {
     req.field('language', attributes.language.toString())
   }
+  if (attributes.category !== undefined) {
+    req.field('category', attributes.category.toString())
+  }
+  if (attributes.licence !== undefined) {
+    req.field('licence', attributes.licence.toString())
+  }
 
   for (let i = 0; i < attributes.tags.length; i++) {
     req.field('tags[' + i + ']', attributes.tags[i])
@@ -273,7 +282,7 @@ async function uploadVideo (url: string, accessToken: string, videoAttributesArg
             .expect(specialStatus)
 }
 
-function updateVideo (url: string, accessToken: string, id: number, attributes: VideoAttributes, specialStatus = 204) {
+function updateVideo (url: string, accessToken: string, id: number | string, attributes: VideoAttributes, specialStatus = 204) {
   const path = '/api/v1/videos/' + id
   const body = {}
 
@@ -281,7 +290,8 @@ function updateVideo (url: string, accessToken: string, id: number, attributes:
   if (attributes.category) body['category'] = attributes.category
   if (attributes.licence) body['licence'] = attributes.licence
   if (attributes.language) body['language'] = attributes.language
-  if (attributes.nsfw) body['nsfw'] = attributes.nsfw
+  if (attributes.nsfw !== undefined) body['nsfw'] = JSON.stringify(attributes.nsfw)
+  if (attributes.commentsEnabled !== undefined) body['commentsEnabled'] = JSON.stringify(attributes.commentsEnabled)
   if (attributes.description) body['description'] = attributes.description
   if (attributes.tags) body['tags'] = attributes.tags
   if (attributes.privacy) body['privacy'] = attributes.privacy
@@ -326,6 +336,7 @@ async function completeVideoCheck (
     licence: number
     language: number
     nsfw: boolean
+    commentsEnabled: boolean
     description: string
     host: string
     account: string
@@ -368,7 +379,7 @@ async function completeVideoCheck (
   expect(dateIsValid(video.createdAt)).to.be.true
   expect(dateIsValid(video.updatedAt)).to.be.true
 
-  const res = await getVideo(url, video.id)
+  const res = await getVideo(url, video.uuid)
   const videoDetails = res.body
 
   expect(videoDetails.files).to.have.lengthOf(attributes.files.length)
@@ -376,8 +387,10 @@ async function completeVideoCheck (
   expect(videoDetails.privacy).to.deep.equal(attributes.privacy)
   expect(videoDetails.privacyLabel).to.deep.equal(VIDEO_PRIVACIES[attributes.privacy])
   expect(videoDetails.account.name).to.equal(attributes.account)
+  expect(videoDetails.commentsEnabled).to.equal(attributes.commentsEnabled)
 
-  expect(videoDetails.channel.name).to.equal(attributes.channel.name)
+  expect(videoDetails.channel.displayName).to.equal(attributes.channel.name)
+  expect(videoDetails.channel.name).to.have.lengthOf(36)
   expect(videoDetails.channel.isLocal).to.equal(attributes.channel.isLocal)
   expect(dateIsValid(videoDetails.channel.createdAt)).to.be.true
   expect(dateIsValid(videoDetails.channel.updatedAt)).to.be.true
@@ -401,7 +414,7 @@ async function completeVideoCheck (
     const maxSize = attributeFile.size + ((10 * attributeFile.size) / 100)
     expect(file.size).to.be.above(minSize).and.below(maxSize)
 
-    const test = await testVideoImage(url, attributes.fixture, videoDetails.thumbnailPath)
+    const test = await testImage(url, attributes.fixture, videoDetails.thumbnailPath)
     expect(test).to.equal(true)
 
     const torrent = await webtorrentAdd(magnetUri, true)
@@ -429,11 +442,11 @@ export {
   searchVideo,
   searchVideoWithPagination,
   searchVideoWithSort,
-  testVideoImage,
   uploadVideo,
   updateVideo,
   rateVideo,
   viewVideo,
   parseTorrentVideo,
-  completeVideoCheck
+  completeVideoCheck,
+  checkVideoFilesWereRemoved
 }