Infile code reorganization
[oweals/peertube.git] / tests / api / utils.js
1 ;(function () {
2   'use strict'
3
4   var child_process = require('child_process')
5   var exec = child_process.exec
6   var fork = child_process.fork
7   var request = require('supertest')
8
9   var testUtils = {
10     flushTests: flushTests,
11     getFriendsList: getFriendsList,
12     getVideosList: getVideosList,
13     makeFriends: makeFriends,
14     quitFriends: quitFriends,
15     removeVideo: removeVideo,
16     flushAndRunMultipleServers: flushAndRunMultipleServers,
17     runServer: runServer,
18     searchVideo: searchVideo,
19     uploadVideo: uploadVideo
20   }
21
22   // ---------------------- Export functions --------------------
23
24   function flushTests (callback) {
25     exec(__dirname + '/../../scripts/clean_test.sh', callback)
26   }
27
28   function getFriendsList (url, end) {
29     var path = '/api/v1/pods/'
30
31     request(url)
32       .get(path)
33       .set('Accept', 'application/json')
34       .expect(200)
35       .expect('Content-Type', /json/)
36       .end(end)
37   }
38
39   function getVideosList (url, end) {
40     var path = '/api/v1/videos'
41
42     request(url)
43       .get(path)
44       .set('Accept', 'application/json')
45       .expect(200)
46       .expect('Content-Type', /json/)
47       .end(end)
48   }
49
50   function makeFriends (url, expected_status, callback) {
51     if (!callback) {
52       callback = expected_status
53       expected_status = 204
54     }
55
56     var path = '/api/v1/pods/makefriends'
57
58     // The first pod make friend with the third
59     request(url)
60       .get(path)
61       .set('Accept', 'application/json')
62       .expect(expected_status)
63       .end(function (err, res) {
64         if (err) throw err
65
66         // Wait for the request between pods
67         setTimeout(callback, 1000)
68       })
69   }
70
71   function quitFriends (url, callback) {
72     var path = '/api/v1/pods/quitfriends'
73
74     // The first pod make friend with the third
75     request(url)
76       .get(path)
77       .set('Accept', 'application/json')
78       .expect(204)
79       .end(function (err, res) {
80         if (err) throw err
81
82         // Wait for the request between pods
83         setTimeout(callback, 1000)
84       })
85   }
86
87   function removeVideo (url, id, end) {
88     var path = '/api/v1/videos'
89
90     request(url)
91       .delete(path + '/' + id)
92       .set('Accept', 'application/json')
93       .expect(204)
94       .end(end)
95   }
96
97   function flushAndRunMultipleServers (total_servers, serversRun) {
98     var apps = []
99     var urls = []
100     var i = 0
101
102     function anotherServerDone (number, app, url) {
103       apps[number - 1] = app
104       urls[number - 1] = url
105       i++
106       if (i === total_servers) {
107         serversRun(apps, urls)
108       }
109     }
110
111     flushTests(function () {
112       for (var j = 1; j <= total_servers; j++) {
113         (function (k) { // TODO: ES6 with let
114           // For the virtual buffer
115           setTimeout(function () {
116             runServer(k, function (app, url) {
117               anotherServerDone(k, app, url)
118             })
119           }, 1000 * k)
120         })(j)
121       }
122     })
123   }
124
125   function runServer (number, callback) {
126     var port = 9000 + number
127     var server_run_string = {
128       'Connected to mongodb': false,
129       'Server listening on port': false
130     }
131
132     // Share the environment
133     var env = Object.create(process.env)
134     env.NODE_ENV = 'test'
135     env.NODE_APP_INSTANCE = number
136     var options = {
137       silent: true,
138       env: env,
139       detached: true
140     }
141
142     var app = fork(__dirname + '/../../server.js', [], options)
143     app.stdout.on('data', function onStdout (data) {
144       var dont_continue = false
145       // Check if all required sentences are here
146       for (var key of Object.keys(server_run_string)) {
147         if (data.toString().indexOf(key) !== -1) server_run_string[key] = true
148         if (server_run_string[key] === false) dont_continue = true
149       }
150
151       // If no, there is maybe one thing not already initialized (mongodb...)
152       if (dont_continue === true) return
153
154       app.stdout.removeListener('data', onStdout)
155       callback(app, 'http://localhost:' + port)
156     })
157   }
158
159   function searchVideo (url, search, end) {
160     var path = '/api/v1/videos'
161
162     request(url)
163       .get(path + '/search/' + search)
164       .set('Accept', 'application/json')
165       .expect(200)
166       .expect('Content-Type', /json/)
167       .end(end)
168   }
169
170   function uploadVideo (url, name, description, fixture, end) {
171     var path = '/api/v1/videos'
172
173     request(url)
174       .post(path)
175       .set('Accept', 'application/json')
176       .field('name', name)
177       .field('description', description)
178       .attach('input_video', __dirname + '/fixtures/' + fixture)
179       .expect(201)
180       .end(end)
181   }
182
183   // ---------------------------------------------------------------------------
184
185   module.exports = testUtils
186 })()