]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/tests/api/utils.js
Server: Add some cli tools to make it easy to upload a lot of videos
[github/Chocobozzz/PeerTube.git] / server / tests / api / utils.js
index c1a01ef372252ca22e069bc672079f48f47268d6..3cc769f265a26066ba85dd668700073d1955767c 100644 (file)
@@ -1,16 +1,22 @@
 'use strict'
 
-const child_process = require('child_process')
-const exec = child_process.exec
-const fork = child_process.fork
+const childProcess = require('child_process')
+const exec = childProcess.exec
+const fork = childProcess.fork
+const fs = require('fs')
 const pathUtils = require('path')
 const request = require('supertest')
 
 const testUtils = {
+  dateIsValid: dateIsValid,
   flushTests: flushTests,
+  getAllVideosListBy: getAllVideosListBy,
+  getClient: getClient,
   getFriendsList: getFriendsList,
   getVideo: getVideo,
   getVideosList: getVideosList,
+  getVideosListPagination: getVideosListPagination,
+  getVideosListSort: getVideosListSort,
   login: login,
   loginAndGetAccessToken: loginAndGetAccessToken,
   makeFriends: makeFriends,
@@ -19,15 +25,53 @@ const testUtils = {
   flushAndRunMultipleServers: flushAndRunMultipleServers,
   runServer: runServer,
   searchVideo: searchVideo,
+  searchVideoWithPagination: searchVideoWithPagination,
+  searchVideoWithSort: searchVideoWithSort,
+  testImage: testImage,
   uploadVideo: uploadVideo
 }
 
 // ---------------------- Export functions --------------------
 
+function dateIsValid (dateString) {
+  const dateToCheck = new Date(dateString)
+  const now = new Date()
+
+  // Check if the interval is more than 2 minutes
+  if (now - dateToCheck > 120000) return false
+
+  return true
+}
+
 function flushTests (callback) {
   exec('npm run clean:server:test', callback)
 }
 
+function getAllVideosListBy (url, end) {
+  const path = '/api/v1/videos'
+
+  request(url)
+    .get(path)
+    .query({ sort: 'createdDate' })
+    .query({ start: 0 })
+    .query({ count: 10000 })
+    .set('Accept', 'application/json')
+    .expect(200)
+    .expect('Content-Type', /json/)
+    .end(end)
+}
+
+function getClient (url, end) {
+  const path = '/api/v1/users/client'
+
+  request(url)
+    .get(path)
+    .set('Accept', 'application/json')
+    .expect(200)
+    .expect('Content-Type', /json/)
+    .end(end)
+}
+
 function getFriendsList (url, end) {
   const path = '/api/v1/pods/'
 
@@ -55,16 +99,42 @@ function getVideosList (url, end) {
 
   request(url)
     .get(path)
+    .query({ sort: 'name' })
     .set('Accept', 'application/json')
     .expect(200)
     .expect('Content-Type', /json/)
     .end(end)
 }
 
-function login (url, client, user, expected_status, end) {
+function getVideosListPagination (url, start, count, end) {
+  const path = '/api/v1/videos'
+
+  request(url)
+    .get(path)
+    .query({ start: start })
+    .query({ count: count })
+    .set('Accept', 'application/json')
+    .expect(200)
+    .expect('Content-Type', /json/)
+    .end(end)
+}
+
+function getVideosListSort (url, sort, end) {
+  const path = '/api/v1/videos'
+
+  request(url)
+    .get(path)
+    .query({ sort: sort })
+    .set('Accept', 'application/json')
+    .expect(200)
+    .expect('Content-Type', /json/)
+    .end(end)
+}
+
+function login (url, client, user, expectedStatus, end) {
   if (!end) {
-    end = expected_status
-    expected_status = 200
+    end = expectedStatus
+    expectedStatus = 200
   }
 
   const path = '/api/v1/users/token'
@@ -83,7 +153,7 @@ function login (url, client, user, expected_status, end) {
     .post(path)
     .type('form')
     .send(body)
-    .expect(expected_status)
+    .expect(expectedStatus)
     .end(end)
 }
 
@@ -95,10 +165,10 @@ function loginAndGetAccessToken (server, callback) {
   })
 }
 
-function makeFriends (url, expected_status, callback) {
+function makeFriends (url, accessToken, expectedStatus, callback) {
   if (!callback) {
-    callback = expected_status
-    expected_status = 204
+    callback = expectedStatus
+    expectedStatus = 204
   }
 
   const path = '/api/v1/pods/makefriends'
@@ -107,7 +177,8 @@ function makeFriends (url, expected_status, callback) {
   request(url)
     .get(path)
     .set('Accept', 'application/json')
-    .expect(expected_status)
+    .set('Authorization', 'Bearer ' + accessToken)
+    .expect(expectedStatus)
     .end(function (err, res) {
       if (err) throw err
 
@@ -116,14 +187,20 @@ function makeFriends (url, expected_status, callback) {
     })
 }
 
-function quitFriends (url, callback) {
+function quitFriends (url, accessToken, expectedStatus, callback) {
+  if (!callback) {
+    callback = expectedStatus
+    expectedStatus = 204
+  }
+
   const path = '/api/v1/pods/quitfriends'
 
   // The first pod make friend with the third
   request(url)
     .get(path)
     .set('Accept', 'application/json')
-    .expect(204)
+    .set('Authorization', 'Bearer ' + accessToken)
+    .expect(expectedStatus)
     .end(function (err, res) {
       if (err) throw err
 
@@ -132,10 +209,10 @@ function quitFriends (url, callback) {
     })
 }
 
-function removeVideo (url, token, id, expected_status, end) {
+function removeVideo (url, token, id, expectedStatus, end) {
   if (!end) {
-    end = expected_status
-    expected_status = 204
+    end = expectedStatus
+    expectedStatus = 204
   }
 
   const path = '/api/v1/videos'
@@ -144,11 +221,11 @@ function removeVideo (url, token, id, expected_status, end) {
     .delete(path + '/' + id)
     .set('Accept', 'application/json')
     .set('Authorization', 'Bearer ' + token)
-    .expect(expected_status)
+    .expect(expectedStatus)
     .end(end)
 }
 
-function flushAndRunMultipleServers (total_servers, serversRun) {
+function flushAndRunMultipleServers (totalServers, serversRun) {
   let apps = []
   let urls = []
   let i = 0
@@ -157,13 +234,13 @@ function flushAndRunMultipleServers (total_servers, serversRun) {
     apps[number - 1] = app
     urls[number - 1] = url
     i++
-    if (i === total_servers) {
+    if (i === totalServers) {
       serversRun(apps, urls)
     }
   }
 
   flushTests(function () {
-    for (let j = 1; j <= total_servers; j++) {
+    for (let j = 1; j <= totalServers; j++) {
       // For the virtual buffer
       setTimeout(function () {
         runServer(j, function (app, url) {
@@ -189,7 +266,7 @@ function runServer (number, callback) {
   }
 
   // These actions are async so we need to be sure that they have both been done
-  const server_run_string = {
+  const serverRunString = {
     'Connected to mongodb': false,
     'Server listening on port': false
   }
@@ -213,7 +290,7 @@ function runServer (number, callback) {
 
   server.app = fork(pathUtils.join(__dirname, '../../../server.js'), [], options)
   server.app.stdout.on('data', function onStdout (data) {
-    let dont_continue = false
+    let dontContinue = false
 
     // Capture things if we want to
     for (const key of Object.keys(regexps)) {
@@ -228,49 +305,115 @@ function runServer (number, callback) {
     }
 
     // Check if all required sentences are here
-    for (const key of Object.keys(server_run_string)) {
-      if (data.toString().indexOf(key) !== -1) server_run_string[key] = true
-      if (server_run_string[key] === false) dont_continue = true
+    for (const key of Object.keys(serverRunString)) {
+      if (data.toString().indexOf(key) !== -1) serverRunString[key] = true
+      if (serverRunString[key] === false) dontContinue = true
     }
 
     // If no, there is maybe one thing not already initialized (mongodb...)
-    if (dont_continue === true) return
+    if (dontContinue === true) return
 
     server.app.stdout.removeListener('data', onStdout)
     callback(server)
   })
 }
 
-function searchVideo (url, search, end) {
+function searchVideo (url, search, field, end) {
+  if (!end) {
+    end = field
+    field = null
+  }
+
+  const path = '/api/v1/videos'
+  const req = request(url)
+              .get(path + '/search/' + search)
+              .set('Accept', 'application/json')
+
+  if (field) req.query({ field: field })
+  req.expect(200)
+     .expect('Content-Type', /json/)
+     .end(end)
+}
+
+function searchVideoWithPagination (url, search, field, start, count, end) {
   const path = '/api/v1/videos'
 
   request(url)
     .get(path + '/search/' + search)
+    .query({ start: start })
+    .query({ count: count })
+    .query({ field: field })
     .set('Accept', 'application/json')
     .expect(200)
     .expect('Content-Type', /json/)
     .end(end)
 }
 
-function uploadVideo (url, access_token, name, description, fixture, special_status, end) {
-  if (!end) {
-    end = special_status
-    special_status = 204
-  }
-
+function searchVideoWithSort (url, search, sort, end) {
   const path = '/api/v1/videos'
 
   request(url)
-    .post(path)
+    .get(path + '/search/' + search)
+    .query({ sort: sort })
     .set('Accept', 'application/json')
-    .set('Authorization', 'Bearer ' + access_token)
-    .field('name', name)
-    .field('description', description)
-    .attach('videofile', pathUtils.join(__dirname, 'fixtures', fixture))
-    .expect(special_status)
+    .expect(200)
+    .expect('Content-Type', /json/)
     .end(end)
 }
 
+function testImage (url, videoName, imagePath, callback) {
+  // 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) {
+    request(url)
+      .get(imagePath)
+      .expect(200)
+      .end(function (err, res) {
+        if (err) return callback(err)
+
+        fs.readFile(pathUtils.join(__dirname, 'fixtures', videoName + '.jpg'), function (err, data) {
+          if (err) return callback(err)
+
+          callback(null, data.equals(res.body))
+        })
+      })
+  } else {
+    console.log('Do not test images. Enable it by setting NODE_TEST_IMAGE env variable.')
+    callback(null, true)
+  }
+}
+
+function uploadVideo (url, accessToken, name, description, tags, fixture, specialStatus, end) {
+  if (!end) {
+    end = specialStatus
+    specialStatus = 204
+  }
+
+  const path = '/api/v1/videos'
+
+  const req = request(url)
+              .post(path)
+              .set('Accept', 'application/json')
+              .set('Authorization', 'Bearer ' + accessToken)
+              .field('name', name)
+              .field('description', description)
+
+  for (let i = 0; i < tags.length; i++) {
+    req.field('tags[' + i + ']', tags[i])
+  }
+
+  let filepath = ''
+  if (pathUtils.isAbsolute(fixture)) {
+    filepath = fixture
+  } else {
+    filepath = pathUtils.join(__dirname, 'fixtures', fixture)
+  }
+
+  req.attach('videofile', filepath)
+     .expect(specialStatus)
+     .end(end)
+}
+
 // ---------------------------------------------------------------------------
 
 module.exports = testUtils