1 /* tslint:disable:no-unused-expression */
3 import * as chai from 'chai'
4 import { omit } from 'lodash'
6 import { join } from 'path'
7 import { VideoPrivacy } from '../../../../shared/models/videos/video-privacy.enum'
9 createUser, flushTests, getMyUserInformation, getVideo, getVideosList, immutableAssign, killallServers, makeDeleteRequest,
10 makeGetRequest, makeUploadRequest, makePutBodyRequest, removeVideo, runServer, ServerInfo, setAccessTokensToServers, userLogin
12 import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params'
13 import { getAccountsList } from '../../utils/users/accounts'
15 const expect = chai.expect
17 describe('Test videos API validator', function () {
18 const path = '/api/v1/videos/'
19 let server: ServerInfo
20 let userAccessToken = ''
21 let accountName: string
23 let channelUUID: string
26 // ---------------------------------------------------------------
28 before(async function () {
33 server = await runServer(1)
35 await setAccessTokensToServers([ server ])
37 const username = 'user1'
38 const password = 'my super password'
39 await createUser(server.url, server.accessToken, username, password)
40 userAccessToken = await userLogin(server, { username, password })
43 const res = await getMyUserInformation(server.url, server.accessToken)
44 channelId = res.body.videoChannels[ 0 ].id
45 channelUUID = res.body.videoChannels[ 0 ].uuid
46 accountName = res.body.account.name + '@' + res.body.account.host
50 describe('When listing a video', function () {
51 it('Should fail with a bad start pagination', async function () {
52 await checkBadStartPagination(server.url, path)
55 it('Should fail with a bad count pagination', async function () {
56 await checkBadCountPagination(server.url, path)
59 it('Should fail with an incorrect sort', async function () {
60 await checkBadSortPagination(server.url, path)
63 it('Should success with the correct parameters', async function () {
64 await makeGetRequest({ url: server.url, path, statusCodeExpected: 200 })
68 describe('When searching a video', function () {
70 it('Should fail with nothing', async function () {
71 await makeGetRequest({
73 path: join(path, 'search'),
74 statusCodeExpected: 400
78 it('Should fail with a bad start pagination', async function () {
79 await checkBadStartPagination(server.url, join(path, 'search', 'test'))
82 it('Should fail with a bad count pagination', async function () {
83 await checkBadCountPagination(server.url, join(path, 'search', 'test'))
86 it('Should fail with an incorrect sort', async function () {
87 await checkBadSortPagination(server.url, join(path, 'search', 'test'))
90 it('Should success with the correct parameters', async function () {
91 await makeGetRequest({ url: server.url, path, statusCodeExpected: 200 })
95 describe('When listing my videos', function () {
96 const path = '/api/v1/users/me/videos'
98 it('Should fail with a bad start pagination', async function () {
99 await checkBadStartPagination(server.url, path, server.accessToken)
102 it('Should fail with a bad count pagination', async function () {
103 await checkBadCountPagination(server.url, path, server.accessToken)
106 it('Should fail with an incorrect sort', async function () {
107 await checkBadSortPagination(server.url, path, server.accessToken)
110 it('Should success with the correct parameters', async function () {
111 await makeGetRequest({ url: server.url, token: server.accessToken, path, statusCodeExpected: 200 })
115 describe('When listing account videos', function () {
118 before(async function () {
119 path = '/api/v1/accounts/' + accountName + '/videos'
122 it('Should fail with a bad start pagination', async function () {
123 await checkBadStartPagination(server.url, path, server.accessToken)
126 it('Should fail with a bad count pagination', async function () {
127 await checkBadCountPagination(server.url, path, server.accessToken)
130 it('Should fail with an incorrect sort', async function () {
131 await checkBadSortPagination(server.url, path, server.accessToken)
134 it('Should success with the correct parameters', async function () {
135 await makeGetRequest({ url: server.url, path, statusCodeExpected: 200 })
139 describe('When listing video channel videos', function () {
142 before(async function () {
143 path = '/api/v1/video-channels/' + channelUUID + '/videos'
146 it('Should fail with a bad start pagination', async function () {
147 await checkBadStartPagination(server.url, path, server.accessToken)
150 it('Should fail with a bad count pagination', async function () {
151 await checkBadCountPagination(server.url, path, server.accessToken)
154 it('Should fail with an incorrect sort', async function () {
155 await checkBadSortPagination(server.url, path, server.accessToken)
158 it('Should success with the correct parameters', async function () {
159 await makeGetRequest({ url: server.url, path, statusCodeExpected: 200 })
163 describe('When adding a video', function () {
164 let baseCorrectParams
165 const baseCorrectAttaches = {
166 'videofile': join(__dirname, '..', 'fixtures', 'video_short.webm')
170 // Put in before to have channelId
171 baseCorrectParams = {
172 name: 'my super name',
177 commentsEnabled: true,
178 description: 'my super description',
179 support: 'my super support text',
180 tags: [ 'tag1', 'tag2' ],
181 privacy: VideoPrivacy.PUBLIC,
186 it('Should fail with nothing', async function () {
189 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
192 it('Should fail without name', async function () {
193 const fields = omit(baseCorrectParams, 'name')
194 const attaches = baseCorrectAttaches
196 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
199 it('Should fail with a long name', async function () {
200 const fields = immutableAssign(baseCorrectParams, { name: 'super'.repeat(65) })
201 const attaches = baseCorrectAttaches
203 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
206 it('Should fail with a bad category', async function () {
207 const fields = immutableAssign(baseCorrectParams, { category: 125 })
208 const attaches = baseCorrectAttaches
210 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
213 it('Should fail with a bad licence', async function () {
214 const fields = immutableAssign(baseCorrectParams, { licence: 125 })
215 const attaches = baseCorrectAttaches
217 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
220 it('Should fail with a bad language', async function () {
221 const fields = immutableAssign(baseCorrectParams, { language: 'a'.repeat(15) })
222 const attaches = baseCorrectAttaches
224 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
227 it('Should fail without nsfw attribute', async function () {
228 const fields = omit(baseCorrectParams, 'nsfw')
229 const attaches = baseCorrectAttaches
231 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
234 it('Should fail without commentsEnabled attribute', async function () {
235 const fields = omit(baseCorrectParams, 'commentsEnabled')
236 const attaches = baseCorrectAttaches
238 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
241 it('Should fail with a long description', async function () {
242 const fields = immutableAssign(baseCorrectParams, { description: 'super'.repeat(2500) })
243 const attaches = baseCorrectAttaches
245 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
248 it('Should fail with a long support text', async function () {
249 const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(150) })
250 const attaches = baseCorrectAttaches
252 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
255 it('Should fail without a channel', async function () {
256 const fields = omit(baseCorrectParams, 'channelId')
257 const attaches = baseCorrectAttaches
259 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
262 it('Should fail with a bad channel', async function () {
263 const fields = immutableAssign(baseCorrectParams, { channelId: 545454 })
264 const attaches = baseCorrectAttaches
266 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
269 it('Should fail with another user channel', async function () {
272 password: 'fake_password'
274 await createUser(server.url, server.accessToken, user.username, user.password)
276 const accessTokenUser = await userLogin(server, user)
277 const res = await getMyUserInformation(server.url, accessTokenUser)
278 const customChannelId = res.body.videoChannels[0].id
280 const fields = immutableAssign(baseCorrectParams, { channelId: customChannelId })
281 const attaches = baseCorrectAttaches
283 await makeUploadRequest({ url: server.url, path: path + '/upload', token: userAccessToken, fields, attaches })
286 it('Should fail with too many tags', async function () {
287 const fields = immutableAssign(baseCorrectParams, { tags: [ 'tag1', 'tag2', 'tag3', 'tag4', 'tag5', 'tag6' ] })
288 const attaches = baseCorrectAttaches
290 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
293 it('Should fail with a tag length too low', async function () {
294 const fields = immutableAssign(baseCorrectParams, { tags: [ 'tag1', 't' ] })
295 const attaches = baseCorrectAttaches
297 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
300 it('Should fail with a tag length too big', async function () {
301 const fields = immutableAssign(baseCorrectParams, { tags: [ 'tag1', 'my_super_tag_too_long_long_long_long_long_long' ] })
302 const attaches = baseCorrectAttaches
304 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
307 it('Should fail without an input file', async function () {
308 const fields = baseCorrectParams
310 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
313 it('Should fail without an incorrect input file', async function () {
314 const fields = baseCorrectParams
316 'videofile': join(__dirname, '..', 'fixtures', 'video_short_fake.webm')
318 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
321 it('Should fail with an incorrect thumbnail file', async function () {
322 const fields = baseCorrectParams
324 'thumbnailfile': join(__dirname, '..', 'fixtures', 'avatar.png'),
325 'videofile': join(__dirname, '..', 'fixtures', 'video_short_fake.webm')
328 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
331 it('Should fail with a big thumbnail file', async function () {
332 const fields = baseCorrectParams
334 'thumbnailfile': join(__dirname, '..', 'fixtures', 'avatar-big.png'),
335 'videofile': join(__dirname, '..', 'fixtures', 'video_short_fake.webm')
338 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
341 it('Should fail with an incorrect preview file', async function () {
342 const fields = baseCorrectParams
344 'previewfile': join(__dirname, '..', 'fixtures', 'avatar.png'),
345 'videofile': join(__dirname, '..', 'fixtures', 'video_short_fake.webm')
348 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
351 it('Should fail with a big preview file', async function () {
352 const fields = baseCorrectParams
354 'previewfile': join(__dirname, '..', 'fixtures', 'avatar-big.png'),
355 'videofile': join(__dirname, '..', 'fixtures', 'video_short_fake.webm')
358 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
361 it('Should succeed with the correct parameters', async function () {
364 const fields = baseCorrectParams
367 const attaches = baseCorrectAttaches
368 await makeUploadRequest({
370 path: path + '/upload',
371 token: server.accessToken,
374 statusCodeExpected: 200
379 const attaches = immutableAssign(baseCorrectAttaches, {
380 videofile: join(__dirname, '..', 'fixtures', 'video_short.mp4')
383 await makeUploadRequest({
385 path: path + '/upload',
386 token: server.accessToken,
389 statusCodeExpected: 200
394 const attaches = immutableAssign(baseCorrectAttaches, {
395 videofile: join(__dirname, '..', 'fixtures', 'video_short.ogv')
398 await makeUploadRequest({
400 path: path + '/upload',
401 token: server.accessToken,
404 statusCodeExpected: 200
410 describe('When updating a video', function () {
411 const baseCorrectParams = {
412 name: 'my super name',
417 commentsEnabled: false,
418 description: 'my super description',
419 privacy: VideoPrivacy.PUBLIC,
420 tags: [ 'tag1', 'tag2' ]
423 before(async function () {
424 const res = await getVideosList(server.url)
425 videoId = res.body.data[0].uuid
428 it('Should fail with nothing', async function () {
430 await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields })
433 it('Should fail without a valid uuid', async function () {
434 const fields = baseCorrectParams
435 await makePutBodyRequest({ url: server.url, path: path + 'blabla', token: server.accessToken, fields })
438 it('Should fail with an unknown id', async function () {
439 const fields = baseCorrectParams
441 await makePutBodyRequest({
443 path: path + '4da6fde3-88f7-4d16-b119-108df5630b06',
444 token: server.accessToken,
446 statusCodeExpected: 404
450 it('Should fail with a long name', async function () {
451 const fields = immutableAssign(baseCorrectParams, { name: 'super'.repeat(65) })
453 await makePutBodyRequest({ url: server.url, path: path + videoId, token: server.accessToken, fields })
456 it('Should fail with a bad category', async function () {
457 const fields = immutableAssign(baseCorrectParams, { category: 125 })
459 await makePutBodyRequest({ url: server.url, path: path + videoId, token: server.accessToken, fields })
462 it('Should fail with a bad licence', async function () {
463 const fields = immutableAssign(baseCorrectParams, { licence: 125 })
465 await makePutBodyRequest({ url: server.url, path: path + videoId, token: server.accessToken, fields })
468 it('Should fail with a bad language', async function () {
469 const fields = immutableAssign(baseCorrectParams, { language: 'a'.repeat(15) })
471 await makePutBodyRequest({ url: server.url, path: path + videoId, token: server.accessToken, fields })
474 it('Should fail with a long description', async function () {
475 const fields = immutableAssign(baseCorrectParams, { description: 'super'.repeat(2500) })
477 await makePutBodyRequest({ url: server.url, path: path + videoId, token: server.accessToken, fields })
480 it('Should fail with a long support text', async function () {
481 const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(150) })
483 await makePutBodyRequest({ url: server.url, path: path + videoId, token: server.accessToken, fields })
486 it('Should fail with a bad channel', async function () {
487 const fields = immutableAssign(baseCorrectParams, { channelId: 545454 })
489 await makePutBodyRequest({ url: server.url, path: path + videoId, token: server.accessToken, fields })
492 it('Should fail with too many tags', async function () {
493 const fields = immutableAssign(baseCorrectParams, { tags: [ 'tag1', 'tag2', 'tag3', 'tag4', 'tag5', 'tag6' ] })
495 await makePutBodyRequest({ url: server.url, path: path + videoId, token: server.accessToken, fields })
498 it('Should fail with a tag length too low', async function () {
499 const fields = immutableAssign(baseCorrectParams, { tags: [ 'tag1', 't' ] })
501 await makePutBodyRequest({ url: server.url, path: path + videoId, token: server.accessToken, fields })
504 it('Should fail with a tag length too big', async function () {
505 const fields = immutableAssign(baseCorrectParams, { tags: [ 'tag1', 'my_super_tag_too_long_long_long_long_long_long' ] })
507 await makePutBodyRequest({ url: server.url, path: path + videoId, token: server.accessToken, fields })
510 it('Should fail with an incorrect thumbnail file', async function () {
511 const fields = baseCorrectParams
513 'thumbnailfile': join(__dirname, '..', 'fixtures', 'avatar.png')
516 await makeUploadRequest({
519 path: path + videoId,
520 token: server.accessToken,
526 it('Should fail with a big thumbnail file', async function () {
527 const fields = baseCorrectParams
529 'thumbnailfile': join(__dirname, '..', 'fixtures', 'avatar-big.png')
532 await makeUploadRequest({
535 path: path + videoId,
536 token: server.accessToken,
542 it('Should fail with an incorrect preview file', async function () {
543 const fields = baseCorrectParams
545 'previewfile': join(__dirname, '..', 'fixtures', 'avatar.png')
548 await makeUploadRequest({
551 path: path + videoId,
552 token: server.accessToken,
558 it('Should fail with a big preview file', async function () {
559 const fields = baseCorrectParams
561 'previewfile': join(__dirname, '..', 'fixtures', 'avatar-big.png')
564 await makeUploadRequest({
567 path: path + videoId,
568 token: server.accessToken,
574 it('Should fail with a video of another user without the appropriate right', async function () {
575 const fields = baseCorrectParams
577 await makePutBodyRequest({ url: server.url, path: path + videoId, token: userAccessToken, fields, statusCodeExpected: 403 })
580 it('Should fail with a video of another server')
582 it('Should succeed with the correct parameters', async function () {
583 const fields = baseCorrectParams
585 await makePutBodyRequest({ url: server.url, path: path + videoId, token: server.accessToken, fields, statusCodeExpected: 204 })
589 describe('When getting a video', function () {
590 it('Should return the list of the videos with nothing', async function () {
591 const res = await makeGetRequest({
594 statusCodeExpected: 200
597 expect(res.body.data).to.be.an('array')
598 expect(res.body.data.length).to.equal(3)
601 it('Should fail without a correct uuid', async function () {
602 await getVideo(server.url, 'coucou', 400)
605 it('Should return 404 with an incorrect video', async function () {
606 await getVideo(server.url, '4da6fde3-88f7-4d16-b119-108df5630b06', 404)
609 it('Should succeed with the correct parameters', async function () {
610 await getVideo(server.url, videoId)
614 describe('When rating a video', function () {
617 before(async function () {
618 const res = await getVideosList(server.url)
619 videoId = res.body.data[0].id
622 it('Should fail without a valid uuid', async function () {
626 await makePutBodyRequest({ url: server.url, path: path + 'blabla/rate', token: server.accessToken, fields })
629 it('Should fail with an unknown id', async function () {
633 await makePutBodyRequest({
635 path: path + '4da6fde3-88f7-4d16-b119-108df5630b06/rate',
636 token: server.accessToken,
638 statusCodeExpected: 404
642 it('Should fail with a wrong rating', async function () {
646 await makePutBodyRequest({ url: server.url, path: path + videoId + '/rate', token: server.accessToken, fields })
649 it('Should succeed with the correct parameters', async function () {
653 await makePutBodyRequest({
655 path: path + videoId + '/rate',
656 token: server.accessToken,
658 statusCodeExpected: 204
663 describe('When removing a video', function () {
664 it('Should have 404 with nothing', async function () {
665 await makeDeleteRequest({
668 statusCodeExpected: 400
672 it('Should fail without a correct uuid', async function () {
673 await removeVideo(server.url, server.accessToken, 'hello', 400)
676 it('Should fail with a video which does not exist', async function () {
677 await removeVideo(server.url, server.accessToken, '4da6fde3-88f7-4d16-b119-108df5630b06', 404)
680 it('Should fail with a video of another user without the appropriate right', async function () {
681 await removeVideo(server.url, userAccessToken, videoId, 403)
684 it('Should fail with a video of another server')
686 it('Should succeed with the correct parameters', async function () {
687 await removeVideo(server.url, server.accessToken, videoId)
691 after(async function () {
692 killallServers([ server ])
694 // Keep the logs if the test failed