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