]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/tests/api/users/users.ts
Merge branch 'master' into release/3.3.0
[github/Chocobozzz/PeerTube.git] / server / tests / api / users / users.ts
CommitLineData
a1587156 1/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
86d13ec2 2
afffe988 3import 'mocha'
4f32032f
C
4import * as chai from 'chai'
5import { AbuseState, AbuseUpdate, MyUser, User, UserRole, Video, VideoPlaylistType } from '@shared/models'
81628e50 6import { CustomConfig, OAuth2ErrorCode } from '@shared/models/server'
f43db2f4 7import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
0e1dc3e7 8import {
e1c55031 9 addVideoCommentThread,
a890d1e0 10 blockUser,
7c3b7976 11 cleanupTests,
f43db2f4 12 closeAllSequelize,
a890d1e0
C
13 createUser,
14 deleteMe,
7c3b7976 15 flushAndRunServer,
c100a614 16 getAccountRatings,
edbc9325 17 getAdminAbusesList,
a890d1e0 18 getBlacklistedVideosList,
e1c55031 19 getCustomConfig,
a890d1e0
C
20 getMyUserInformation,
21 getMyUserVideoQuotaUsed,
22 getMyUserVideoRating,
23 getUserInformation,
24 getUsersList,
25 getUsersListPaginationAndSort,
1f20622f 26 getVideoChannel,
a1587156
C
27 getVideosList,
28 installPlugin,
f43db2f4 29 killallServers,
a890d1e0
C
30 login,
31 makePutBodyRequest,
32 rateVideo,
1f20622f 33 registerUserWithChannel,
a890d1e0
C
34 removeUser,
35 removeVideo,
4f32032f 36 reportAbuse,
f43db2f4 37 reRunServer,
a890d1e0 38 ServerInfo,
f43db2f4 39 setTokenField,
a890d1e0
C
40 testImage,
41 unblockUser,
4f32032f 42 updateAbuse,
e1c55031 43 updateCustomSubConfig,
a890d1e0
C
44 updateMyAvatar,
45 updateMyUser,
46 updateUser,
47 uploadVideo,
76314386 48 userLogin,
e1c55031 49 waitJobs
94565d52
C
50} from '../../../../shared/extra-utils'
51import { follow } from '../../../../shared/extra-utils/server/follows'
f43db2f4 52import { logout, refreshToken, setAccessTokensToServers } from '../../../../shared/extra-utils/users/login'
94565d52 53import { getMyVideos } from '../../../../shared/extra-utils/videos/videos'
1eddc9a7 54import { UserAdminFlag } from '../../../../shared/models/users/user-flag.model'
0e1dc3e7 55
afffe988
C
56const expect = chai.expect
57
0e1dc3e7
C
58describe('Test users', function () {
59 let server: ServerInfo
60 let accessToken: string
61 let accessTokenUser: string
62 let videoId: number
63 let userId: number
f8b8c36b
C
64 const user = {
65 username: 'user_1',
66 password: 'super password'
67 }
0e1dc3e7
C
68
69 before(async function () {
e212f887 70 this.timeout(30000)
e1c55031
C
71
72 server = await flushAndRunServer(1, {
73 rates_limit: {
74 login: {
75 max: 30
76 }
77 }
78 })
86d13ec2
C
79
80 await setAccessTokensToServers([ server ])
9b474844
C
81
82 await installPlugin({ url: server.url, accessToken: server.accessToken, npmName: 'peertube-theme-background-red' })
0e1dc3e7
C
83 })
84
1eddc9a7
C
85 describe('OAuth client', function () {
86 it('Should create a new client')
0e1dc3e7 87
1eddc9a7 88 it('Should return the first client')
0e1dc3e7 89
1eddc9a7 90 it('Should remove the last client')
0e1dc3e7 91
1eddc9a7
C
92 it('Should not login with an invalid client id', async function () {
93 const client = { id: 'client', secret: server.client.secret }
2d53be02 94 const res = await login(server.url, client, server.user, HttpStatusCode.BAD_REQUEST_400)
0e1dc3e7 95
81628e50 96 expect(res.body.code).to.equal(OAuth2ErrorCode.INVALID_CLIENT)
3866ea02
RK
97 expect(res.body.error).to.contain('client is invalid')
98 expect(res.body.type.startsWith('https://')).to.be.true
81628e50 99 expect(res.body.type).to.contain(OAuth2ErrorCode.INVALID_CLIENT)
1eddc9a7 100 })
0e1dc3e7 101
1eddc9a7
C
102 it('Should not login with an invalid client secret', async function () {
103 const client = { id: server.client.id, secret: 'coucou' }
2d53be02 104 const res = await login(server.url, client, server.user, HttpStatusCode.BAD_REQUEST_400)
0e1dc3e7 105
81628e50 106 expect(res.body.code).to.equal(OAuth2ErrorCode.INVALID_CLIENT)
3866ea02
RK
107 expect(res.body.error).to.contain('client is invalid')
108 expect(res.body.type.startsWith('https://')).to.be.true
81628e50 109 expect(res.body.type).to.contain(OAuth2ErrorCode.INVALID_CLIENT)
1eddc9a7 110 })
0e1dc3e7
C
111 })
112
1eddc9a7 113 describe('Login', function () {
0e1dc3e7 114
1eddc9a7
C
115 it('Should not login with an invalid username', async function () {
116 const user = { username: 'captain crochet', password: server.user.password }
2d53be02 117 const res = await login(server.url, server.client, user, HttpStatusCode.BAD_REQUEST_400)
0e1dc3e7 118
81628e50 119 expect(res.body.code).to.equal(OAuth2ErrorCode.INVALID_GRANT)
3866ea02
RK
120 expect(res.body.error).to.contain('credentials are invalid')
121 expect(res.body.type.startsWith('https://')).to.be.true
81628e50 122 expect(res.body.type).to.contain(OAuth2ErrorCode.INVALID_GRANT)
1eddc9a7 123 })
0e1dc3e7 124
1eddc9a7
C
125 it('Should not login with an invalid password', async function () {
126 const user = { username: server.user.username, password: 'mew_three' }
2d53be02 127 const res = await login(server.url, server.client, user, HttpStatusCode.BAD_REQUEST_400)
0e1dc3e7 128
81628e50 129 expect(res.body.code).to.equal(OAuth2ErrorCode.INVALID_GRANT)
3866ea02
RK
130 expect(res.body.error).to.contain('credentials are invalid')
131 expect(res.body.type.startsWith('https://')).to.be.true
81628e50 132 expect(res.body.type).to.contain(OAuth2ErrorCode.INVALID_GRANT)
1eddc9a7 133 })
0e1dc3e7 134
1eddc9a7
C
135 it('Should not be able to upload a video', async function () {
136 accessToken = 'my_super_token'
0e1dc3e7 137
1eddc9a7 138 const videoAttributes = {}
2d53be02 139 await uploadVideo(server.url, accessToken, videoAttributes, HttpStatusCode.UNAUTHORIZED_401)
1eddc9a7 140 })
0e1dc3e7 141
1eddc9a7
C
142 it('Should not be able to follow', async function () {
143 accessToken = 'my_super_token'
2d53be02 144 await follow(server.url, [ 'http://example.com' ], accessToken, HttpStatusCode.UNAUTHORIZED_401)
1eddc9a7 145 })
0e1dc3e7 146
1eddc9a7 147 it('Should not be able to unfollow')
0e1dc3e7 148
1eddc9a7 149 it('Should be able to login', async function () {
2d53be02 150 const res = await login(server.url, server.client, server.user, HttpStatusCode.OK_200)
0e1dc3e7 151
1eddc9a7
C
152 accessToken = res.body.access_token
153 })
50b4dcce
NB
154
155 it('Should be able to login with an insensitive username', async function () {
156 const user = { username: 'RoOt', password: server.user.password }
2d53be02 157 await login(server.url, server.client, user, HttpStatusCode.OK_200)
50b4dcce
NB
158
159 const user2 = { username: 'rOoT', password: server.user.password }
2d53be02 160 await login(server.url, server.client, user2, HttpStatusCode.OK_200)
50b4dcce
NB
161
162 const user3 = { username: 'ROOt', password: server.user.password }
2d53be02 163 await login(server.url, server.client, user3, HttpStatusCode.OK_200)
50b4dcce 164 })
0e1dc3e7
C
165 })
166
1eddc9a7 167 describe('Upload', function () {
0e1dc3e7 168
1eddc9a7
C
169 it('Should upload the video with the correct token', async function () {
170 const videoAttributes = {}
171 await uploadVideo(server.url, accessToken, videoAttributes)
172 const res = await getVideosList(server.url)
a1587156 173 const video = res.body.data[0]
0e1dc3e7 174
1eddc9a7
C
175 expect(video.account.name).to.equal('root')
176 videoId = video.id
177 })
178
179 it('Should upload the video again with the correct token', async function () {
180 const videoAttributes = {}
181 await uploadVideo(server.url, accessToken, videoAttributes)
182 })
0e1dc3e7
C
183 })
184
1eddc9a7 185 describe('Ratings', function () {
22834691 186
1eddc9a7
C
187 it('Should retrieve a video rating', async function () {
188 await rateVideo(server.url, accessToken, videoId, 'like')
189 const res = await getMyUserVideoRating(server.url, accessToken, videoId)
190 const rating = res.body
c100a614 191
1eddc9a7
C
192 expect(rating.videoId).to.equal(videoId)
193 expect(rating.rating).to.equal('like')
194 })
c100a614 195
1eddc9a7
C
196 it('Should retrieve ratings list', async function () {
197 await rateVideo(server.url, accessToken, videoId, 'like')
22834691 198
2d53be02 199 const res = await getAccountRatings(server.url, server.user.username, server.accessToken, null, HttpStatusCode.OK_200)
22834691 200 const ratings = res.body
0e1dc3e7 201
1eddc9a7 202 expect(ratings.total).to.equal(1)
a1587156
C
203 expect(ratings.data[0].video.id).to.equal(videoId)
204 expect(ratings.data[0].rating).to.equal('like')
1eddc9a7 205 })
0e1dc3e7 206
1eddc9a7
C
207 it('Should retrieve ratings list by rating type', async function () {
208 {
209 const res = await getAccountRatings(server.url, server.user.username, server.accessToken, 'like')
210 const ratings = res.body
211 expect(ratings.data.length).to.equal(1)
212 }
213
214 {
215 const res = await getAccountRatings(server.url, server.user.username, server.accessToken, 'dislike')
216 const ratings = res.body
217 expect(ratings.data.length).to.equal(0)
218 }
219 })
0e1dc3e7
C
220 })
221
1eddc9a7
C
222 describe('Remove video', function () {
223 it('Should not be able to remove the video with an incorrect token', async function () {
2d53be02 224 await removeVideo(server.url, 'bad_token', videoId, HttpStatusCode.UNAUTHORIZED_401)
1eddc9a7 225 })
0e1dc3e7 226
1eddc9a7 227 it('Should not be able to remove the video with the token of another account')
0e1dc3e7 228
1eddc9a7
C
229 it('Should be able to remove the video with the correct token', async function () {
230 await removeVideo(server.url, accessToken, videoId)
231 })
0e1dc3e7
C
232 })
233
1eddc9a7 234 describe('Logout', function () {
7fed6375
C
235 it('Should logout (revoke token)', async function () {
236 await logout(server.url, server.accessToken)
237 })
0e1dc3e7 238
7fed6375 239 it('Should not be able to get the user information', async function () {
2d53be02 240 await getMyUserInformation(server.url, server.accessToken, HttpStatusCode.UNAUTHORIZED_401)
7fed6375 241 })
0e1dc3e7 242
7fed6375 243 it('Should not be able to upload a video', async function () {
2d53be02 244 await uploadVideo(server.url, server.accessToken, { name: 'video' }, HttpStatusCode.UNAUTHORIZED_401)
7fed6375 245 })
0e1dc3e7 246
1eddc9a7
C
247 it('Should not be able to rate a video', async function () {
248 const path = '/api/v1/videos/'
249 const data = {
250 rating: 'likes'
251 }
0e1dc3e7 252
1eddc9a7
C
253 const options = {
254 url: server.url,
255 path: path + videoId,
256 token: 'wrong token',
257 fields: data,
2d53be02 258 statusCodeExpected: HttpStatusCode.UNAUTHORIZED_401
1eddc9a7
C
259 }
260 await makePutBodyRequest(options)
261 })
0e1dc3e7 262
e1c55031 263 it('Should be able to login again', async function () {
f43db2f4
C
264 const res = await login(server.url, server.client, server.user)
265 server.accessToken = res.body.access_token
266 server.refreshToken = res.body.refresh_token
267 })
268
269 it('Should be able to get my user information again', async function () {
270 await getMyUserInformation(server.url, server.accessToken)
271 })
272
273 it('Should have an expired access token', async function () {
274 this.timeout(15000)
275
276 await setTokenField(server.internalServerNumber, server.accessToken, 'accessTokenExpiresAt', new Date().toISOString())
277 await setTokenField(server.internalServerNumber, server.accessToken, 'refreshTokenExpiresAt', new Date().toISOString())
278
279 killallServers([ server ])
280 await reRunServer(server)
281
282 await getMyUserInformation(server.url, server.accessToken, 401)
283 })
284
285 it('Should not be able to refresh an access token with an expired refresh token', async function () {
286 await refreshToken(server, server.refreshToken, 400)
e1c55031 287 })
0e1dc3e7 288
f43db2f4
C
289 it('Should refresh the token', async function () {
290 this.timeout(15000)
291
292 const futureDate = new Date(new Date().getTime() + 1000 * 60).toISOString()
293 await setTokenField(server.internalServerNumber, server.accessToken, 'refreshTokenExpiresAt', futureDate)
0e1dc3e7 294
f43db2f4
C
295 killallServers([ server ])
296 await reRunServer(server)
297
298 const res = await refreshToken(server, server.refreshToken)
299 server.accessToken = res.body.access_token
300 server.refreshToken = res.body.refresh_token
301 })
1eddc9a7 302
e1c55031
C
303 it('Should be able to get my user information again', async function () {
304 await getMyUserInformation(server.url, server.accessToken)
305 })
0e1dc3e7
C
306 })
307
1eddc9a7 308 describe('Creating a user', function () {
ce5496d6 309
1eddc9a7
C
310 it('Should be able to create a new user', async function () {
311 await createUser({
312 url: server.url,
313 accessToken: accessToken,
314 username: user.username,
315 password: user.password,
316 videoQuota: 2 * 1024 * 1024,
3487330d 317 adminFlags: UserAdminFlag.BYPASS_VIDEO_AUTO_BLACKLIST
1eddc9a7
C
318 })
319 })
a76138ff 320
1eddc9a7
C
321 it('Should be able to login with this user', async function () {
322 accessTokenUser = await userLogin(server, user)
323 })
a76138ff 324
1eddc9a7
C
325 it('Should be able to get user information', async function () {
326 const res1 = await getMyUserInformation(server.url, accessTokenUser)
ac0868bc 327 const userMe: MyUser = res1.body
1eddc9a7 328
76314386 329 const res2 = await getUserInformation(server.url, server.accessToken, userMe.id, true)
1eddc9a7
C
330 const userGet: User = res2.body
331
332 for (const user of [ userMe, userGet ]) {
333 expect(user.username).to.equal('user_1')
334 expect(user.email).to.equal('user_1@example.com')
335 expect(user.nsfwPolicy).to.equal('display')
336 expect(user.videoQuota).to.equal(2 * 1024 * 1024)
337 expect(user.roleLabel).to.equal('User')
338 expect(user.id).to.be.a('number')
339 expect(user.account.displayName).to.equal('user_1')
340 expect(user.account.description).to.be.null
341 }
342
343 expect(userMe.adminFlags).to.be.undefined
3487330d 344 expect(userGet.adminFlags).to.equal(UserAdminFlag.BYPASS_VIDEO_AUTO_BLACKLIST)
29128b2f
RK
345
346 expect(userMe.specialPlaylists).to.have.lengthOf(1)
ac0868bc 347 expect(userMe.specialPlaylists[0].type).to.equal(VideoPlaylistType.WATCH_LATER)
76314386
RK
348
349 // Check stats are included with withStats
350 expect(userGet.videosCount).to.be.a('number')
351 expect(userGet.videosCount).to.equal(0)
352 expect(userGet.videoCommentsCount).to.be.a('number')
353 expect(userGet.videoCommentsCount).to.equal(0)
4f32032f
C
354 expect(userGet.abusesCount).to.be.a('number')
355 expect(userGet.abusesCount).to.equal(0)
356 expect(userGet.abusesAcceptedCount).to.be.a('number')
357 expect(userGet.abusesAcceptedCount).to.equal(0)
1eddc9a7 358 })
ce5496d6
C
359 })
360
1eddc9a7 361 describe('My videos & quotas', function () {
11474c3c 362
1eddc9a7 363 it('Should be able to upload a video with this user', async function () {
5600def4 364 this.timeout(10000)
0e1dc3e7 365
1eddc9a7
C
366 const videoAttributes = {
367 name: 'super user video',
368 fixture: 'video_short.webm'
369 }
370 await uploadVideo(server.url, accessTokenUser, videoAttributes)
371 })
afffe988 372
1eddc9a7
C
373 it('Should have video quota updated', async function () {
374 const res = await getMyUserVideoQuotaUsed(server.url, accessTokenUser)
375 const data = res.body
0e1dc3e7 376
1eddc9a7 377 expect(data.videoQuotaUsed).to.equal(218910)
0e1dc3e7 378
1eddc9a7 379 const resUsers = await getUsersList(server.url, server.accessToken)
0e1dc3e7 380
1eddc9a7
C
381 const users: User[] = resUsers.body.data
382 const tmpUser = users.find(u => u.username === user.username)
383 expect(tmpUser.videoQuotaUsed).to.equal(218910)
384 })
0e1dc3e7 385
1eddc9a7
C
386 it('Should be able to list my videos', async function () {
387 const res = await getMyVideos(server.url, accessTokenUser, 0, 5)
388 expect(res.body.total).to.equal(1)
0e1dc3e7 389
1eddc9a7
C
390 const videos = res.body.data
391 expect(videos).to.have.lengthOf(1)
afffe988 392
a1587156 393 const video: Video = videos[0]
a18f275d
C
394 expect(video.name).to.equal('super user video')
395 expect(video.thumbnailPath).to.not.be.null
396 expect(video.previewPath).to.not.be.null
1eddc9a7 397 })
cca1e13b
C
398
399 it('Should be able to search in my videos', async function () {
400 {
401 const res = await getMyVideos(server.url, accessTokenUser, 0, 5, '-createdAt', 'user video')
402 expect(res.body.total).to.equal(1)
403
404 const videos = res.body.data
405 expect(videos).to.have.lengthOf(1)
406 }
407
408 {
409 const res = await getMyVideos(server.url, accessTokenUser, 0, 5, '-createdAt', 'toto')
410 expect(res.body.total).to.equal(0)
411
412 const videos = res.body.data
413 expect(videos).to.have.lengthOf(0)
414 }
415 })
5600def4
C
416
417 it('Should disable webtorrent, enable HLS, and update my quota', async function () {
418 this.timeout(60000)
419
420 {
421 const res = await getCustomConfig(server.url, server.accessToken)
422 const config = res.body as CustomConfig
423 config.transcoding.webtorrent.enabled = false
424 config.transcoding.hls.enabled = true
425 config.transcoding.enabled = true
426 await updateCustomSubConfig(server.url, server.accessToken, config)
427 }
428
429 {
430 const videoAttributes = {
431 name: 'super user video 2',
432 fixture: 'video_short.webm'
433 }
434 await uploadVideo(server.url, accessTokenUser, videoAttributes)
435
436 await waitJobs([ server ])
437 }
438
439 {
440 const res = await getMyUserVideoQuotaUsed(server.url, accessTokenUser)
441 const data = res.body
442
443 expect(data.videoQuotaUsed).to.be.greaterThan(220000)
444 }
445 })
0e1dc3e7
C
446 })
447
1eddc9a7 448 describe('Users listing', function () {
0e1dc3e7 449
1eddc9a7
C
450 it('Should list all the users', async function () {
451 const res = await getUsersList(server.url, server.accessToken)
452 const result = res.body
453 const total = result.total
454 const users = result.data
afffe988 455
1eddc9a7
C
456 expect(total).to.equal(2)
457 expect(users).to.be.an('array')
458 expect(users.length).to.equal(2)
0e1dc3e7 459
a1587156 460 const user = users[0]
1eddc9a7
C
461 expect(user.username).to.equal('user_1')
462 expect(user.email).to.equal('user_1@example.com')
463 expect(user.nsfwPolicy).to.equal('display')
0e1dc3e7 464
a1587156 465 const rootUser = users[1]
1eddc9a7 466 expect(rootUser.username).to.equal('root')
48f07b4a 467 expect(rootUser.email).to.equal('admin' + server.internalServerNumber + '@example.com')
1eddc9a7 468 expect(user.nsfwPolicy).to.equal('display')
afffe988 469
3cc665f4
C
470 expect(rootUser.lastLoginDate).to.exist
471 expect(user.lastLoginDate).to.exist
472
1eddc9a7
C
473 userId = user.id
474 })
0e1dc3e7 475
1eddc9a7
C
476 it('Should list only the first user by username asc', async function () {
477 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 1, 'username')
0e1dc3e7 478
1eddc9a7
C
479 const result = res.body
480 const total = result.total
481 const users = result.data
a7ba16b6 482
1eddc9a7
C
483 expect(total).to.equal(2)
484 expect(users.length).to.equal(1)
afffe988 485
a1587156 486 const user = users[0]
1eddc9a7 487 expect(user.username).to.equal('root')
48f07b4a 488 expect(user.email).to.equal('admin' + server.internalServerNumber + '@example.com')
1eddc9a7
C
489 expect(user.roleLabel).to.equal('Administrator')
490 expect(user.nsfwPolicy).to.equal('display')
491 })
0e1dc3e7 492
1eddc9a7
C
493 it('Should list only the first user by username desc', async function () {
494 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 1, '-username')
495 const result = res.body
496 const total = result.total
497 const users = result.data
24b9417c 498
1eddc9a7
C
499 expect(total).to.equal(2)
500 expect(users.length).to.equal(1)
24b9417c 501
a1587156 502 const user = users[0]
1eddc9a7
C
503 expect(user.username).to.equal('user_1')
504 expect(user.email).to.equal('user_1@example.com')
505 expect(user.nsfwPolicy).to.equal('display')
506 })
24b9417c 507
1eddc9a7
C
508 it('Should list only the second user by createdAt desc', async function () {
509 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 1, '-createdAt')
510 const result = res.body
511 const total = result.total
512 const users = result.data
24b9417c 513
1eddc9a7 514 expect(total).to.equal(2)
24b9417c
C
515 expect(users.length).to.equal(1)
516
a1587156 517 const user = users[0]
1eddc9a7
C
518 expect(user.username).to.equal('user_1')
519 expect(user.email).to.equal('user_1@example.com')
520 expect(user.nsfwPolicy).to.equal('display')
521 })
24b9417c 522
1eddc9a7
C
523 it('Should list all the users by createdAt asc', async function () {
524 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 2, 'createdAt')
525 const result = res.body
526 const total = result.total
527 const users = result.data
24b9417c 528
1eddc9a7 529 expect(total).to.equal(2)
24b9417c
C
530 expect(users.length).to.equal(2)
531
a1587156
C
532 expect(users[0].username).to.equal('root')
533 expect(users[0].email).to.equal('admin' + server.internalServerNumber + '@example.com')
534 expect(users[0].nsfwPolicy).to.equal('display')
24b9417c 535
a1587156
C
536 expect(users[1].username).to.equal('user_1')
537 expect(users[1].email).to.equal('user_1@example.com')
538 expect(users[1].nsfwPolicy).to.equal('display')
11ba2ab3 539 })
0e1dc3e7 540
1eddc9a7
C
541 it('Should search user by username', async function () {
542 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 2, 'createdAt', 'oot')
543 const users = res.body.data as User[]
544
545 expect(res.body.total).to.equal(1)
546 expect(users.length).to.equal(1)
0e1dc3e7 547
a1587156 548 expect(users[0].username).to.equal('root')
11ba2ab3 549 })
0e1dc3e7 550
1eddc9a7
C
551 it('Should search user by email', async function () {
552 {
553 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 2, 'createdAt', 'r_1@exam')
554 const users = res.body.data as User[]
0e1dc3e7 555
1eddc9a7
C
556 expect(res.body.total).to.equal(1)
557 expect(users.length).to.equal(1)
5c98d3bf 558
a1587156
C
559 expect(users[0].username).to.equal('user_1')
560 expect(users[0].email).to.equal('user_1@example.com')
1eddc9a7 561 }
7efe153b 562
1eddc9a7
C
563 {
564 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 2, 'createdAt', 'example')
565 const users = res.body.data as User[]
7efe153b 566
1eddc9a7
C
567 expect(res.body.total).to.equal(2)
568 expect(users.length).to.equal(2)
7efe153b 569
a1587156
C
570 expect(users[0].username).to.equal('root')
571 expect(users[1].username).to.equal('user_1')
1eddc9a7 572 }
11ba2ab3 573 })
5c98d3bf
C
574 })
575
1eddc9a7
C
576 describe('Update my account', function () {
577 it('Should update my password', async function () {
578 await updateMyUser({
579 url: server.url,
580 accessToken: accessTokenUser,
581 currentPassword: 'super password',
43d0ea7f 582 password: 'new password'
1eddc9a7
C
583 })
584 user.password = 'new password'
c5911fd3 585
2d53be02 586 await userLogin(server, user, HttpStatusCode.OK_200)
c5911fd3
C
587 })
588
1eddc9a7
C
589 it('Should be able to change the NSFW display attribute', async function () {
590 await updateMyUser({
591 url: server.url,
592 accessToken: accessTokenUser,
593 nsfwPolicy: 'do_not_list'
594 })
595
596 const res = await getMyUserInformation(server.url, accessTokenUser)
597 const user = res.body
598
599 expect(user.username).to.equal('user_1')
600 expect(user.email).to.equal('user_1@example.com')
601 expect(user.nsfwPolicy).to.equal('do_not_list')
602 expect(user.videoQuota).to.equal(2 * 1024 * 1024)
603 expect(user.id).to.be.a('number')
604 expect(user.account.displayName).to.equal('user_1')
605 expect(user.account.description).to.be.null
606 })
c5911fd3 607
1eddc9a7
C
608 it('Should be able to change the autoPlayVideo attribute', async function () {
609 await updateMyUser({
610 url: server.url,
611 accessToken: accessTokenUser,
612 autoPlayVideo: false
613 })
c5911fd3 614
1eddc9a7
C
615 const res = await getMyUserInformation(server.url, accessTokenUser)
616 const user = res.body
617
618 expect(user.autoPlayVideo).to.be.false
ed56ad11
C
619 })
620
6aa54148
L
621 it('Should be able to change the autoPlayNextVideo attribute', async function () {
622 await updateMyUser({
623 url: server.url,
624 accessToken: accessTokenUser,
625 autoPlayNextVideo: true
626 })
627
628 const res = await getMyUserInformation(server.url, accessTokenUser)
629 const user = res.body
630
631 expect(user.autoPlayNextVideo).to.be.true
632 })
633
675a8fc7 634 it('Should be able to change the email attribute', async function () {
1eddc9a7
C
635 await updateMyUser({
636 url: server.url,
637 accessToken: accessTokenUser,
675a8fc7 638 currentPassword: 'new password',
1eddc9a7
C
639 email: 'updated@example.com'
640 })
641
642 const res = await getMyUserInformation(server.url, accessTokenUser)
643 const user = res.body
644
645 expect(user.username).to.equal('user_1')
646 expect(user.email).to.equal('updated@example.com')
647 expect(user.nsfwPolicy).to.equal('do_not_list')
648 expect(user.videoQuota).to.equal(2 * 1024 * 1024)
649 expect(user.id).to.be.a('number')
650 expect(user.account.displayName).to.equal('user_1')
651 expect(user.account.description).to.be.null
652 })
ed56ad11 653
f619de0e
C
654 it('Should be able to update my avatar with a gif', async function () {
655 const fixture = 'avatar.gif'
ed56ad11 656
1eddc9a7
C
657 await updateMyAvatar({
658 url: server.url,
659 accessToken: accessTokenUser,
660 fixture
661 })
2422c46b 662
1eddc9a7
C
663 const res = await getMyUserInformation(server.url, accessTokenUser)
664 const user = res.body
2422c46b 665
f619de0e
C
666 await testImage(server.url, 'avatar-resized', user.account.avatar.path, '.gif')
667 })
668
669 it('Should be able to update my avatar with a gif, and then a png', async function () {
670 for (const extension of [ '.png', '.gif' ]) {
671 const fixture = 'avatar' + extension
672
673 await updateMyAvatar({
674 url: server.url,
675 accessToken: accessTokenUser,
676 fixture
677 })
678
679 const res = await getMyUserInformation(server.url, accessTokenUser)
680 const user = res.body
681
682 await testImage(server.url, 'avatar-resized', user.account.avatar.path, extension)
683 }
1eddc9a7
C
684 })
685
686 it('Should be able to update my display name', async function () {
687 await updateMyUser({
688 url: server.url,
689 accessToken: accessTokenUser,
690 displayName: 'new display name'
691 })
692
693 const res = await getMyUserInformation(server.url, accessTokenUser)
694 const user = res.body
695
696 expect(user.username).to.equal('user_1')
697 expect(user.email).to.equal('updated@example.com')
698 expect(user.nsfwPolicy).to.equal('do_not_list')
699 expect(user.videoQuota).to.equal(2 * 1024 * 1024)
700 expect(user.id).to.be.a('number')
701 expect(user.account.displayName).to.equal('new display name')
702 expect(user.account.description).to.be.null
703 })
2422c46b 704
1eddc9a7
C
705 it('Should be able to update my description', async function () {
706 await updateMyUser({
707 url: server.url,
708 accessToken: accessTokenUser,
709 description: 'my super description updated'
710 })
711
712 const res = await getMyUserInformation(server.url, accessTokenUser)
43d0ea7f 713 const user: User = res.body
1eddc9a7
C
714
715 expect(user.username).to.equal('user_1')
716 expect(user.email).to.equal('updated@example.com')
717 expect(user.nsfwPolicy).to.equal('do_not_list')
718 expect(user.videoQuota).to.equal(2 * 1024 * 1024)
719 expect(user.id).to.be.a('number')
720 expect(user.account.displayName).to.equal('new display name')
721 expect(user.account.description).to.equal('my super description updated')
43d0ea7f
C
722 expect(user.noWelcomeModal).to.be.false
723 expect(user.noInstanceConfigWarningModal).to.be.false
1eddc9a7 724 })
9b474844
C
725
726 it('Should be able to update my theme', async function () {
727 for (const theme of [ 'background-red', 'default', 'instance-default' ]) {
728 await updateMyUser({
729 url: server.url,
730 accessToken: accessTokenUser,
731 theme
732 })
733
734 const res = await getMyUserInformation(server.url, accessTokenUser)
735 const body: User = res.body
736
737 expect(body.theme).to.equal(theme)
738 }
739 })
43d0ea7f
C
740
741 it('Should be able to update my modal preferences', async function () {
742 await updateMyUser({
743 url: server.url,
744 accessToken: accessTokenUser,
745 noInstanceConfigWarningModal: true,
746 noWelcomeModal: true
747 })
748
749 const res = await getMyUserInformation(server.url, accessTokenUser)
750 const user: User = res.body
751
752 expect(user.noWelcomeModal).to.be.true
753 expect(user.noInstanceConfigWarningModal).to.be.true
754 })
0e1dc3e7
C
755 })
756
1eddc9a7 757 describe('Updating another user', function () {
1eddc9a7
C
758 it('Should be able to update another user', async function () {
759 await updateUser({
760 url: server.url,
761 userId,
762 accessToken,
763 email: 'updated2@example.com',
764 emailVerified: true,
765 videoQuota: 42,
766 role: UserRole.MODERATOR,
6d989edc
C
767 adminFlags: UserAdminFlag.NONE,
768 pluginAuth: 'toto'
1eddc9a7
C
769 })
770
771 const res = await getUserInformation(server.url, accessToken, userId)
6d989edc 772 const user = res.body as User
1eddc9a7
C
773
774 expect(user.username).to.equal('user_1')
775 expect(user.email).to.equal('updated2@example.com')
776 expect(user.emailVerified).to.be.true
777 expect(user.nsfwPolicy).to.equal('do_not_list')
778 expect(user.videoQuota).to.equal(42)
779 expect(user.roleLabel).to.equal('Moderator')
780 expect(user.id).to.be.a('number')
781 expect(user.adminFlags).to.equal(UserAdminFlag.NONE)
6d989edc
C
782 expect(user.pluginAuth).to.equal('toto')
783 })
784
785 it('Should reset the auth plugin', async function () {
786 await updateUser({ url: server.url, userId, accessToken, pluginAuth: null })
787
788 const res = await getUserInformation(server.url, accessToken, userId)
789 const user = res.body as User
790 expect(user.pluginAuth).to.be.null
1eddc9a7 791 })
f8b8c36b 792
1eddc9a7 793 it('Should have removed the user token', async function () {
2d53be02 794 await getMyUserVideoQuotaUsed(server.url, accessTokenUser, HttpStatusCode.UNAUTHORIZED_401)
f8b8c36b 795
1eddc9a7 796 accessTokenUser = await userLogin(server, user)
b426edd4
C
797 })
798
1eddc9a7
C
799 it('Should be able to update another user password', async function () {
800 await updateUser({
801 url: server.url,
802 userId,
803 accessToken,
804 password: 'password updated'
805 })
b426edd4 806
2d53be02 807 await getMyUserVideoQuotaUsed(server.url, accessTokenUser, HttpStatusCode.UNAUTHORIZED_401)
b426edd4 808
2d53be02 809 await userLogin(server, user, HttpStatusCode.BAD_REQUEST_400)
b426edd4 810
1eddc9a7
C
811 user.password = 'password updated'
812 accessTokenUser = await userLogin(server, user)
813 })
757f0da3
C
814 })
815
1eddc9a7
C
816 describe('Video blacklists', function () {
817 it('Should be able to list video blacklist by a moderator', async function () {
818 await getBlacklistedVideosList({ url: server.url, token: accessTokenUser })
819 })
0e1dc3e7
C
820 })
821
1eddc9a7
C
822 describe('Remove a user', function () {
823 it('Should be able to remove this user', async function () {
824 await removeUser(server.url, userId, accessToken)
825 })
0e1dc3e7 826
1eddc9a7 827 it('Should not be able to login with this user', async function () {
2d53be02 828 await userLogin(server, user, HttpStatusCode.BAD_REQUEST_400)
1eddc9a7 829 })
0e1dc3e7 830
1eddc9a7
C
831 it('Should not have videos of this user', async function () {
832 const res = await getVideosList(server.url)
0e1dc3e7 833
1eddc9a7 834 expect(res.body.total).to.equal(1)
0e1dc3e7 835
a1587156 836 const video = res.body.data[0]
1eddc9a7
C
837 expect(video.account.name).to.equal('root')
838 })
0e1dc3e7
C
839 })
840
1eddc9a7 841 describe('Registering a new user', function () {
76314386
RK
842 let user15AccessToken
843
1eddc9a7 844 it('Should register a new user', async function () {
1f20622f 845 const user = { displayName: 'super user 15', username: 'user_15', password: 'my super password' }
e590b4a5
C
846 const channel = { name: 'my_user_15_channel', displayName: 'my channel rocks' }
847
848 await registerUserWithChannel({ url: server.url, user, channel })
1eddc9a7 849 })
0e1dc3e7 850
1eddc9a7
C
851 it('Should be able to login with this registered user', async function () {
852 const user15 = {
853 username: 'user_15',
854 password: 'my super password'
855 }
5c98d3bf 856
76314386 857 user15AccessToken = await userLogin(server, user15)
1eddc9a7 858 })
5c98d3bf 859
1f20622f 860 it('Should have the correct display name', async function () {
76314386 861 const res = await getMyUserInformation(server.url, user15AccessToken)
1f20622f
C
862 const user: User = res.body
863
864 expect(user.account.displayName).to.equal('super user 15')
865 })
866
1eddc9a7 867 it('Should have the correct video quota', async function () {
76314386 868 const res = await getMyUserInformation(server.url, user15AccessToken)
1eddc9a7 869 const user = res.body
0e1dc3e7 870
1eddc9a7
C
871 expect(user.videoQuota).to.equal(5 * 1024 * 1024)
872 })
92b9d60c 873
e590b4a5
C
874 it('Should have created the channel', async function () {
875 const res = await getVideoChannel(server.url, 'my_user_15_channel')
876
877 expect(res.body.displayName).to.equal('my channel rocks')
878 })
879
1eddc9a7
C
880 it('Should remove me', async function () {
881 {
882 const res = await getUsersList(server.url, server.accessToken)
883 expect(res.body.data.find(u => u.username === 'user_15')).to.not.be.undefined
884 }
92b9d60c 885
76314386 886 await deleteMe(server.url, user15AccessToken)
1eddc9a7
C
887
888 {
889 const res = await getUsersList(server.url, server.accessToken)
890 expect(res.body.data.find(u => u.username === 'user_15')).to.be.undefined
891 }
892 })
92b9d60c
C
893 })
894
1eddc9a7 895 describe('User blocking', function () {
76314386
RK
896 let user16Id
897 let user16AccessToken
8491293b
RK
898 const user16 = {
899 username: 'user_16',
900 password: 'my super password'
901 }
76314386 902
8491293b 903 it('Should block a user', async function () {
1eddc9a7
C
904 const resUser = await createUser({
905 url: server.url,
906 accessToken: server.accessToken,
907 username: user16.username,
908 password: user16.password
909 })
76314386 910 user16Id = resUser.body.user.id
e6921918 911
76314386 912 user16AccessToken = await userLogin(server, user16)
e6921918 913
2d53be02 914 await getMyUserInformation(server.url, user16AccessToken, HttpStatusCode.OK_200)
1eddc9a7 915 await blockUser(server.url, user16Id, server.accessToken)
e6921918 916
2d53be02
RK
917 await getMyUserInformation(server.url, user16AccessToken, HttpStatusCode.UNAUTHORIZED_401)
918 await userLogin(server, user16, HttpStatusCode.BAD_REQUEST_400)
8491293b
RK
919 })
920
921 it('Should search user by banned status', async function () {
922 {
923 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 2, 'createdAt', undefined, true)
924 const users = res.body.data as User[]
925
926 expect(res.body.total).to.equal(1)
927 expect(users.length).to.equal(1)
928
929 expect(users[0].username).to.equal(user16.username)
930 }
931
932 {
933 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 2, 'createdAt', undefined, false)
934 const users = res.body.data as User[]
935
936 expect(res.body.total).to.equal(1)
937 expect(users.length).to.equal(1)
938
939 expect(users[0].username).to.not.equal(user16.username)
940 }
941 })
e6921918 942
8491293b 943 it('Should unblock a user', async function () {
1eddc9a7 944 await unblockUser(server.url, user16Id, server.accessToken)
76314386 945 user16AccessToken = await userLogin(server, user16)
2d53be02 946 await getMyUserInformation(server.url, user16AccessToken, HttpStatusCode.OK_200)
76314386
RK
947 })
948 })
949
950 describe('User stats', function () {
951 let user17Id
952 let user17AccessToken
953
954 it('Should report correct initial statistics about a user', async function () {
955 const user17 = {
956 username: 'user_17',
957 password: 'my super password'
958 }
959 const resUser = await createUser({
960 url: server.url,
961 accessToken: server.accessToken,
962 username: user17.username,
963 password: user17.password
964 })
965
966 user17Id = resUser.body.user.id
967 user17AccessToken = await userLogin(server, user17)
968
969 const res = await getUserInformation(server.url, server.accessToken, user17Id, true)
970 const user: User = res.body
971
972 expect(user.videosCount).to.equal(0)
973 expect(user.videoCommentsCount).to.equal(0)
4f32032f
C
974 expect(user.abusesCount).to.equal(0)
975 expect(user.abusesCreatedCount).to.equal(0)
976 expect(user.abusesAcceptedCount).to.equal(0)
76314386
RK
977 })
978
979 it('Should report correct videos count', async function () {
980 const videoAttributes = {
981 name: 'video to test user stats'
982 }
983 await uploadVideo(server.url, user17AccessToken, videoAttributes)
984 const res1 = await getVideosList(server.url)
985 videoId = res1.body.data.find(video => video.name === videoAttributes.name).id
986
987 const res2 = await getUserInformation(server.url, server.accessToken, user17Id, true)
988 const user: User = res2.body
989
990 expect(user.videosCount).to.equal(1)
991 })
992
993 it('Should report correct video comments for user', async function () {
994 const text = 'super comment'
995 await addVideoCommentThread(server.url, user17AccessToken, videoId, text)
996
997 const res = await getUserInformation(server.url, server.accessToken, user17Id, true)
998 const user: User = res.body
999
1000 expect(user.videoCommentsCount).to.equal(1)
1001 })
1002
4f32032f 1003 it('Should report correct abuses counts', async function () {
76314386 1004 const reason = 'my super bad reason'
4f32032f 1005 await reportAbuse({ url: server.url, token: user17AccessToken, videoId, reason })
76314386 1006
edbc9325 1007 const res1 = await getAdminAbusesList({ url: server.url, token: server.accessToken })
76314386
RK
1008 const abuseId = res1.body.data[0].id
1009
1010 const res2 = await getUserInformation(server.url, server.accessToken, user17Id, true)
1011 const user2: User = res2.body
1012
4f32032f
C
1013 expect(user2.abusesCount).to.equal(1) // number of incriminations
1014 expect(user2.abusesCreatedCount).to.equal(1) // number of reports created
76314386 1015
d95d1559 1016 const body: AbuseUpdate = { state: AbuseState.ACCEPTED }
4f32032f 1017 await updateAbuse(server.url, server.accessToken, abuseId, body)
76314386
RK
1018
1019 const res3 = await getUserInformation(server.url, server.accessToken, user17Id, true)
1020 const user3: User = res3.body
1021
4f32032f 1022 expect(user3.abusesAcceptedCount).to.equal(1) // number of reports created accepted
1eddc9a7 1023 })
e6921918
C
1024 })
1025
7c3b7976 1026 after(async function () {
f43db2f4 1027 await closeAllSequelize([ server ])
7c3b7976 1028 await cleanupTests([ server ])
0e1dc3e7
C
1029 })
1030})