94267f104e82bc202bc4c570f06f367b5a0345e0
[oweals/peertube.git] / server / tests / api / users.js
1 'use strict'
2
3 const chai = require('chai')
4 const expect = chai.expect
5 const series = require('async/series')
6
7 const loginUtils = require('../utils/login')
8 const podsUtils = require('../utils/pods')
9 const serversUtils = require('../utils/servers')
10 const usersUtils = require('../utils/users')
11 const videosUtils = require('../utils/videos')
12
13 describe('Test users', function () {
14   let server = null
15   let accessToken = null
16   let accessTokenUser = null
17   let videoId = null
18   let userId = null
19
20   before(function (done) {
21     this.timeout(20000)
22
23     series([
24       function (next) {
25         serversUtils.flushTests(next)
26       },
27       function (next) {
28         serversUtils.runServer(1, function (server1) {
29           server = server1
30           next()
31         })
32       }
33     ], done)
34   })
35
36   it('Should create a new client')
37
38   it('Should return the first client')
39
40   it('Should remove the last client')
41
42   it('Should not login with an invalid client id', function (done) {
43     const client = { id: 'client', password: server.client.secret }
44     loginUtils.login(server.url, client, server.user, 400, function (err, res) {
45       if (err) throw err
46
47       expect(res.body.error).to.equal('invalid_client')
48       done()
49     })
50   })
51
52   it('Should not login with an invalid client password', function (done) {
53     const client = { id: server.client.id, password: 'coucou' }
54     loginUtils.login(server.url, client, server.user, 400, function (err, res) {
55       if (err) throw err
56
57       expect(res.body.error).to.equal('invalid_client')
58       done()
59     })
60   })
61
62   it('Should not login with an invalid username', function (done) {
63     const user = { username: 'captain crochet', password: server.user.password }
64     loginUtils.login(server.url, server.client, user, 400, function (err, res) {
65       if (err) throw err
66
67       expect(res.body.error).to.equal('invalid_grant')
68       done()
69     })
70   })
71
72   it('Should not login with an invalid password', function (done) {
73     const user = { username: server.user.username, password: 'mewthree' }
74     loginUtils.login(server.url, server.client, user, 400, function (err, res) {
75       if (err) throw err
76
77       expect(res.body.error).to.equal('invalid_grant')
78       done()
79     })
80   })
81
82   it('Should not be able to upload a video', function (done) {
83     accessToken = 'mysupertoken'
84
85     const name = 'my super name'
86     const description = 'my super description'
87     const tags = [ 'tag1', 'tag2' ]
88     const video = 'video_short.webm'
89     videosUtils.uploadVideo(server.url, accessToken, name, description, tags, video, 401, done)
90   })
91
92   it('Should not be able to make friends', function (done) {
93     accessToken = 'mysupertoken'
94     podsUtils.makeFriends(server.url, accessToken, 401, done)
95   })
96
97   it('Should not be able to quit friends', function (done) {
98     accessToken = 'mysupertoken'
99     podsUtils.quitFriends(server.url, accessToken, 401, done)
100   })
101
102   it('Should be able to login', function (done) {
103     loginUtils.login(server.url, server.client, server.user, 200, function (err, res) {
104       if (err) throw err
105
106       accessToken = res.body.access_token
107       done()
108     })
109   })
110
111   it('Should upload the video with the correct token', function (done) {
112     const name = 'my super name'
113     const description = 'my super description'
114     const tags = [ 'tag1', 'tag2' ]
115     const video = 'video_short.webm'
116     videosUtils.uploadVideo(server.url, accessToken, name, description, tags, video, 204, function (err, res) {
117       if (err) throw err
118
119       videosUtils.getVideosList(server.url, function (err, res) {
120         if (err) throw err
121
122         const video = res.body.data[0]
123         expect(video.author).to.equal('root')
124
125         videoId = video.id
126         done()
127       })
128     })
129   })
130
131   it('Should upload the video again with the correct token', function (done) {
132     const name = 'my super name 2'
133     const description = 'my super description 2'
134     const tags = [ 'tag1' ]
135     const video = 'video_short.webm'
136     videosUtils.uploadVideo(server.url, accessToken, name, description, tags, video, 204, done)
137   })
138
139   it('Should not be able to remove the video with an incorrect token', function (done) {
140     videosUtils.removeVideo(server.url, 'bad_token', videoId, 401, done)
141   })
142
143   it('Should not be able to remove the video with the token of another account')
144
145   it('Should be able to remove the video with the correct token', function (done) {
146     videosUtils.removeVideo(server.url, accessToken, videoId, done)
147   })
148
149   it('Should logout (revoke token)')
150
151   it('Should not be able to upload a video')
152
153   it('Should not be able to remove a video')
154
155   it('Should be able to login again')
156
157   it('Should have an expired access token')
158
159   it('Should refresh the token')
160
161   it('Should be able to upload a video again')
162
163   it('Should be able to create a new user', function (done) {
164     usersUtils.createUser(server.url, accessToken, 'user_1', 'super password', done)
165   })
166
167   it('Should be able to login with this user', function (done) {
168     server.user = {
169       username: 'user_1',
170       password: 'super password'
171     }
172
173     loginUtils.loginAndGetAccessToken(server, function (err, token) {
174       if (err) throw err
175
176       accessTokenUser = token
177
178       done()
179     })
180   })
181
182   it('Should be able to get the user informations', function (done) {
183     usersUtils.getUserInformation(server.url, accessTokenUser, function (err, res) {
184       if (err) throw err
185
186       const user = res.body
187
188       expect(user.username).to.equal('user_1')
189       expect(user.id).to.exist
190
191       done()
192     })
193   })
194
195   it('Should be able to upload a video with this user', function (done) {
196     this.timeout(5000)
197
198     const name = 'my super name'
199     const description = 'my super description'
200     const tags = [ 'tag1', 'tag2', 'tag3' ]
201     const file = 'video_short.webm'
202     videosUtils.uploadVideo(server.url, accessTokenUser, name, description, tags, file, done)
203   })
204
205   it('Should list all the users', function (done) {
206     usersUtils.getUsersList(server.url, function (err, res) {
207       if (err) throw err
208
209       const result = res.body
210       const total = result.total
211       const users = result.data
212
213       expect(total).to.equal(2)
214       expect(users).to.be.an('array')
215       expect(users.length).to.equal(2)
216
217       const user = users[0]
218       expect(user.username).to.equal('user_1')
219
220       const rootUser = users[1]
221       expect(rootUser.username).to.equal('root')
222       userId = user.id
223
224       done()
225     })
226   })
227
228   it('Should list only the first user by username asc', function (done) {
229     usersUtils.getUsersListPaginationAndSort(server.url, 0, 1, 'username', function (err, res) {
230       if (err) throw err
231
232       const result = res.body
233       const total = result.total
234       const users = result.data
235
236       expect(total).to.equal(2)
237       expect(users.length).to.equal(1)
238
239       const user = users[0]
240       expect(user.username).to.equal('root')
241
242       done()
243     })
244   })
245
246   it('Should list only the first user by username desc', function (done) {
247     usersUtils.getUsersListPaginationAndSort(server.url, 0, 1, '-username', function (err, res) {
248       if (err) throw err
249
250       const result = res.body
251       const total = result.total
252       const users = result.data
253
254       expect(total).to.equal(2)
255       expect(users.length).to.equal(1)
256
257       const user = users[0]
258       expect(user.username).to.equal('user_1')
259
260       done()
261     })
262   })
263
264   it('Should list only the second user by createdDate desc', function (done) {
265     usersUtils.getUsersListPaginationAndSort(server.url, 0, 1, '-createdDate', function (err, res) {
266       if (err) throw err
267
268       const result = res.body
269       const total = result.total
270       const users = result.data
271
272       expect(total).to.equal(2)
273       expect(users.length).to.equal(1)
274
275       const user = users[0]
276       expect(user.username).to.equal('user_1')
277
278       done()
279     })
280   })
281
282   it('Should list all the users by createdDate asc', function (done) {
283     usersUtils.getUsersListPaginationAndSort(server.url, 0, 2, 'createdDate', function (err, res) {
284       if (err) throw err
285
286       const result = res.body
287       const total = result.total
288       const users = result.data
289
290       expect(total).to.equal(2)
291       expect(users.length).to.equal(2)
292
293       expect(users[0].username).to.equal('root')
294       expect(users[1].username).to.equal('user_1')
295
296       done()
297     })
298   })
299
300   it('Should update the user password', function (done) {
301     usersUtils.updateUser(server.url, userId, accessTokenUser, 'new password', function (err, res) {
302       if (err) throw err
303
304       server.user.password = 'new password'
305       loginUtils.login(server.url, server.client, server.user, 200, done)
306     })
307   })
308
309   it('Should be able to remove this user', function (done) {
310     usersUtils.removeUser(server.url, userId, accessToken, done)
311   })
312
313   it('Should not be able to login with this user', function (done) {
314     // server.user is already set to user 1
315     loginUtils.login(server.url, server.client, server.user, 400, done)
316   })
317
318   it('Should not have videos of this user', function (done) {
319     videosUtils.getVideosList(server.url, function (err, res) {
320       if (err) throw err
321
322       expect(res.body.total).to.equal(1)
323       const video = res.body.data[0]
324       expect(video.author).to.equal('root')
325
326       done()
327     })
328   })
329
330   after(function (done) {
331     process.kill(-server.app.pid)
332
333     // Keep the logs if the test failed
334     if (this.ok) {
335       serversUtils.flushTests(done)
336     } else {
337       done()
338     }
339   })
340 })