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