]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/tests/api/check-params/video-playlists.ts
Allow user to search through their watch history (#3576)
[github/Chocobozzz/PeerTube.git] / server / tests / api / check-params / video-playlists.ts
CommitLineData
a1587156 1/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
418d092a 2
418d092a 3import 'mocha'
418d092a 4import {
df0b219d 5 addVideoInPlaylist,
7c3b7976 6 cleanupTests,
07b1a18a
C
7 createVideoPlaylist,
8 deleteVideoPlaylist,
7c3b7976 9 flushAndRunServer,
df0b219d
C
10 generateUserAccessToken,
11 getAccountPlaylistsListWithToken,
07b1a18a 12 getVideoPlaylist,
418d092a 13 immutableAssign,
418d092a 14 makeGetRequest,
df0b219d
C
15 removeVideoFromPlaylist,
16 reorderVideosPlaylist,
418d092a 17 ServerInfo,
7c3b7976
C
18 setAccessTokensToServers,
19 setDefaultVideoChannel,
07b1a18a 20 updateVideoPlaylist,
df0b219d
C
21 updateVideoPlaylistElement,
22 uploadVideoAndGetId
94565d52 23} from '../../../../shared/extra-utils'
418d092a
C
24import {
25 checkBadCountPagination,
26 checkBadSortPagination,
27 checkBadStartPagination
94565d52 28} from '../../../../shared/extra-utils/requests/check-api-params'
07b1a18a 29import { VideoPlaylistPrivacy } from '../../../../shared/models/videos/playlist/video-playlist-privacy.model'
df0b219d 30import { VideoPlaylistType } from '../../../../shared/models/videos/playlist/video-playlist-type.model'
2d53be02 31import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
418d092a
C
32
33describe('Test video playlists API validator', function () {
418d092a 34 let server: ServerInfo
df0b219d 35 let userAccessToken: string
07b1a18a 36 let playlistUUID: string
c5e4e36d 37 let privatePlaylistUUID: string
df0b219d 38 let watchLaterPlaylistId: number
07b1a18a 39 let videoId: number
bfbd9128 40 let playlistElementId: number
418d092a
C
41
42 // ---------------------------------------------------------------
43
44 before(async function () {
45 this.timeout(30000)
46
210feb6c 47 server = await flushAndRunServer(1)
418d092a
C
48
49 await setAccessTokensToServers([ server ])
c5e4e36d 50 await setDefaultVideoChannel([ server ])
418d092a 51
df0b219d
C
52 userAccessToken = await generateUserAccessToken(server, 'user1')
53 videoId = (await uploadVideoAndGetId({ server, videoName: 'video 1' })).id
07b1a18a
C
54
55 {
9d45db29 56 const res = await getAccountPlaylistsListWithToken(server.url, server.accessToken, 'root', 0, 5, VideoPlaylistType.WATCH_LATER)
df0b219d 57 watchLaterPlaylistId = res.body.data[0].id
07b1a18a
C
58 }
59
60 {
61 const res = await createVideoPlaylist({
62 url: server.url,
63 token: server.accessToken,
64 playlistAttrs: {
65 displayName: 'super playlist',
c5e4e36d
C
66 privacy: VideoPlaylistPrivacy.PUBLIC,
67 videoChannelId: server.videoChannel.id
07b1a18a
C
68 }
69 })
70 playlistUUID = res.body.videoPlaylist.uuid
71 }
c5e4e36d
C
72
73 {
74 const res = await createVideoPlaylist({
75 url: server.url,
76 token: server.accessToken,
77 playlistAttrs: {
78 displayName: 'private',
79 privacy: VideoPlaylistPrivacy.PRIVATE
80 }
81 })
82 privatePlaylistUUID = res.body.videoPlaylist.uuid
83 }
418d092a
C
84 })
85
07b1a18a 86 describe('When listing playlists', function () {
418d092a
C
87 const globalPath = '/api/v1/video-playlists'
88 const accountPath = '/api/v1/accounts/root/video-playlists'
89 const videoChannelPath = '/api/v1/video-channels/root_channel/video-playlists'
90
91 it('Should fail with a bad start pagination', async function () {
92 await checkBadStartPagination(server.url, globalPath, server.accessToken)
93 await checkBadStartPagination(server.url, accountPath, server.accessToken)
94 await checkBadStartPagination(server.url, videoChannelPath, server.accessToken)
95 })
96
97 it('Should fail with a bad count pagination', async function () {
98 await checkBadCountPagination(server.url, globalPath, server.accessToken)
99 await checkBadCountPagination(server.url, accountPath, server.accessToken)
100 await checkBadCountPagination(server.url, videoChannelPath, server.accessToken)
101 })
102
103 it('Should fail with an incorrect sort', async function () {
104 await checkBadSortPagination(server.url, globalPath, server.accessToken)
105 await checkBadSortPagination(server.url, accountPath, server.accessToken)
106 await checkBadSortPagination(server.url, videoChannelPath, server.accessToken)
107 })
108
df0b219d
C
109 it('Should fail with a bad playlist type', async function () {
110 await makeGetRequest({ url: server.url, path: globalPath, query: { playlistType: 3 } })
111 await makeGetRequest({ url: server.url, path: accountPath, query: { playlistType: 3 } })
112 await makeGetRequest({ url: server.url, path: videoChannelPath, query: { playlistType: 3 } })
113 })
114
418d092a
C
115 it('Should fail with a bad account parameter', async function () {
116 const accountPath = '/api/v1/accounts/root2/video-playlists'
117
2d53be02
RK
118 await makeGetRequest({
119 url: server.url,
120 path: accountPath,
121 statusCodeExpected: HttpStatusCode.NOT_FOUND_404,
122 token: server.accessToken
123 })
418d092a
C
124 })
125
126 it('Should fail with a bad video channel parameter', async function () {
127 const accountPath = '/api/v1/video-channels/bad_channel/video-playlists'
128
2d53be02
RK
129 await makeGetRequest({
130 url: server.url,
131 path: accountPath,
132 statusCodeExpected: HttpStatusCode.NOT_FOUND_404,
133 token: server.accessToken
134 })
418d092a
C
135 })
136
137 it('Should success with the correct parameters', async function () {
2d53be02
RK
138 await makeGetRequest({ url: server.url, path: globalPath, statusCodeExpected: HttpStatusCode.OK_200, token: server.accessToken })
139 await makeGetRequest({ url: server.url, path: accountPath, statusCodeExpected: HttpStatusCode.OK_200, token: server.accessToken })
140 await makeGetRequest({
141 url: server.url,
142 path: videoChannelPath,
143 statusCodeExpected: HttpStatusCode.OK_200,
144 token: server.accessToken
145 })
418d092a
C
146 })
147 })
148
07b1a18a 149 describe('When listing videos of a playlist', function () {
bfbd9128 150 const path = '/api/v1/video-playlists/'
418d092a
C
151
152 it('Should fail with a bad start pagination', async function () {
bfbd9128 153 await checkBadStartPagination(server.url, path + playlistUUID + '/videos', server.accessToken)
418d092a
C
154 })
155
156 it('Should fail with a bad count pagination', async function () {
bfbd9128 157 await checkBadCountPagination(server.url, path + playlistUUID + '/videos', server.accessToken)
418d092a
C
158 })
159
bfbd9128 160 it('Should success with the correct parameters', async function () {
2d53be02 161 await makeGetRequest({ url: server.url, path: path + playlistUUID + '/videos', statusCodeExpected: HttpStatusCode.OK_200 })
418d092a
C
162 })
163 })
164
07b1a18a
C
165 describe('When getting a video playlist', function () {
166 it('Should fail with a bad id or uuid', async function () {
2d53be02 167 await getVideoPlaylist(server.url, 'toto', HttpStatusCode.BAD_REQUEST_400)
07b1a18a
C
168 })
169
170 it('Should fail with an unknown playlist', async function () {
2d53be02 171 await getVideoPlaylist(server.url, 42, HttpStatusCode.NOT_FOUND_404)
07b1a18a
C
172 })
173
174 it('Should fail to get an unlisted playlist with the number id', async function () {
175 const res = await createVideoPlaylist({
176 url: server.url,
177 token: server.accessToken,
178 playlistAttrs: {
179 displayName: 'super playlist',
180 privacy: VideoPlaylistPrivacy.UNLISTED
181 }
182 })
183 const playlist = res.body.videoPlaylist
184
2d53be02
RK
185 await getVideoPlaylist(server.url, playlist.id, HttpStatusCode.NOT_FOUND_404)
186 await getVideoPlaylist(server.url, playlist.uuid, HttpStatusCode.OK_200)
07b1a18a
C
187 })
188
189 it('Should succeed with the correct params', async function () {
2d53be02 190 await getVideoPlaylist(server.url, playlistUUID, HttpStatusCode.OK_200)
07b1a18a
C
191 })
192 })
193
194 describe('When creating/updating a video playlist', function () {
df0b219d
C
195 const getBase = (playlistAttrs: any = {}, wrapper: any = {}) => {
196 return Object.assign({
2d53be02 197 expectedStatus: HttpStatusCode.BAD_REQUEST_400,
df0b219d
C
198 url: server.url,
199 token: server.accessToken,
200 playlistAttrs: Object.assign({
201 displayName: 'display name',
202 privacy: VideoPlaylistPrivacy.UNLISTED,
c5e4e36d
C
203 thumbnailfile: 'thumbnail.jpg',
204 videoChannelId: server.videoChannel.id
df0b219d
C
205 }, playlistAttrs)
206 }, wrapper)
207 }
208 const getUpdate = (params: any, playlistId: number | string) => {
209 return immutableAssign(params, { playlistId: playlistId })
210 }
07b1a18a
C
211
212 it('Should fail with an unauthenticated user', async function () {
2d53be02 213 const params = getBase({}, { token: null, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
07b1a18a 214
df0b219d
C
215 await createVideoPlaylist(params)
216 await updateVideoPlaylist(getUpdate(params, playlistUUID))
07b1a18a
C
217 })
218
219 it('Should fail without displayName', async function () {
df0b219d 220 const params = getBase({ displayName: undefined })
07b1a18a 221
df0b219d 222 await createVideoPlaylist(params)
07b1a18a
C
223 })
224
225 it('Should fail with an incorrect display name', async function () {
df0b219d 226 const params = getBase({ displayName: 's'.repeat(300) })
07b1a18a 227
df0b219d
C
228 await createVideoPlaylist(params)
229 await updateVideoPlaylist(getUpdate(params, playlistUUID))
07b1a18a
C
230 })
231
232 it('Should fail with an incorrect description', async function () {
df0b219d 233 const params = getBase({ description: 't' })
07b1a18a 234
df0b219d
C
235 await createVideoPlaylist(params)
236 await updateVideoPlaylist(getUpdate(params, playlistUUID))
07b1a18a
C
237 })
238
239 it('Should fail with an incorrect privacy', async function () {
df0b219d 240 const params = getBase({ privacy: 45 })
07b1a18a 241
df0b219d
C
242 await createVideoPlaylist(params)
243 await updateVideoPlaylist(getUpdate(params, playlistUUID))
07b1a18a
C
244 })
245
246 it('Should fail with an unknown video channel id', async function () {
2d53be02 247 const params = getBase({ videoChannelId: 42 }, { expectedStatus: HttpStatusCode.NOT_FOUND_404 })
07b1a18a 248
df0b219d
C
249 await createVideoPlaylist(params)
250 await updateVideoPlaylist(getUpdate(params, playlistUUID))
07b1a18a
C
251 })
252
253 it('Should fail with an incorrect thumbnail file', async function () {
df0b219d 254 const params = getBase({ thumbnailfile: 'avatar.png' })
07b1a18a 255
df0b219d
C
256 await createVideoPlaylist(params)
257 await updateVideoPlaylist(getUpdate(params, playlistUUID))
07b1a18a
C
258 })
259
c5e4e36d
C
260 it('Should fail to set "public" a playlist not assigned to a channel', async function () {
261 const params = getBase({ privacy: VideoPlaylistPrivacy.PUBLIC, videoChannelId: undefined })
262 const params2 = getBase({ privacy: VideoPlaylistPrivacy.PUBLIC, videoChannelId: 'null' })
263 const params3 = getBase({ privacy: undefined, videoChannelId: 'null' })
264
265 await createVideoPlaylist(params)
266 await createVideoPlaylist(params2)
267 await updateVideoPlaylist(getUpdate(params, privatePlaylistUUID))
268 await updateVideoPlaylist(getUpdate(params2, playlistUUID))
269 await updateVideoPlaylist(getUpdate(params3, playlistUUID))
270 })
271
07b1a18a 272 it('Should fail with an unknown playlist to update', async function () {
df0b219d 273 await updateVideoPlaylist(getUpdate(
2d53be02 274 getBase({}, { expectedStatus: HttpStatusCode.NOT_FOUND_404 }),
df0b219d
C
275 42
276 ))
07b1a18a
C
277 })
278
279 it('Should fail to update a playlist of another user', async function () {
df0b219d 280 await updateVideoPlaylist(getUpdate(
2d53be02 281 getBase({}, { token: userAccessToken, expectedStatus: HttpStatusCode.FORBIDDEN_403 }),
df0b219d
C
282 playlistUUID
283 ))
07b1a18a
C
284 })
285
df0b219d
C
286 it('Should fail to update the watch later playlist', async function () {
287 await updateVideoPlaylist(getUpdate(
2d53be02 288 getBase({}, { expectedStatus: HttpStatusCode.BAD_REQUEST_400 }),
df0b219d
C
289 watchLaterPlaylistId
290 ))
07b1a18a
C
291 })
292
293 it('Should succeed with the correct params', async function () {
df0b219d 294 {
2d53be02 295 const params = getBase({}, { expectedStatus: HttpStatusCode.OK_200 })
df0b219d 296 await createVideoPlaylist(params)
07b1a18a
C
297 }
298
df0b219d 299 {
2d53be02 300 const params = getBase({}, { expectedStatus: HttpStatusCode.NO_CONTENT_204 })
df0b219d
C
301 await updateVideoPlaylist(getUpdate(params, playlistUUID))
302 }
07b1a18a
C
303 })
304 })
305
306 describe('When adding an element in a playlist', function () {
df0b219d
C
307 const getBase = (elementAttrs: any = {}, wrapper: any = {}) => {
308 return Object.assign({
2d53be02 309 expectedStatus: HttpStatusCode.BAD_REQUEST_400,
07b1a18a 310 url: server.url,
df0b219d 311 token: server.accessToken,
07b1a18a 312 playlistId: playlistUUID,
df0b219d 313 elementAttrs: Object.assign({
bfbd9128 314 videoId,
df0b219d
C
315 startTimestamp: 2,
316 stopTimestamp: 3
317 }, elementAttrs)
318 }, wrapper)
319 }
320
321 it('Should fail with an unauthenticated user', async function () {
2d53be02 322 const params = getBase({}, { token: null, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
df0b219d 323 await addVideoInPlaylist(params)
07b1a18a
C
324 })
325
326 it('Should fail with the playlist of another user', async function () {
2d53be02 327 const params = getBase({}, { token: userAccessToken, expectedStatus: HttpStatusCode.FORBIDDEN_403 })
df0b219d 328 await addVideoInPlaylist(params)
07b1a18a
C
329 })
330
331 it('Should fail with an unknown or incorrect playlist id', async function () {
df0b219d
C
332 {
333 const params = getBase({}, { playlistId: 'toto' })
334 await addVideoInPlaylist(params)
335 }
07b1a18a 336
df0b219d 337 {
2d53be02 338 const params = getBase({}, { playlistId: 42, expectedStatus: HttpStatusCode.NOT_FOUND_404 })
df0b219d
C
339 await addVideoInPlaylist(params)
340 }
07b1a18a
C
341 })
342
343 it('Should fail with an unknown or incorrect video id', async function () {
2d53be02 344 const params = getBase({ videoId: 42 }, { expectedStatus: HttpStatusCode.NOT_FOUND_404 })
df0b219d 345 await addVideoInPlaylist(params)
07b1a18a
C
346 })
347
348 it('Should fail with a bad start/stop timestamp', async function () {
df0b219d
C
349 {
350 const params = getBase({ startTimestamp: -42 })
351 await addVideoInPlaylist(params)
352 }
07b1a18a 353
df0b219d
C
354 {
355 const params = getBase({ stopTimestamp: 'toto' as any })
356 await addVideoInPlaylist(params)
357 }
07b1a18a
C
358 })
359
360 it('Succeed with the correct params', async function () {
2d53be02 361 const params = getBase({}, { expectedStatus: HttpStatusCode.OK_200 })
bfbd9128
C
362 const res = await addVideoInPlaylist(params)
363 playlistElementId = res.body.videoPlaylistElement.id
07b1a18a 364 })
07b1a18a
C
365 })
366
367 describe('When updating an element in a playlist', function () {
df0b219d
C
368 const getBase = (elementAttrs: any = {}, wrapper: any = {}) => {
369 return Object.assign({
07b1a18a 370 url: server.url,
df0b219d
C
371 token: server.accessToken,
372 elementAttrs: Object.assign({
373 startTimestamp: 1,
374 stopTimestamp: 2
375 }, elementAttrs),
bfbd9128 376 playlistElementId,
07b1a18a 377 playlistId: playlistUUID,
2d53be02 378 expectedStatus: HttpStatusCode.BAD_REQUEST_400
df0b219d
C
379 }, wrapper)
380 }
381
382 it('Should fail with an unauthenticated user', async function () {
2d53be02 383 const params = getBase({}, { token: null, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
df0b219d 384 await updateVideoPlaylistElement(params)
07b1a18a
C
385 })
386
387 it('Should fail with the playlist of another user', async function () {
2d53be02 388 const params = getBase({}, { token: userAccessToken, expectedStatus: HttpStatusCode.FORBIDDEN_403 })
df0b219d 389 await updateVideoPlaylistElement(params)
07b1a18a
C
390 })
391
392 it('Should fail with an unknown or incorrect playlist id', async function () {
df0b219d
C
393 {
394 const params = getBase({}, { playlistId: 'toto' })
395 await updateVideoPlaylistElement(params)
396 }
07b1a18a 397
df0b219d 398 {
2d53be02 399 const params = getBase({}, { playlistId: 42, expectedStatus: HttpStatusCode.NOT_FOUND_404 })
df0b219d
C
400 await updateVideoPlaylistElement(params)
401 }
07b1a18a
C
402 })
403
bfbd9128 404 it('Should fail with an unknown or incorrect playlistElement id', async function () {
df0b219d 405 {
bfbd9128 406 const params = getBase({}, { playlistElementId: 'toto' })
df0b219d
C
407 await updateVideoPlaylistElement(params)
408 }
07b1a18a 409
df0b219d 410 {
2d53be02 411 const params = getBase({}, { playlistElementId: 42, expectedStatus: HttpStatusCode.NOT_FOUND_404 })
df0b219d
C
412 await updateVideoPlaylistElement(params)
413 }
07b1a18a
C
414 })
415
416 it('Should fail with a bad start/stop timestamp', async function () {
df0b219d
C
417 {
418 const params = getBase({ startTimestamp: 'toto' as any })
419 await updateVideoPlaylistElement(params)
420 }
07b1a18a 421
df0b219d
C
422 {
423 const params = getBase({ stopTimestamp: -42 })
424 await updateVideoPlaylistElement(params)
425 }
07b1a18a
C
426 })
427
428 it('Should fail with an unknown element', async function () {
2d53be02 429 const params = getBase({}, { playlistElementId: 888, expectedStatus: HttpStatusCode.NOT_FOUND_404 })
df0b219d 430 await updateVideoPlaylistElement(params)
07b1a18a
C
431 })
432
433 it('Succeed with the correct params', async function () {
2d53be02 434 const params = getBase({}, { expectedStatus: HttpStatusCode.NO_CONTENT_204 })
df0b219d 435 await updateVideoPlaylistElement(params)
07b1a18a
C
436 })
437 })
438
439 describe('When reordering elements of a playlist', function () {
440 let videoId3: number
441 let videoId4: number
442
df0b219d
C
443 const getBase = (elementAttrs: any = {}, wrapper: any = {}) => {
444 return Object.assign({
07b1a18a
C
445 url: server.url,
446 token: server.accessToken,
447 playlistId: playlistUUID,
df0b219d
C
448 elementAttrs: Object.assign({
449 startPosition: 1,
450 insertAfterPosition: 2,
451 reorderLength: 3
452 }, elementAttrs),
2d53be02 453 expectedStatus: HttpStatusCode.BAD_REQUEST_400
df0b219d
C
454 }, wrapper)
455 }
07b1a18a 456
df0b219d
C
457 before(async function () {
458 videoId3 = (await uploadVideoAndGetId({ server, videoName: 'video 3' })).id
459 videoId4 = (await uploadVideoAndGetId({ server, videoName: 'video 4' })).id
460
a1587156 461 for (const id of [ videoId3, videoId4 ]) {
df0b219d
C
462 await addVideoInPlaylist({
463 url: server.url,
464 token: server.accessToken,
465 playlistId: playlistUUID,
466 elementAttrs: { videoId: id }
467 })
468 }
07b1a18a
C
469 })
470
471 it('Should fail with an unauthenticated user', async function () {
2d53be02 472 const params = getBase({}, { token: null, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
df0b219d 473 await reorderVideosPlaylist(params)
07b1a18a
C
474 })
475
476 it('Should fail with the playlist of another user', async function () {
2d53be02 477 const params = getBase({}, { token: userAccessToken, expectedStatus: HttpStatusCode.FORBIDDEN_403 })
df0b219d 478 await reorderVideosPlaylist(params)
07b1a18a
C
479 })
480
481 it('Should fail with an invalid playlist', async function () {
df0b219d
C
482 {
483 const params = getBase({}, { playlistId: 'toto' })
484 await reorderVideosPlaylist(params)
485 }
07b1a18a 486
df0b219d 487 {
2d53be02 488 const params = getBase({}, { playlistId: 42, expectedStatus: HttpStatusCode.NOT_FOUND_404 })
df0b219d
C
489 await reorderVideosPlaylist(params)
490 }
07b1a18a
C
491 })
492
493 it('Should fail with an invalid start position', async function () {
df0b219d
C
494 {
495 const params = getBase({ startPosition: -1 })
496 await reorderVideosPlaylist(params)
497 }
07b1a18a 498
df0b219d
C
499 {
500 const params = getBase({ startPosition: 'toto' as any })
501 await reorderVideosPlaylist(params)
502 }
07b1a18a 503
df0b219d
C
504 {
505 const params = getBase({ startPosition: 42 })
506 await reorderVideosPlaylist(params)
507 }
07b1a18a
C
508 })
509
510 it('Should fail with an invalid insert after position', async function () {
df0b219d
C
511 {
512 const params = getBase({ insertAfterPosition: 'toto' as any })
513 await reorderVideosPlaylist(params)
514 }
07b1a18a 515
df0b219d
C
516 {
517 const params = getBase({ insertAfterPosition: -2 })
518 await reorderVideosPlaylist(params)
519 }
07b1a18a 520
df0b219d
C
521 {
522 const params = getBase({ insertAfterPosition: 42 })
523 await reorderVideosPlaylist(params)
524 }
07b1a18a
C
525 })
526
527 it('Should fail with an invalid reorder length', async function () {
df0b219d
C
528 {
529 const params = getBase({ reorderLength: 'toto' as any })
530 await reorderVideosPlaylist(params)
531 }
07b1a18a 532
df0b219d
C
533 {
534 const params = getBase({ reorderLength: -2 })
535 await reorderVideosPlaylist(params)
536 }
07b1a18a 537
df0b219d
C
538 {
539 const params = getBase({ reorderLength: 42 })
540 await reorderVideosPlaylist(params)
541 }
07b1a18a
C
542 })
543
544 it('Succeed with the correct params', async function () {
2d53be02 545 const params = getBase({}, { expectedStatus: HttpStatusCode.NO_CONTENT_204 })
df0b219d 546 await reorderVideosPlaylist(params)
07b1a18a
C
547 })
548 })
549
0b16f5f2
C
550 describe('When checking exists in playlist endpoint', function () {
551 const path = '/api/v1/users/me/video-playlists/videos-exist'
552
553 it('Should fail with an unauthenticated user', async function () {
554 await makeGetRequest({
555 url: server.url,
556 path,
557 query: { videoIds: [ 1, 2 ] },
2d53be02 558 statusCodeExpected: HttpStatusCode.UNAUTHORIZED_401
0b16f5f2
C
559 })
560 })
561
562 it('Should fail with invalid video ids', async function () {
563 await makeGetRequest({
564 url: server.url,
565 token: server.accessToken,
566 path,
567 query: { videoIds: 'toto' }
568 })
569
570 await makeGetRequest({
571 url: server.url,
572 token: server.accessToken,
573 path,
574 query: { videoIds: [ 'toto' ] }
575 })
576
577 await makeGetRequest({
578 url: server.url,
579 token: server.accessToken,
580 path,
581 query: { videoIds: [ 1, 'toto' ] }
582 })
583 })
584
585 it('Should succeed with the correct params', async function () {
586 await makeGetRequest({
587 url: server.url,
588 token: server.accessToken,
589 path,
590 query: { videoIds: [ 1, 2 ] },
2d53be02 591 statusCodeExpected: HttpStatusCode.OK_200
0b16f5f2
C
592 })
593 })
594 })
595
07b1a18a 596 describe('When deleting an element in a playlist', function () {
df0b219d
C
597 const getBase = (wrapper: any = {}) => {
598 return Object.assign({
07b1a18a 599 url: server.url,
df0b219d 600 token: server.accessToken,
bfbd9128 601 playlistElementId,
07b1a18a 602 playlistId: playlistUUID,
2d53be02 603 expectedStatus: HttpStatusCode.BAD_REQUEST_400
df0b219d
C
604 }, wrapper)
605 }
606
607 it('Should fail with an unauthenticated user', async function () {
2d53be02 608 const params = getBase({ token: null, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
df0b219d 609 await removeVideoFromPlaylist(params)
07b1a18a
C
610 })
611
612 it('Should fail with the playlist of another user', async function () {
2d53be02 613 const params = getBase({ token: userAccessToken, expectedStatus: HttpStatusCode.FORBIDDEN_403 })
df0b219d 614 await removeVideoFromPlaylist(params)
07b1a18a
C
615 })
616
617 it('Should fail with an unknown or incorrect playlist id', async function () {
df0b219d
C
618 {
619 const params = getBase({ playlistId: 'toto' })
620 await removeVideoFromPlaylist(params)
621 }
07b1a18a 622
df0b219d 623 {
2d53be02 624 const params = getBase({ playlistId: 42, expectedStatus: HttpStatusCode.NOT_FOUND_404 })
df0b219d
C
625 await removeVideoFromPlaylist(params)
626 }
07b1a18a
C
627 })
628
629 it('Should fail with an unknown or incorrect video id', async function () {
df0b219d 630 {
bfbd9128 631 const params = getBase({ playlistElementId: 'toto' })
df0b219d
C
632 await removeVideoFromPlaylist(params)
633 }
07b1a18a 634
df0b219d 635 {
2d53be02 636 const params = getBase({ playlistElementId: 42, expectedStatus: HttpStatusCode.NOT_FOUND_404 })
df0b219d
C
637 await removeVideoFromPlaylist(params)
638 }
07b1a18a
C
639 })
640
641 it('Should fail with an unknown element', async function () {
2d53be02 642 const params = getBase({ playlistElementId: 888, expectedStatus: HttpStatusCode.NOT_FOUND_404 })
df0b219d 643 await removeVideoFromPlaylist(params)
07b1a18a
C
644 })
645
646 it('Succeed with the correct params', async function () {
2d53be02 647 const params = getBase({ expectedStatus: HttpStatusCode.NO_CONTENT_204 })
df0b219d 648 await removeVideoFromPlaylist(params)
07b1a18a
C
649 })
650 })
651
652 describe('When deleting a playlist', function () {
653 it('Should fail with an unknown playlist', async function () {
2d53be02 654 await deleteVideoPlaylist(server.url, server.accessToken, 42, HttpStatusCode.NOT_FOUND_404)
07b1a18a
C
655 })
656
657 it('Should fail with a playlist of another user', async function () {
2d53be02 658 await deleteVideoPlaylist(server.url, userAccessToken, playlistUUID, HttpStatusCode.FORBIDDEN_403)
07b1a18a
C
659 })
660
df0b219d 661 it('Should fail with the watch later playlist', async function () {
2d53be02 662 await deleteVideoPlaylist(server.url, server.accessToken, watchLaterPlaylistId, HttpStatusCode.BAD_REQUEST_400)
df0b219d
C
663 })
664
07b1a18a
C
665 it('Should succeed with the correct params', async function () {
666 await deleteVideoPlaylist(server.url, server.accessToken, playlistUUID)
667 })
668 })
669
7c3b7976
C
670 after(async function () {
671 await cleanupTests([ server ])
418d092a
C
672 })
673})