]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/tests/api/utils.js
Introduce paginations in videos listing
[github/Chocobozzz/PeerTube.git] / server / tests / api / utils.js
index 60c3c8d4ec3c9b1ecde363589d8ea6238b01a09b..f0b1c3653db6a9e2f0b63c8a63f0f9b5c393fbdb 100644 (file)
@@ -1,32 +1,50 @@
 'use strict'
 
-var child_process = require('child_process')
-var exec = child_process.exec
-var fork = child_process.fork
-var pathUtils = require('path')
-var request = require('supertest')
+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')
 
-var testUtils = {
+const testUtils = {
   flushTests: flushTests,
   getFriendsList: getFriendsList,
+  getVideo: getVideo,
   getVideosList: getVideosList,
+  getVideosListPagination: getVideosListPagination,
+  login: login,
+  loginAndGetAccessToken: loginAndGetAccessToken,
   makeFriends: makeFriends,
   quitFriends: quitFriends,
   removeVideo: removeVideo,
   flushAndRunMultipleServers: flushAndRunMultipleServers,
   runServer: runServer,
   searchVideo: searchVideo,
+  searchVideoWithPagination: searchVideoWithPagination,
+  testImage: testImage,
   uploadVideo: uploadVideo
 }
 
 // ---------------------- Export functions --------------------
 
 function flushTests (callback) {
-  exec(pathUtils.join(__dirname, '../../../bin/clean_test.sh'), callback)
+  exec('npm run clean:server:test', callback)
 }
 
 function getFriendsList (url, end) {
-  var path = '/api/v1/pods/'
+  const path = '/api/v1/pods/'
+
+  request(url)
+    .get(path)
+    .set('Accept', 'application/json')
+    .expect(200)
+    .expect('Content-Type', /json/)
+    .end(end)
+}
+
+function getVideo (url, id, end) {
+  const path = '/api/v1/videos/' + id
 
   request(url)
     .get(path)
@@ -37,29 +55,77 @@ function getFriendsList (url, end) {
 }
 
 function getVideosList (url, end) {
-  var path = '/api/v1/videos'
+  const path = '/api/v1/videos'
+
+  request(url)
+    .get(path)
+    .set('Accept', 'application/json')
+    .expect(200)
+    .expect('Content-Type', /json/)
+    .end(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 makeFriends (url, expected_status, callback) {
+function login (url, client, user, expectedStatus, end) {
+  if (!end) {
+    end = expectedStatus
+    expectedStatus = 200
+  }
+
+  const path = '/api/v1/users/token'
+
+  const body = {
+    client_id: client.id,
+    client_secret: client.secret,
+    username: user.username,
+    password: user.password,
+    response_type: 'code',
+    grant_type: 'password',
+    scope: 'upload'
+  }
+
+  request(url)
+    .post(path)
+    .type('form')
+    .send(body)
+    .expect(expectedStatus)
+    .end(end)
+}
+
+function loginAndGetAccessToken (server, callback) {
+  login(server.url, server.client, server.user, 200, function (err, res) {
+    if (err) return callback(err)
+
+    return callback(null, res.body.access_token)
+  })
+}
+
+function makeFriends (url, accessToken, expectedStatus, callback) {
   if (!callback) {
-    callback = expected_status
-    expected_status = 204
+    callback = expectedStatus
+    expectedStatus = 204
   }
 
-  var path = '/api/v1/pods/makefriends'
+  const path = '/api/v1/pods/makefriends'
 
   // The first pod make friend with the third
   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
 
@@ -68,14 +134,20 @@ function makeFriends (url, expected_status, callback) {
     })
 }
 
-function quitFriends (url, callback) {
-  var path = '/api/v1/pods/quitfriends'
+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
 
@@ -84,99 +156,170 @@ function quitFriends (url, callback) {
     })
 }
 
-function removeVideo (url, id, end) {
-  var path = '/api/v1/videos'
+function removeVideo (url, token, id, expectedStatus, end) {
+  if (!end) {
+    end = expectedStatus
+    expectedStatus = 204
+  }
+
+  const path = '/api/v1/videos'
 
   request(url)
     .delete(path + '/' + id)
     .set('Accept', 'application/json')
-    .expect(204)
+    .set('Authorization', 'Bearer ' + token)
+    .expect(expectedStatus)
     .end(end)
 }
 
-function flushAndRunMultipleServers (total_servers, serversRun) {
-  var apps = []
-  var urls = []
-  var i = 0
+function flushAndRunMultipleServers (totalServers, serversRun) {
+  let apps = []
+  let urls = []
+  let i = 0
 
   function anotherServerDone (number, app, url) {
     apps[number - 1] = app
     urls[number - 1] = url
     i++
-    if (i === total_servers) {
+    if (i === totalServers) {
       serversRun(apps, urls)
     }
   }
 
   flushTests(function () {
-    for (var j = 1; j <= total_servers; j++) {
-      (function (k) { // TODO: ES6 with let
-        // For the virtual buffer
-        setTimeout(function () {
-          runServer(k, function (app, url) {
-            anotherServerDone(k, app, url)
-          })
-        }, 1000 * k)
-      })(j)
+    for (let j = 1; j <= totalServers; j++) {
+      // For the virtual buffer
+      setTimeout(function () {
+        runServer(j, function (app, url) {
+          anotherServerDone(j, app, url)
+        })
+      }, 1000 * j)
     }
   })
 }
 
 function runServer (number, callback) {
-  var port = 9000 + number
-  var server_run_string = {
+  const server = {
+    app: null,
+    url: `http://localhost:${9000 + number}`,
+    client: {
+      id: null,
+      secret: null
+    },
+    user: {
+      username: null,
+      password: null
+    }
+  }
+
+  // These actions are async so we need to be sure that they have both been done
+  const serverRunString = {
     'Connected to mongodb': false,
     'Server listening on port': false
   }
 
+  const regexps = {
+    client_id: 'Client id: ([a-f0-9]+)',
+    client_secret: 'Client secret: (.+)',
+    user_username: 'Username: (.+)',
+    user_password: 'User password: (.+)'
+  }
+
   // Share the environment
-  var env = Object.create(process.env)
+  const env = Object.create(process.env)
   env.NODE_ENV = 'test'
   env.NODE_APP_INSTANCE = number
-  var options = {
+  const options = {
     silent: true,
     env: env,
     detached: true
   }
 
-  var app = fork(pathUtils.join(__dirname, '../../../server.js'), [], options)
-  app.stdout.on('data', function onStdout (data) {
-    var dont_continue = false
+  server.app = fork(pathUtils.join(__dirname, '../../../server.js'), [], options)
+  server.app.stdout.on('data', function onStdout (data) {
+    let dontContinue = false
+
+    // Capture things if we want to
+    for (const key of Object.keys(regexps)) {
+      const regexp = regexps[key]
+      const matches = data.toString().match(regexp)
+      if (matches !== null) {
+        if (key === 'client_id') server.client.id = matches[1]
+        else if (key === 'client_secret') server.client.secret = matches[1]
+        else if (key === 'user_username') server.user.username = matches[1]
+        else if (key === 'user_password') server.user.password = matches[1]
+      }
+    }
+
     // Check if all required sentences are here
-    for (var 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
 
-    app.stdout.removeListener('data', onStdout)
-    callback(app, 'http://localhost:' + port)
+    server.app.stdout.removeListener('data', onStdout)
+    callback(server)
   })
 }
 
 function searchVideo (url, search, end) {
-  var path = '/api/v1/videos'
+  const path = '/api/v1/videos'
+
+  request(url)
+    .get(path + '/search/' + search)
+    .set('Accept', 'application/json')
+    .expect(200)
+    .expect('Content-Type', /json/)
+    .end(end)
+}
+
+function searchVideoWithPagination (url, search, start, count, end) {
+  const path = '/api/v1/videos'
 
   request(url)
     .get(path + '/search/' + search)
+    .query({ start: start })
+    .query({ count: count })
     .set('Accept', 'application/json')
     .expect(200)
     .expect('Content-Type', /json/)
     .end(end)
 }
 
-function uploadVideo (url, name, description, fixture, end) {
-  var path = '/api/v1/videos'
+function testImage (url, videoName, imagePath, callback) {
+  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))
+      })
+    })
+}
+
+function uploadVideo (url, accessToken, name, description, fixture, specialStatus, end) {
+  if (!end) {
+    end = specialStatus
+    specialStatus = 204
+  }
+
+  const path = '/api/v1/videos'
 
   request(url)
     .post(path)
     .set('Accept', 'application/json')
+    .set('Authorization', 'Bearer ' + accessToken)
     .field('name', name)
     .field('description', description)
-    .attach('input_video', pathUtils.join(__dirname, 'fixtures', fixture))
-    .expect(204)
+    .attach('videofile', pathUtils.join(__dirname, 'fixtures', fixture))
+    .expect(specialStatus)
     .end(end)
 }