X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Ftests%2Fapi%2Futils.js;h=f0b1c3653db6a9e2f0b63c8a63f0f9b5c393fbdb;hb=fbf1134e3e6b386c9ec5a3946c61f3faf84397fb;hp=60c3c8d4ec3c9b1ecde363589d8ea6238b01a09b;hpb=2c4a0b5d909bd7eefeb582001babce816fdfab03;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/tests/api/utils.js b/server/tests/api/utils.js index 60c3c8d4e..f0b1c3653 100644 --- a/server/tests/api/utils.js +++ b/server/tests/api/utils.js @@ -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) }