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