1 /* tslint:disable:no-unused-expression */
3 import { omit } from 'lodash'
5 import { join } from 'path'
6 import { UserRole } from '../../../../shared'
9 createUser, flushTests, getMyUserInformation, getMyUserVideoRating, getUsersList, immutableAssign, killallServers, makeGetRequest,
10 makePostBodyRequest, makePostUploadRequest, makePutBodyRequest, registerUser, removeUser, runServer, ServerInfo, setAccessTokensToServers,
11 updateUser, uploadVideo, userLogin
13 import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params'
15 describe('Test users API validators', function () {
16 const path = '/api/v1/users/'
20 let server: ServerInfo
21 let serverWithRegistrationDisabled: ServerInfo
22 let userAccessToken = ''
24 // ---------------------------------------------------------------
26 before(async function () {
31 server = await runServer(1)
32 serverWithRegistrationDisabled = await runServer(2)
34 await setAccessTokensToServers([ server ])
38 password: 'my super password'
40 const videoQuota = 42000000
41 await createUser(server.url, server.accessToken, user.username, user.password, videoQuota)
42 userAccessToken = await userLogin(server, user)
44 const res = await uploadVideo(server.url, server.accessToken, {})
45 videoId = res.body.video.id
48 describe('When listing users', function () {
49 it('Should fail with a bad start pagination', async function () {
50 await checkBadStartPagination(server.url, path, server.accessToken)
53 it('Should fail with a bad count pagination', async function () {
54 await checkBadCountPagination(server.url, path, server.accessToken)
57 it('Should fail with an incorrect sort', async function () {
58 await checkBadSortPagination(server.url, path, server.accessToken)
61 it('Should fail with a non authenticated user', async function () {
62 await makeGetRequest({
65 statusCodeExpected: 401
69 it('Should fail with a non admin user', async function () {
70 await makeGetRequest({
73 token: userAccessToken,
74 statusCodeExpected: 403
79 describe('When adding a new user', function () {
80 const baseCorrectParams = {
82 email: 'test@example.com',
83 password: 'my super password',
88 it('Should fail with a too small username', async function () {
89 const fields = immutableAssign(baseCorrectParams, { username: 'fi' })
91 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
94 it('Should fail with a too long username', async function () {
95 const fields = immutableAssign(baseCorrectParams, { username: 'my_super_username_which_is_very_long' })
97 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
100 it('Should fail with a not lowercase username', async function () {
101 const fields = immutableAssign(baseCorrectParams, { username: 'Toto' })
103 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
106 it('Should fail with an incorrect username', async function () {
107 const fields = immutableAssign(baseCorrectParams, { username: 'my username' })
109 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
112 it('Should fail with a missing email', async function () {
113 const fields = omit(baseCorrectParams, 'email')
115 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
118 it('Should fail with an invalid email', async function () {
119 const fields = immutableAssign(baseCorrectParams, { email: 'test_example.com' })
121 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
124 it('Should fail with a too small password', async function () {
125 const fields = immutableAssign(baseCorrectParams, { password: 'bla' })
127 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
130 it('Should fail with a too long password', async function () {
131 const fields = immutableAssign(baseCorrectParams, { password: 'super'.repeat(61) })
133 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
136 it('Should fail with an non authenticated user', async function () {
137 await makePostBodyRequest({
140 token: 'super token',
141 fields: baseCorrectParams,
142 statusCodeExpected: 401
146 it('Should fail if we add a user with the same username', async function () {
147 const fields = immutableAssign(baseCorrectParams, { username: 'user1' })
149 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields, statusCodeExpected: 409 })
152 it('Should fail if we add a user with the same email', async function () {
153 const fields = immutableAssign(baseCorrectParams, { email: 'user1@example.com' })
155 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields, statusCodeExpected: 409 })
158 it('Should fail without a videoQuota', async function () {
159 const fields = omit(baseCorrectParams, 'videoQuota')
161 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
164 it('Should fail with an invalid videoQuota', async function () {
165 const fields = immutableAssign(baseCorrectParams, { videoQuota: -5 })
167 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
170 it('Should fail without a user role', async function () {
171 const fields = omit(baseCorrectParams, 'role')
173 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
176 it('Should fail with an invalid user role', async function () {
177 const fields = immutableAssign(baseCorrectParams, { role: 88989 })
179 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
182 it('Should succeed with the correct params', async function () {
183 await makePostBodyRequest({
186 token: server.accessToken,
187 fields: baseCorrectParams,
188 statusCodeExpected: 204
192 it('Should fail with a non admin user', async function () {
195 password: 'my super password'
197 userAccessToken = await userLogin(server, user)
201 email: 'test@example.com',
202 password: 'my super password',
205 await makePostBodyRequest({ url: server.url, path, token: userAccessToken, fields, statusCodeExpected: 403 })
209 describe('When updating my account', function () {
210 it('Should fail with an invalid email attribute', async function () {
215 await makePutBodyRequest({ url: server.url, path: path + 'me', token: server.accessToken, fields })
218 it('Should fail with a too small password', async function () {
223 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
226 it('Should fail with a too long password', async function () {
228 password: 'super'.repeat(61)
231 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
234 it('Should fail with an invalid display NSFW attribute', async function () {
239 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
242 it('Should fail with an invalid autoPlayVideo attribute', async function () {
247 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
250 it('Should fail with an non authenticated user', async function () {
252 password: 'my super password'
255 await makePutBodyRequest({ url: server.url, path: path + 'me', token: 'super token', fields, statusCodeExpected: 401 })
258 it('Should succeed with the correct params', async function () {
260 password: 'my super password',
262 autoPlayVideo: false,
263 email: 'super_email@example.com'
266 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields, statusCodeExpected: 204 })
270 describe('When updating my avatar', function () {
271 it('Should fail without an incorrect input file', async function () {
274 'avatarfile': join(__dirname, '..', 'fixtures', 'video_short.mp4')
276 await makePostUploadRequest({ url: server.url, path: path + '/me/avatar/pick', token: server.accessToken, fields, attaches })
279 it('Should succeed with the correct params', async function () {
282 'avatarfile': join(__dirname, '..', 'fixtures', 'avatar.png')
284 await makePostUploadRequest({
286 path: path + '/me/avatar/pick',
287 token: server.accessToken,
290 statusCodeExpected: 200
295 describe('When updating a user', function () {
297 before(async function () {
298 const res = await getUsersList(server.url, server.accessToken)
300 userId = res.body.data[1].id
301 rootId = res.body.data[2].id
304 it('Should fail with an invalid email attribute', async function () {
309 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
312 it('Should fail with an invalid videoQuota attribute', async function () {
317 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
320 it('Should fail with an invalid user role attribute', async function () {
325 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
328 it('Should fail with an non authenticated user', async function () {
333 await makePutBodyRequest({ url: server.url, path: path + userId, token: 'super token', fields, statusCodeExpected: 401 })
336 it('Should succeed with the correct params', async function () {
338 email: 'email@example.com',
340 role: UserRole.MODERATOR
343 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields, statusCodeExpected: 204 })
347 describe('When getting my information', function () {
348 it('Should fail with a non authenticated user', async function () {
349 await getMyUserInformation(server.url, 'fake_token', 401)
352 it('Should success with the correct parameters', async function () {
353 await getMyUserInformation(server.url, userAccessToken)
357 describe('When getting my video rating', function () {
358 it('Should fail with a non authenticated user', async function () {
359 await getMyUserVideoRating(server.url, 'fake_token', videoId, 401)
362 it('Should fail with an incorrect video uuid', async function () {
363 await getMyUserVideoRating(server.url, server.accessToken, 'blabla', 400)
366 it('Should fail with an unknown video', async function () {
367 await getMyUserVideoRating(server.url, server.accessToken, '4da6fde3-88f7-4d16-b119-108df5630b06', 404)
370 it('Should succeed with the correct parameters', async function () {
371 await getMyUserVideoRating(server.url, server.accessToken, videoId)
375 describe('When removing an user', function () {
376 it('Should fail with an incorrect id', async function () {
377 await removeUser(server.url, 'blabla', server.accessToken, 400)
380 it('Should fail with the root user', async function () {
381 await removeUser(server.url, rootId, server.accessToken, 400)
384 it('Should return 404 with a non existing id', async function () {
385 await removeUser(server.url, 4545454, server.accessToken, 404)
389 describe('When register a new user', function () {
390 const registrationPath = path + '/register'
391 const baseCorrectParams = {
393 email: 'test3@example.com',
394 password: 'my super password'
397 it('Should fail with a too small username', async function () {
398 const fields = immutableAssign(baseCorrectParams, { username: 'ji' })
400 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
403 it('Should fail with a too long username', async function () {
404 const fields = immutableAssign(baseCorrectParams, { username: 'my_super_username_which_is_very_long' })
406 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
409 it('Should fail with an incorrect username', async function () {
410 const fields = immutableAssign(baseCorrectParams, { username: 'my username' })
412 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
415 it('Should fail with a missing email', async function () {
416 const fields = omit(baseCorrectParams, 'email')
418 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
421 it('Should fail with an invalid email', async function () {
422 const fields = immutableAssign(baseCorrectParams, { email: 'test_example.com' })
424 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
427 it('Should fail with a too small password', async function () {
428 const fields = immutableAssign(baseCorrectParams, { password: 'bla' })
430 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
433 it('Should fail with a too long password', async function () {
434 const fields = immutableAssign(baseCorrectParams, { password: 'super'.repeat(61) })
436 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
439 it('Should fail if we register a user with the same username', async function () {
440 const fields = immutableAssign(baseCorrectParams, { username: 'root' })
442 await makePostBodyRequest({
444 path: registrationPath,
445 token: server.accessToken,
447 statusCodeExpected: 409
451 it('Should fail if we register a user with the same email', async function () {
452 const fields = immutableAssign(baseCorrectParams, { email: 'admin1@example.com' })
454 await makePostBodyRequest({
456 path: registrationPath,
457 token: server.accessToken,
459 statusCodeExpected: 409
463 it('Should succeed with the correct params', async function () {
464 await makePostBodyRequest({
466 path: registrationPath,
467 token: server.accessToken,
468 fields: baseCorrectParams,
469 statusCodeExpected: 204
473 it('Should fail on a server with registration disabled', async function () {
476 email: 'test4@example.com',
477 password: 'my super password 4'
480 await makePostBodyRequest({
481 url: serverWithRegistrationDisabled.url,
482 path: registrationPath,
483 token: serverWithRegistrationDisabled.accessToken,
485 statusCodeExpected: 403
490 describe('When registering multiple users on a server with users limit', function () {
491 it('Should fail when after 3 registrations', async function () {
492 await registerUser(server.url, 'user42', 'super password', 403)
496 describe('When having a video quota', function () {
497 it('Should fail with a user having too many video', async function () {
501 accessToken: server.accessToken,
505 await uploadVideo(server.url, server.accessToken, {}, 403)
508 it('Should fail with a registered user having too many video', async function () {
513 password: 'my super password'
515 userAccessToken = await userLogin(server, user)
517 const videoAttributes = { fixture: 'video_short2.webm' }
518 await uploadVideo(server.url, userAccessToken, videoAttributes)
519 await uploadVideo(server.url, userAccessToken, videoAttributes)
520 await uploadVideo(server.url, userAccessToken, videoAttributes)
521 await uploadVideo(server.url, userAccessToken, videoAttributes)
522 await uploadVideo(server.url, userAccessToken, videoAttributes)
523 await uploadVideo(server.url, userAccessToken, videoAttributes, 403)
527 after(async function () {
528 killallServers([ server, serverWithRegistrationDisabled ])
530 // Keep the logs if the test failed