]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/tests/api/check-params/users.ts
More robust actor image lazy load
[github/Chocobozzz/PeerTube.git] / server / tests / api / check-params / users.ts
CommitLineData
a1587156 1/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
0e1dc3e7 2
0e1dc3e7 3import 'mocha'
b488ba1e 4import { omit } from 'lodash'
47564bbe 5import { join } from 'path'
f6d6e7f8 6import { User, UserRole } from '../../../../shared'
7import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
0e1dc3e7 8import {
e590b4a5 9 addVideoChannel,
42e1ec25 10 blockUser,
7c3b7976 11 cleanupTests,
42e1ec25
C
12 createUser,
13 deleteMe,
14 flushAndRunServer,
15 getMyUserInformation,
16 getMyUserVideoRating,
18490b07 17 getUserScopedTokens,
42e1ec25
C
18 getUsersList,
19 immutableAssign,
45f1bd72 20 killallServers,
42e1ec25
C
21 makeGetRequest,
22 makePostBodyRequest,
23 makePutBodyRequest,
24 makeUploadRequest,
25 registerUser,
26 removeUser,
18490b07 27 renewUserScopedTokens,
45f1bd72 28 reRunServer,
42e1ec25
C
29 ServerInfo,
30 setAccessTokensToServers,
31 unblockUser,
42e1ec25
C
32 uploadVideo,
33 userLogin
94565d52 34} from '../../../../shared/extra-utils'
b488ba1e 35import { MockSmtpServer } from '../../../../shared/extra-utils/miscs/email'
9639bd17 36import {
37 checkBadCountPagination,
38 checkBadSortPagination,
39 checkBadStartPagination
94565d52 40} from '../../../../shared/extra-utils/requests/check-api-params'
1eddc9a7 41import { UserAdminFlag } from '../../../../shared/models/users/user-flag.model'
0e1dc3e7
C
42
43describe('Test users API validators', function () {
44 const path = '/api/v1/users/'
45 let userId: number
46 let rootId: number
a95a4cc8 47 let moderatorId: number
0e1dc3e7
C
48 let videoId: number
49 let server: ServerInfo
50 let serverWithRegistrationDisabled: ServerInfo
51 let userAccessToken = ''
a95a4cc8 52 let moderatorAccessToken = ''
45f1bd72
JL
53 let emailPort: number
54 let overrideConfig: Object
0e1dc3e7
C
55
56 // ---------------------------------------------------------------
57
58 before(async function () {
e212f887 59 this.timeout(30000)
0e1dc3e7 60
45f1bd72
JL
61 const emails: object[] = []
62 emailPort = await MockSmtpServer.Instance.collectEmails(emails)
63
64 overrideConfig = { signup: { limit: 8 } }
65
a95a4cc8
C
66 {
67 const res = await Promise.all([
45f1bd72 68 flushAndRunServer(1, overrideConfig),
a95a4cc8
C
69 flushAndRunServer(2)
70 ])
0e1dc3e7 71
a95a4cc8
C
72 server = res[0]
73 serverWithRegistrationDisabled = res[1]
0e1dc3e7 74
a95a4cc8
C
75 await setAccessTokensToServers([ server ])
76 }
77
78 {
79 const user = {
80 username: 'user1',
81 password: 'my super password'
82 }
83
84 const videoQuota = 42000000
85 await createUser({
86 url: server.url,
87 accessToken: server.accessToken,
88 username: user.username,
89 password: user.password,
90 videoQuota: videoQuota
91 })
92 userAccessToken = await userLogin(server, user)
93 }
94
95 {
96 const moderator = {
97 username: 'moderator1',
98 password: 'super password'
99 }
100
101 await createUser({
102 url: server.url,
103 accessToken: server.accessToken,
104 username: moderator.username,
105 password: moderator.password,
106 role: UserRole.MODERATOR
107 })
108
109 moderatorAccessToken = await userLogin(server, moderator)
110 }
111
112 {
113 const moderator = {
114 username: 'moderator2',
115 password: 'super password'
116 }
117
118 await createUser({
119 url: server.url,
120 accessToken: server.accessToken,
121 username: moderator.username,
122 password: moderator.password,
123 role: UserRole.MODERATOR
124 })
125 }
26d21b78 126
187501f8
C
127 {
128 const res = await uploadVideo(server.url, server.accessToken, {})
129 videoId = res.body.video.id
130 }
a95a4cc8
C
131
132 {
133 const res = await getUsersList(server.url, server.accessToken)
134 const users: User[] = res.body.data
135
136 userId = users.find(u => u.username === 'user1').id
137 rootId = users.find(u => u.username === 'root').id
138 moderatorId = users.find(u => u.username === 'moderator2').id
139 }
0e1dc3e7
C
140 })
141
142 describe('When listing users', function () {
143 it('Should fail with a bad start pagination', async function () {
26d21b78 144 await checkBadStartPagination(server.url, path, server.accessToken)
0e1dc3e7
C
145 })
146
147 it('Should fail with a bad count pagination', async function () {
26d21b78 148 await checkBadCountPagination(server.url, path, server.accessToken)
0e1dc3e7
C
149 })
150
151 it('Should fail with an incorrect sort', async function () {
26d21b78 152 await checkBadSortPagination(server.url, path, server.accessToken)
0e1dc3e7 153 })
86d13ec2
C
154
155 it('Should fail with a non authenticated user', async function () {
26d21b78
C
156 await makeGetRequest({
157 url: server.url,
158 path,
2d53be02 159 statusCodeExpected: HttpStatusCode.UNAUTHORIZED_401
26d21b78 160 })
86d13ec2
C
161 })
162
163 it('Should fail with a non admin user', async function () {
26d21b78
C
164 await makeGetRequest({
165 url: server.url,
166 path,
167 token: userAccessToken,
2d53be02 168 statusCodeExpected: HttpStatusCode.FORBIDDEN_403
26d21b78 169 })
86d13ec2 170 })
0e1dc3e7
C
171 })
172
173 describe('When adding a new user', function () {
26d21b78
C
174 const baseCorrectParams = {
175 username: 'user2',
176 email: 'test@example.com',
177 password: 'my super password',
178 videoQuota: -1,
bee0abff 179 videoQuotaDaily: -1,
1eddc9a7 180 role: UserRole.USER,
3487330d 181 adminFlags: UserAdminFlag.BYPASS_VIDEO_AUTO_BLACKLIST
26d21b78
C
182 }
183
0e1dc3e7 184 it('Should fail with a too small username', async function () {
d0ce42c1 185 const fields = immutableAssign(baseCorrectParams, { username: '' })
0e1dc3e7
C
186
187 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
188 })
189
190 it('Should fail with a too long username', async function () {
9f7a1953 191 const fields = immutableAssign(baseCorrectParams, { username: 'super'.repeat(50) })
0e1dc3e7
C
192
193 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
194 })
195
563d032e 196 it('Should fail with a not lowercase username', async function () {
26d21b78 197 const fields = immutableAssign(baseCorrectParams, { username: 'Toto' })
563d032e
C
198
199 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
200 })
201
0e1dc3e7 202 it('Should fail with an incorrect username', async function () {
26d21b78 203 const fields = immutableAssign(baseCorrectParams, { username: 'my username' })
0e1dc3e7
C
204
205 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
206 })
207
208 it('Should fail with a missing email', async function () {
26d21b78 209 const fields = omit(baseCorrectParams, 'email')
0e1dc3e7
C
210
211 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
212 })
213
214 it('Should fail with an invalid email', async function () {
26d21b78 215 const fields = immutableAssign(baseCorrectParams, { email: 'test_example.com' })
0e1dc3e7
C
216
217 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
218 })
219
220 it('Should fail with a too small password', async function () {
26d21b78 221 const fields = immutableAssign(baseCorrectParams, { password: 'bla' })
0e1dc3e7
C
222
223 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
224 })
225
226 it('Should fail with a too long password', async function () {
26d21b78 227 const fields = immutableAssign(baseCorrectParams, { password: 'super'.repeat(61) })
0e1dc3e7
C
228
229 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
230 })
231
45f1bd72
JL
232 it('Should fail with empty password and no smtp configured', async function () {
233 const fields = immutableAssign(baseCorrectParams, { password: '' })
234
235 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
236 })
237
238 it('Should succeed with no password on a server with smtp enabled', async function () {
f43db2f4 239 this.timeout(20000)
45f1bd72
JL
240
241 killallServers([ server ])
242
243 const config = immutableAssign(overrideConfig, {
244 smtp: {
245 hostname: 'localhost',
246 port: emailPort
247 }
248 })
249 await reRunServer(server, config)
250
251 const fields = immutableAssign(baseCorrectParams, {
252 password: '',
253 username: 'create_password',
254 email: 'create_password@example.com'
255 })
256
257 await makePostBodyRequest({
258 url: server.url,
259 path: path,
260 token: server.accessToken,
261 fields,
2d53be02 262 statusCodeExpected: HttpStatusCode.OK_200
45f1bd72
JL
263 })
264 })
265
1eddc9a7
C
266 it('Should fail with invalid admin flags', async function () {
267 const fields = immutableAssign(baseCorrectParams, { adminFlags: 'toto' })
268
269 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
270 })
271
0e1dc3e7 272 it('Should fail with an non authenticated user', async function () {
26d21b78
C
273 await makePostBodyRequest({
274 url: server.url,
275 path,
276 token: 'super token',
277 fields: baseCorrectParams,
2d53be02 278 statusCodeExpected: HttpStatusCode.UNAUTHORIZED_401
26d21b78 279 })
0e1dc3e7
C
280 })
281
282 it('Should fail if we add a user with the same username', async function () {
26d21b78 283 const fields = immutableAssign(baseCorrectParams, { username: 'user1' })
0e1dc3e7 284
2d53be02
RK
285 await makePostBodyRequest({
286 url: server.url,
287 path,
288 token: server.accessToken,
289 fields,
290 statusCodeExpected: HttpStatusCode.CONFLICT_409
291 })
0e1dc3e7
C
292 })
293
294 it('Should fail if we add a user with the same email', async function () {
26d21b78 295 const fields = immutableAssign(baseCorrectParams, { email: 'user1@example.com' })
0e1dc3e7 296
2d53be02
RK
297 await makePostBodyRequest({
298 url: server.url,
299 path,
300 token: server.accessToken,
301 fields,
302 statusCodeExpected: HttpStatusCode.CONFLICT_409
303 })
0e1dc3e7
C
304 })
305
77a5501f 306 it('Should fail without a videoQuota', async function () {
26d21b78 307 const fields = omit(baseCorrectParams, 'videoQuota')
77a5501f
C
308
309 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
310 })
311
bee0abff
FA
312 it('Should fail without a videoQuotaDaily', async function () {
313 const fields = omit(baseCorrectParams, 'videoQuotaDaily')
314
315 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
316 })
317
77a5501f 318 it('Should fail with an invalid videoQuota', async function () {
26d21b78 319 const fields = immutableAssign(baseCorrectParams, { videoQuota: -5 })
757f0da3
C
320
321 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
322 })
323
bee0abff
FA
324 it('Should fail with an invalid videoQuotaDaily', async function () {
325 const fields = immutableAssign(baseCorrectParams, { videoQuotaDaily: -7 })
326
327 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
328 })
329
757f0da3 330 it('Should fail without a user role', async function () {
26d21b78 331 const fields = omit(baseCorrectParams, 'role')
757f0da3
C
332
333 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
334 })
335
336 it('Should fail with an invalid user role', async function () {
26d21b78 337 const fields = immutableAssign(baseCorrectParams, { role: 88989 })
77a5501f
C
338
339 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
340 })
341
2ef6a063
C
342 it('Should fail with a "peertube" username', async function () {
343 const fields = immutableAssign(baseCorrectParams, { username: 'peertube' })
344
345 await makePostBodyRequest({
346 url: server.url,
347 path,
348 token: server.accessToken,
349 fields,
2d53be02 350 statusCodeExpected: HttpStatusCode.CONFLICT_409
2ef6a063
C
351 })
352 })
353
a95a4cc8
C
354 it('Should fail to create a moderator or an admin with a moderator', async function () {
355 for (const role of [ UserRole.MODERATOR, UserRole.ADMINISTRATOR ]) {
356 const fields = immutableAssign(baseCorrectParams, { role })
357
358 await makePostBodyRequest({
359 url: server.url,
360 path,
361 token: moderatorAccessToken,
362 fields,
2d53be02 363 statusCodeExpected: HttpStatusCode.FORBIDDEN_403
a95a4cc8
C
364 })
365 }
366 })
367
368 it('Should succeed to create a user with a moderator', async function () {
369 const fields = immutableAssign(baseCorrectParams, { username: 'a4656', email: 'a4656@example.com', role: UserRole.USER })
370
371 await makePostBodyRequest({
372 url: server.url,
373 path,
374 token: moderatorAccessToken,
375 fields,
2d53be02 376 statusCodeExpected: HttpStatusCode.OK_200
a95a4cc8
C
377 })
378 })
379
0e1dc3e7 380 it('Should succeed with the correct params', async function () {
26d21b78
C
381 await makePostBodyRequest({
382 url: server.url,
383 path,
384 token: server.accessToken,
385 fields: baseCorrectParams,
2d53be02 386 statusCodeExpected: HttpStatusCode.OK_200
26d21b78 387 })
0e1dc3e7
C
388 })
389
390 it('Should fail with a non admin user', async function () {
26d21b78 391 const user = {
0e1dc3e7 392 username: 'user1',
0e1dc3e7
C
393 password: 'my super password'
394 }
26d21b78 395 userAccessToken = await userLogin(server, user)
0e1dc3e7 396
0e1dc3e7
C
397 const fields = {
398 username: 'user3',
399 email: 'test@example.com',
77a5501f
C
400 password: 'my super password',
401 videoQuota: 42000000
0e1dc3e7 402 }
2d53be02 403 await makePostBodyRequest({ url: server.url, path, token: userAccessToken, fields, statusCodeExpected: HttpStatusCode.FORBIDDEN_403 })
0e1dc3e7
C
404 })
405 })
406
77a5501f
C
407 describe('When updating my account', function () {
408 it('Should fail with an invalid email attribute', async function () {
409 const fields = {
410 email: 'blabla'
411 }
0e1dc3e7 412
77a5501f 413 await makePutBodyRequest({ url: server.url, path: path + 'me', token: server.accessToken, fields })
0e1dc3e7
C
414 })
415
416 it('Should fail with a too small password', async function () {
417 const fields = {
a890d1e0 418 currentPassword: 'my super password',
0e1dc3e7
C
419 password: 'bla'
420 }
421
77a5501f 422 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
0e1dc3e7
C
423 })
424
425 it('Should fail with a too long password', async function () {
426 const fields = {
a890d1e0 427 currentPassword: 'my super password',
26d21b78 428 password: 'super'.repeat(61)
0e1dc3e7
C
429 }
430
77a5501f 431 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
0e1dc3e7
C
432 })
433
a890d1e0
C
434 it('Should fail without the current password', async function () {
435 const fields = {
436 currentPassword: 'my super password',
437 password: 'super'.repeat(61)
438 }
439
440 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
441 })
442
443 it('Should fail with an invalid current password', async function () {
444 const fields = {
445 currentPassword: 'my super password fail',
446 password: 'super'.repeat(61)
447 }
448
2d53be02
RK
449 await makePutBodyRequest({
450 url: server.url,
451 path: path + 'me',
452 token: userAccessToken,
453 fields,
454 statusCodeExpected: HttpStatusCode.UNAUTHORIZED_401
455 })
a890d1e0
C
456 })
457
0883b324 458 it('Should fail with an invalid NSFW policy attribute', async function () {
0e1dc3e7 459 const fields = {
0883b324 460 nsfwPolicy: 'hello'
0e1dc3e7
C
461 }
462
77a5501f 463 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
0e1dc3e7
C
464 })
465
7efe153b
AL
466 it('Should fail with an invalid autoPlayVideo attribute', async function () {
467 const fields = {
468 autoPlayVideo: -1
469 }
470
471 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
472 })
473
6aa54148
L
474 it('Should fail with an invalid autoPlayNextVideo attribute', async function () {
475 const fields = {
476 autoPlayNextVideo: -1
477 }
478
479 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
480 })
481
8b9a525a
C
482 it('Should fail with an invalid videosHistoryEnabled attribute', async function () {
483 const fields = {
484 videosHistoryEnabled: -1
485 }
486
487 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
488 })
489
0e1dc3e7
C
490 it('Should fail with an non authenticated user', async function () {
491 const fields = {
a890d1e0 492 currentPassword: 'my super password',
0e1dc3e7
C
493 password: 'my super password'
494 }
495
2d53be02
RK
496 await makePutBodyRequest({
497 url: server.url,
498 path: path + 'me',
499 token: 'super token',
500 fields,
501 statusCodeExpected: HttpStatusCode.UNAUTHORIZED_401
502 })
0e1dc3e7
C
503 })
504
2422c46b
C
505 it('Should fail with a too long description', async function () {
506 const fields = {
d23e6a1c 507 description: 'super'.repeat(201)
2422c46b
C
508 }
509
510 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
511 })
512
3caf77d3
C
513 it('Should fail with an invalid videoLanguages attribute', async function () {
514 {
515 const fields = {
516 videoLanguages: 'toto'
517 }
518
519 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
520 }
521
522 {
523 const languages = []
524 for (let i = 0; i < 1000; i++) {
525 languages.push('fr')
526 }
527
528 const fields = {
529 videoLanguages: languages
530 }
531
532 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
533 }
534 })
535
9b474844
C
536 it('Should fail with an invalid theme', async function () {
537 const fields = { theme: 'invalid' }
538 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
539 })
540
541 it('Should fail with an unknown theme', async function () {
542 const fields = { theme: 'peertube-theme-unknown' }
543 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
544 })
545
43d0ea7f
C
546 it('Should fail with an invalid noInstanceConfigWarningModal attribute', async function () {
547 const fields = {
548 noInstanceConfigWarningModal: -1
549 }
550
551 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
552 })
553
554 it('Should fail with an invalid noWelcomeModal attribute', async function () {
555 const fields = {
556 noWelcomeModal: -1
557 }
558
559 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
560 })
561
a890d1e0 562 it('Should succeed to change password with the correct params', async function () {
0e1dc3e7 563 const fields = {
a890d1e0 564 currentPassword: 'my super password',
0e1dc3e7 565 password: 'my super password',
0883b324 566 nsfwPolicy: 'blur',
7efe153b 567 autoPlayVideo: false,
9b474844 568 email: 'super_email@example.com',
43d0ea7f
C
569 theme: 'default',
570 noInstanceConfigWarningModal: true,
571 noWelcomeModal: true
0e1dc3e7
C
572 }
573
2d53be02
RK
574 await makePutBodyRequest({
575 url: server.url,
576 path: path + 'me',
577 token: userAccessToken,
578 fields,
579 statusCodeExpected: HttpStatusCode.NO_CONTENT_204
580 })
77a5501f 581 })
a890d1e0
C
582
583 it('Should succeed without password change with the correct params', async function () {
584 const fields = {
585 nsfwPolicy: 'blur',
5efab546 586 autoPlayVideo: false
a890d1e0
C
587 }
588
2d53be02
RK
589 await makePutBodyRequest({
590 url: server.url,
591 path: path + 'me',
592 token: userAccessToken,
593 fields,
594 statusCodeExpected: HttpStatusCode.NO_CONTENT_204
595 })
a890d1e0 596 })
77a5501f
C
597 })
598
c5911fd3
C
599 describe('When updating my avatar', function () {
600 it('Should fail without an incorrect input file', async function () {
601 const fields = {}
602 const attaches = {
a1587156 603 avatarfile: join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
c5911fd3 604 }
ac81d1a0 605 await makeUploadRequest({ url: server.url, path: path + '/me/avatar/pick', token: server.accessToken, fields, attaches })
c5911fd3
C
606 })
607
01de67b9
C
608 it('Should fail with a big file', async function () {
609 const fields = {}
610 const attaches = {
a1587156 611 avatarfile: join(__dirname, '..', '..', 'fixtures', 'avatar-big.png')
01de67b9 612 }
ac81d1a0 613 await makeUploadRequest({ url: server.url, path: path + '/me/avatar/pick', token: server.accessToken, fields, attaches })
01de67b9
C
614 })
615
4bbfc6c6
C
616 it('Should fail with an unauthenticated user', async function () {
617 const fields = {}
618 const attaches = {
a1587156 619 avatarfile: join(__dirname, '..', '..', 'fixtures', 'avatar.png')
4bbfc6c6
C
620 }
621 await makeUploadRequest({
622 url: server.url,
623 path: path + '/me/avatar/pick',
624 fields,
625 attaches,
2d53be02 626 statusCodeExpected: HttpStatusCode.UNAUTHORIZED_401
4bbfc6c6
C
627 })
628 })
629
c5911fd3
C
630 it('Should succeed with the correct params', async function () {
631 const fields = {}
632 const attaches = {
a1587156 633 avatarfile: join(__dirname, '..', '..', 'fixtures', 'avatar.png')
c5911fd3 634 }
ac81d1a0 635 await makeUploadRequest({
47564bbe
C
636 url: server.url,
637 path: path + '/me/avatar/pick',
638 token: server.accessToken,
639 fields,
640 attaches,
2d53be02 641 statusCodeExpected: HttpStatusCode.OK_200
47564bbe 642 })
c5911fd3
C
643 })
644 })
645
18490b07
C
646 describe('When managing my scoped tokens', function () {
647
648 it('Should fail to get my scoped tokens with an non authenticated user', async function () {
2d53be02 649 await getUserScopedTokens(server.url, null, HttpStatusCode.UNAUTHORIZED_401)
18490b07
C
650 })
651
652 it('Should fail to get my scoped tokens with a bad token', async function () {
2d53be02 653 await getUserScopedTokens(server.url, 'bad', HttpStatusCode.UNAUTHORIZED_401)
18490b07
C
654
655 })
656
657 it('Should succeed to get my scoped tokens', async function () {
658 await getUserScopedTokens(server.url, server.accessToken)
659 })
660
661 it('Should fail to renew my scoped tokens with an non authenticated user', async function () {
2d53be02 662 await renewUserScopedTokens(server.url, null, HttpStatusCode.UNAUTHORIZED_401)
18490b07
C
663 })
664
665 it('Should fail to renew my scoped tokens with a bad token', async function () {
2d53be02 666 await renewUserScopedTokens(server.url, 'bad', HttpStatusCode.UNAUTHORIZED_401)
18490b07
C
667 })
668
669 it('Should succeed to renew my scoped tokens', async function () {
670 await renewUserScopedTokens(server.url, server.accessToken)
671 })
672 })
673
94ff4c23 674 describe('When getting a user', function () {
94ff4c23
C
675
676 it('Should fail with an non authenticated user', async function () {
2d53be02
RK
677 await makeGetRequest({
678 url: server.url,
679 path: path + userId,
680 token: 'super token',
681 statusCodeExpected: HttpStatusCode.UNAUTHORIZED_401
682 })
94ff4c23
C
683 })
684
685 it('Should fail with a non admin user', async function () {
2d53be02 686 await makeGetRequest({ url: server.url, path, token: userAccessToken, statusCodeExpected: HttpStatusCode.FORBIDDEN_403 })
94ff4c23
C
687 })
688
689 it('Should succeed with the correct params', async function () {
2d53be02 690 await makeGetRequest({ url: server.url, path: path + userId, token: server.accessToken, statusCodeExpected: HttpStatusCode.OK_200 })
94ff4c23
C
691 })
692 })
693
77a5501f
C
694 describe('When updating a user', function () {
695
77a5501f
C
696 it('Should fail with an invalid email attribute', async function () {
697 const fields = {
698 email: 'blabla'
699 }
700
701 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
702 })
703
fc2ec87a
JM
704 it('Should fail with an invalid emailVerified attribute', async function () {
705 const fields = {
706 emailVerified: 'yes'
707 }
708
709 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
710 })
711
77a5501f
C
712 it('Should fail with an invalid videoQuota attribute', async function () {
713 const fields = {
714 videoQuota: -90
715 }
716
717 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
718 })
719
757f0da3
C
720 it('Should fail with an invalid user role attribute', async function () {
721 const fields = {
722 role: 54878
723 }
724
725 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
726 })
727
b426edd4
C
728 it('Should fail with a too small password', async function () {
729 const fields = {
730 currentPassword: 'my super password',
731 password: 'bla'
732 }
733
734 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
735 })
736
737 it('Should fail with a too long password', async function () {
738 const fields = {
739 currentPassword: 'my super password',
740 password: 'super'.repeat(61)
741 }
742
743 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
744 })
745
77a5501f
C
746 it('Should fail with an non authenticated user', async function () {
747 const fields = {
748 videoQuota: 42
749 }
750
2d53be02
RK
751 await makePutBodyRequest({
752 url: server.url,
753 path: path + userId,
754 token: 'super token',
755 fields,
756 statusCodeExpected: HttpStatusCode.UNAUTHORIZED_401
757 })
77a5501f
C
758 })
759
f8b8c36b
C
760 it('Should fail when updating root role', async function () {
761 const fields = {
762 role: UserRole.MODERATOR
763 }
764
765 await makePutBodyRequest({ url: server.url, path: path + rootId, token: server.accessToken, fields })
1eddc9a7
C
766 })
767
768 it('Should fail with invalid admin flags', async function () {
769 const fields = { adminFlags: 'toto' }
770
a95a4cc8
C
771 await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields })
772 })
773
774 it('Should fail to update an admin with a moderator', async function () {
775 const fields = {
776 videoQuota: 42
777 }
778
779 await makePutBodyRequest({
780 url: server.url,
781 path: path + moderatorId,
782 token: moderatorAccessToken,
783 fields,
2d53be02 784 statusCodeExpected: HttpStatusCode.FORBIDDEN_403
a95a4cc8
C
785 })
786 })
787
788 it('Should succeed to update a user with a moderator', async function () {
789 const fields = {
790 videoQuota: 42
791 }
792
793 await makePutBodyRequest({
794 url: server.url,
795 path: path + userId,
796 token: moderatorAccessToken,
797 fields,
2d53be02 798 statusCodeExpected: HttpStatusCode.NO_CONTENT_204
a95a4cc8 799 })
f8b8c36b
C
800 })
801
77a5501f
C
802 it('Should succeed with the correct params', async function () {
803 const fields = {
804 email: 'email@example.com',
fc2ec87a 805 emailVerified: true,
757f0da3 806 videoQuota: 42,
2f1548fd 807 role: UserRole.USER
77a5501f
C
808 }
809
2d53be02
RK
810 await makePutBodyRequest({
811 url: server.url,
812 path: path + userId,
813 token: server.accessToken,
814 fields,
815 statusCodeExpected: HttpStatusCode.NO_CONTENT_204
816 })
0e1dc3e7
C
817 })
818 })
819
820 describe('When getting my information', function () {
821 it('Should fail with a non authenticated user', async function () {
2d53be02 822 await getMyUserInformation(server.url, 'fake_token', HttpStatusCode.UNAUTHORIZED_401)
0e1dc3e7
C
823 })
824
825 it('Should success with the correct parameters', async function () {
26d21b78 826 await getMyUserInformation(server.url, userAccessToken)
0e1dc3e7
C
827 })
828 })
829
830 describe('When getting my video rating', function () {
831 it('Should fail with a non authenticated user', async function () {
2d53be02 832 await getMyUserVideoRating(server.url, 'fake_token', videoId, HttpStatusCode.UNAUTHORIZED_401)
0e1dc3e7
C
833 })
834
835 it('Should fail with an incorrect video uuid', async function () {
2d53be02 836 await getMyUserVideoRating(server.url, server.accessToken, 'blabla', HttpStatusCode.BAD_REQUEST_400)
0e1dc3e7
C
837 })
838
839 it('Should fail with an unknown video', async function () {
2d53be02 840 await getMyUserVideoRating(server.url, server.accessToken, '4da6fde3-88f7-4d16-b119-108df5630b06', HttpStatusCode.NOT_FOUND_404)
0e1dc3e7
C
841 })
842
26d21b78
C
843 it('Should succeed with the correct parameters', async function () {
844 await getMyUserVideoRating(server.url, server.accessToken, videoId)
0e1dc3e7
C
845 })
846 })
847
22834691
C
848 describe('When retrieving my global ratings', function () {
849 const path = '/api/v1/accounts/user1/ratings'
850
851 it('Should fail with a bad start pagination', async function () {
852 await checkBadStartPagination(server.url, path, userAccessToken)
853 })
854
855 it('Should fail with a bad count pagination', async function () {
856 await checkBadCountPagination(server.url, path, userAccessToken)
857 })
858
859 it('Should fail with an incorrect sort', async function () {
860 await checkBadSortPagination(server.url, path, userAccessToken)
861 })
862
863 it('Should fail with a unauthenticated user', async function () {
2d53be02 864 await makeGetRequest({ url: server.url, path, statusCodeExpected: HttpStatusCode.UNAUTHORIZED_401 })
22834691
C
865 })
866
867 it('Should fail with a another user', async function () {
2d53be02 868 await makeGetRequest({ url: server.url, path, token: server.accessToken, statusCodeExpected: HttpStatusCode.FORBIDDEN_403 })
22834691
C
869 })
870
871 it('Should fail with a bad type', async function () {
2d53be02
RK
872 await makeGetRequest({
873 url: server.url,
874 path,
875 token: userAccessToken,
876 query: { rating: 'toto ' },
877 statusCodeExpected: HttpStatusCode.BAD_REQUEST_400
878 })
22834691
C
879 })
880
881 it('Should succeed with the correct params', async function () {
2d53be02 882 await makeGetRequest({ url: server.url, path, token: userAccessToken, statusCodeExpected: HttpStatusCode.OK_200 })
22834691
C
883 })
884 })
885
e6921918 886 describe('When blocking/unblocking/removing user', function () {
0e1dc3e7 887 it('Should fail with an incorrect id', async function () {
2d53be02
RK
888 await removeUser(server.url, 'blabla', server.accessToken, HttpStatusCode.BAD_REQUEST_400)
889 await blockUser(server.url, 'blabla', server.accessToken, HttpStatusCode.BAD_REQUEST_400)
890 await unblockUser(server.url, 'blabla', server.accessToken, HttpStatusCode.BAD_REQUEST_400)
0e1dc3e7
C
891 })
892
893 it('Should fail with the root user', async function () {
2d53be02
RK
894 await removeUser(server.url, rootId, server.accessToken, HttpStatusCode.BAD_REQUEST_400)
895 await blockUser(server.url, rootId, server.accessToken, HttpStatusCode.BAD_REQUEST_400)
896 await unblockUser(server.url, rootId, server.accessToken, HttpStatusCode.BAD_REQUEST_400)
0e1dc3e7
C
897 })
898
899 it('Should return 404 with a non existing id', async function () {
2d53be02
RK
900 await removeUser(server.url, 4545454, server.accessToken, HttpStatusCode.NOT_FOUND_404)
901 await blockUser(server.url, 4545454, server.accessToken, HttpStatusCode.NOT_FOUND_404)
902 await unblockUser(server.url, 4545454, server.accessToken, HttpStatusCode.NOT_FOUND_404)
e6921918
C
903 })
904
905 it('Should fail with a non admin user', async function () {
2d53be02
RK
906 await removeUser(server.url, userId, userAccessToken, HttpStatusCode.FORBIDDEN_403)
907 await blockUser(server.url, userId, userAccessToken, HttpStatusCode.FORBIDDEN_403)
908 await unblockUser(server.url, userId, userAccessToken, HttpStatusCode.FORBIDDEN_403)
0e1dc3e7 909 })
a95a4cc8
C
910
911 it('Should fail on a moderator with a moderator', async function () {
2d53be02
RK
912 await removeUser(server.url, moderatorId, moderatorAccessToken, HttpStatusCode.FORBIDDEN_403)
913 await blockUser(server.url, moderatorId, moderatorAccessToken, HttpStatusCode.FORBIDDEN_403)
914 await unblockUser(server.url, moderatorId, moderatorAccessToken, HttpStatusCode.FORBIDDEN_403)
a95a4cc8
C
915 })
916
917 it('Should succeed on a user with a moderator', async function () {
918 await blockUser(server.url, userId, moderatorAccessToken)
919 await unblockUser(server.url, userId, moderatorAccessToken)
920 })
0e1dc3e7
C
921 })
922
92b9d60c
C
923 describe('When deleting our account', function () {
924 it('Should fail with with the root account', async function () {
2d53be02 925 await deleteMe(server.url, server.accessToken, HttpStatusCode.BAD_REQUEST_400)
92b9d60c
C
926 })
927 })
928
e590b4a5 929 describe('When registering a new user', function () {
0e1dc3e7 930 const registrationPath = path + '/register'
26d21b78
C
931 const baseCorrectParams = {
932 username: 'user3',
1f20622f 933 displayName: 'super user',
26d21b78
C
934 email: 'test3@example.com',
935 password: 'my super password'
936 }
0e1dc3e7
C
937
938 it('Should fail with a too small username', async function () {
d0ce42c1 939 const fields = immutableAssign(baseCorrectParams, { username: '' })
0e1dc3e7
C
940
941 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
942 })
943
944 it('Should fail with a too long username', async function () {
9f7a1953 945 const fields = immutableAssign(baseCorrectParams, { username: 'super'.repeat(50) })
0e1dc3e7
C
946
947 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
948 })
949
950 it('Should fail with an incorrect username', async function () {
26d21b78 951 const fields = immutableAssign(baseCorrectParams, { username: 'my username' })
0e1dc3e7
C
952
953 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
954 })
955
956 it('Should fail with a missing email', async function () {
26d21b78 957 const fields = omit(baseCorrectParams, 'email')
0e1dc3e7
C
958
959 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
960 })
961
962 it('Should fail with an invalid email', async function () {
26d21b78 963 const fields = immutableAssign(baseCorrectParams, { email: 'test_example.com' })
0e1dc3e7
C
964
965 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
966 })
967
968 it('Should fail with a too small password', async function () {
26d21b78 969 const fields = immutableAssign(baseCorrectParams, { password: 'bla' })
0e1dc3e7
C
970
971 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
972 })
973
974 it('Should fail with a too long password', async function () {
26d21b78 975 const fields = immutableAssign(baseCorrectParams, { password: 'super'.repeat(61) })
0e1dc3e7
C
976
977 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
978 })
979
980 it('Should fail if we register a user with the same username', async function () {
26d21b78 981 const fields = immutableAssign(baseCorrectParams, { username: 'root' })
0e1dc3e7 982
26d21b78
C
983 await makePostBodyRequest({
984 url: server.url,
985 path: registrationPath,
986 token: server.accessToken,
987 fields,
2d53be02 988 statusCodeExpected: HttpStatusCode.CONFLICT_409
26d21b78 989 })
0e1dc3e7
C
990 })
991
2ef6a063
C
992 it('Should fail with a "peertube" username', async function () {
993 const fields = immutableAssign(baseCorrectParams, { username: 'peertube' })
994
995 await makePostBodyRequest({
996 url: server.url,
997 path: registrationPath,
998 token: server.accessToken,
999 fields,
2d53be02 1000 statusCodeExpected: HttpStatusCode.CONFLICT_409
2ef6a063
C
1001 })
1002 })
1003
0e1dc3e7 1004 it('Should fail if we register a user with the same email', async function () {
7c3b7976 1005 const fields = immutableAssign(baseCorrectParams, { email: 'admin' + server.internalServerNumber + '@example.com' })
0e1dc3e7 1006
26d21b78
C
1007 await makePostBodyRequest({
1008 url: server.url,
1009 path: registrationPath,
1010 token: server.accessToken,
1011 fields,
2d53be02 1012 statusCodeExpected: HttpStatusCode.CONFLICT_409
26d21b78 1013 })
0e1dc3e7
C
1014 })
1015
1f20622f
C
1016 it('Should fail with a bad display name', async function () {
1017 const fields = immutableAssign(baseCorrectParams, { displayName: 'a'.repeat(150) })
1018
1019 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
1020 })
1021
e590b4a5
C
1022 it('Should fail with a bad channel name', async function () {
1023 const fields = immutableAssign(baseCorrectParams, { channel: { name: '[]azf', displayName: 'toto' } })
1024
1025 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
1026 })
1027
1028 it('Should fail with a bad channel display name', async function () {
1029 const fields = immutableAssign(baseCorrectParams, { channel: { name: 'toto', displayName: '' } })
1030
1031 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
1032 })
1033
32d7f2b7 1034 it('Should fail with a channel name that is the same as username', async function () {
1d5342ab
C
1035 const source = { username: 'super_user', channel: { name: 'super_user', displayName: 'display name' } }
1036 const fields = immutableAssign(baseCorrectParams, source)
1037
1038 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
1039 })
1040
e590b4a5
C
1041 it('Should fail with an existing channel', async function () {
1042 const videoChannelAttributesArg = { name: 'existing_channel', displayName: 'hello', description: 'super description' }
1043 await addVideoChannel(server.url, server.accessToken, videoChannelAttributesArg)
1044
1045 const fields = immutableAssign(baseCorrectParams, { channel: { name: 'existing_channel', displayName: 'toto' } })
1046
2d53be02
RK
1047 await makePostBodyRequest({
1048 url: server.url,
1049 path: registrationPath,
1050 token: server.accessToken,
1051 fields,
1052 statusCodeExpected: HttpStatusCode.CONFLICT_409
1053 })
e590b4a5
C
1054 })
1055
0e1dc3e7 1056 it('Should succeed with the correct params', async function () {
e590b4a5
C
1057 const fields = immutableAssign(baseCorrectParams, { channel: { name: 'super_channel', displayName: 'toto' } })
1058
26d21b78
C
1059 await makePostBodyRequest({
1060 url: server.url,
1061 path: registrationPath,
1062 token: server.accessToken,
e590b4a5 1063 fields: fields,
2d53be02 1064 statusCodeExpected: HttpStatusCode.NO_CONTENT_204
26d21b78 1065 })
0e1dc3e7
C
1066 })
1067
1068 it('Should fail on a server with registration disabled', async function () {
1069 const fields = {
1070 username: 'user4',
1071 email: 'test4@example.com',
1072 password: 'my super password 4'
1073 }
1074
1075 await makePostBodyRequest({
1076 url: serverWithRegistrationDisabled.url,
1077 path: registrationPath,
1078 token: serverWithRegistrationDisabled.accessToken,
1079 fields,
2d53be02 1080 statusCodeExpected: HttpStatusCode.FORBIDDEN_403
0e1dc3e7
C
1081 })
1082 })
1083 })
1084
1085 describe('When registering multiple users on a server with users limit', function () {
1086 it('Should fail when after 3 registrations', async function () {
2d53be02 1087 await registerUser(server.url, 'user42', 'super password', HttpStatusCode.FORBIDDEN_403)
0e1dc3e7
C
1088 })
1089 })
1090
f076daa7
C
1091 describe('When asking a password reset', function () {
1092 const path = '/api/v1/users/ask-reset-password'
1093
1094 it('Should fail with a missing email', async function () {
1095 const fields = {}
1096
1097 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
1098 })
1099
1100 it('Should fail with an invalid email', async function () {
1101 const fields = { email: 'hello' }
1102
1103 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
1104 })
1105
1106 it('Should success with the correct params', async function () {
1107 const fields = { email: 'admin@example.com' }
1108
2d53be02
RK
1109 await makePostBodyRequest({
1110 url: server.url,
1111 path,
1112 token: server.accessToken,
1113 fields,
1114 statusCodeExpected: HttpStatusCode.NO_CONTENT_204
1115 })
f076daa7
C
1116 })
1117 })
1118
d9eaee39
JM
1119 describe('When asking for an account verification email', function () {
1120 const path = '/api/v1/users/ask-send-verify-email'
1121
1122 it('Should fail with a missing email', async function () {
1123 const fields = {}
1124
1125 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
1126 })
1127
1128 it('Should fail with an invalid email', async function () {
1129 const fields = { email: 'hello' }
1130
1131 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
1132 })
1133
1134 it('Should succeed with the correct params', async function () {
1135 const fields = { email: 'admin@example.com' }
1136
2d53be02
RK
1137 await makePostBodyRequest({
1138 url: server.url,
1139 path,
1140 token: server.accessToken,
1141 fields,
1142 statusCodeExpected: HttpStatusCode.NO_CONTENT_204
1143 })
d9eaee39
JM
1144 })
1145 })
1146
7c3b7976 1147 after(async function () {
45f1bd72
JL
1148 MockSmtpServer.Instance.kill()
1149
7c3b7976 1150 await cleanupTests([ server, serverWithRegistrationDisabled ])
0e1dc3e7
C
1151 })
1152})