diff options
Diffstat (limited to 'server/tests/api')
-rw-r--r-- | server/tests/api/check-params/live.ts | 47 | ||||
-rw-r--r-- | server/tests/api/live/live-constraints.ts | 6 | ||||
-rw-r--r-- | server/tests/api/live/live-fast-restream.ts | 1 | ||||
-rw-r--r-- | server/tests/api/live/live-save-replay.ts | 264 | ||||
-rw-r--r-- | server/tests/api/live/live.ts | 13 | ||||
-rw-r--r-- | server/tests/api/notifications/user-notifications.ts | 2 | ||||
-rw-r--r-- | server/tests/api/object-storage/live.ts | 1 | ||||
-rw-r--r-- | server/tests/api/object-storage/video-static-file-privacy.ts | 12 | ||||
-rw-r--r-- | server/tests/api/videos/video-static-file-privacy.ts | 12 |
9 files changed, 272 insertions, 86 deletions
diff --git a/server/tests/api/check-params/live.ts b/server/tests/api/check-params/live.ts index 2eff9414b..81f10ed8e 100644 --- a/server/tests/api/check-params/live.ts +++ b/server/tests/api/check-params/live.ts | |||
@@ -83,6 +83,7 @@ describe('Test video lives API validator', function () { | |||
83 | privacy: VideoPrivacy.PUBLIC, | 83 | privacy: VideoPrivacy.PUBLIC, |
84 | channelId, | 84 | channelId, |
85 | saveReplay: false, | 85 | saveReplay: false, |
86 | replaySettings: undefined, | ||
86 | permanentLive: false, | 87 | permanentLive: false, |
87 | latencyMode: LiveVideoLatencyMode.DEFAULT | 88 | latencyMode: LiveVideoLatencyMode.DEFAULT |
88 | } | 89 | } |
@@ -141,6 +142,12 @@ describe('Test video lives API validator', function () { | |||
141 | await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) | 142 | await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) |
142 | }) | 143 | }) |
143 | 144 | ||
145 | it('Should fail with a bad privacy for replay settings', async function () { | ||
146 | const fields = { ...baseCorrectParams, replaySettings: { privacy: 5 } } | ||
147 | |||
148 | await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) | ||
149 | }) | ||
150 | |||
144 | it('Should fail with another user channel', async function () { | 151 | it('Should fail with another user channel', async function () { |
145 | const user = { | 152 | const user = { |
146 | username: 'fake', | 153 | username: 'fake', |
@@ -256,7 +263,7 @@ describe('Test video lives API validator', function () { | |||
256 | }) | 263 | }) |
257 | 264 | ||
258 | it('Should forbid to save replay if not enabled by the admin', async function () { | 265 | it('Should forbid to save replay if not enabled by the admin', async function () { |
259 | const fields = { ...baseCorrectParams, saveReplay: true } | 266 | const fields = { ...baseCorrectParams, saveReplay: true, replaySettings: { privacy: VideoPrivacy.PUBLIC } } |
260 | 267 | ||
261 | await server.config.updateCustomSubConfig({ | 268 | await server.config.updateCustomSubConfig({ |
262 | newConfig: { | 269 | newConfig: { |
@@ -277,7 +284,7 @@ describe('Test video lives API validator', function () { | |||
277 | }) | 284 | }) |
278 | 285 | ||
279 | it('Should allow to save replay if enabled by the admin', async function () { | 286 | it('Should allow to save replay if enabled by the admin', async function () { |
280 | const fields = { ...baseCorrectParams, saveReplay: true } | 287 | const fields = { ...baseCorrectParams, saveReplay: true, replaySettings: { privacy: VideoPrivacy.PUBLIC } } |
281 | 288 | ||
282 | await server.config.updateCustomSubConfig({ | 289 | await server.config.updateCustomSubConfig({ |
283 | newConfig: { | 290 | newConfig: { |
@@ -464,6 +471,39 @@ describe('Test video lives API validator', function () { | |||
464 | await command.update({ videoId: video.id, fields, expectedStatus: HttpStatusCode.BAD_REQUEST_400 }) | 471 | await command.update({ videoId: video.id, fields, expectedStatus: HttpStatusCode.BAD_REQUEST_400 }) |
465 | }) | 472 | }) |
466 | 473 | ||
474 | it('Should fail with a bad privacy for replay settings', async function () { | ||
475 | const fields = { saveReplay: true, replaySettings: { privacy: 5 } } | ||
476 | |||
477 | await command.update({ videoId: video.id, fields, expectedStatus: HttpStatusCode.BAD_REQUEST_400 }) | ||
478 | }) | ||
479 | |||
480 | it('Should fail with save replay enabled but without replay settings', async function () { | ||
481 | await server.config.updateCustomSubConfig({ | ||
482 | newConfig: { | ||
483 | live: { | ||
484 | enabled: true, | ||
485 | allowReplay: true | ||
486 | } | ||
487 | } | ||
488 | }) | ||
489 | |||
490 | const fields = { saveReplay: true } | ||
491 | |||
492 | await command.update({ videoId: video.id, fields, expectedStatus: HttpStatusCode.BAD_REQUEST_400 }) | ||
493 | }) | ||
494 | |||
495 | it('Should fail with save replay disabled and replay settings', async function () { | ||
496 | const fields = { saveReplay: false, replaySettings: { privacy: VideoPrivacy.INTERNAL } } | ||
497 | |||
498 | await command.update({ videoId: video.id, fields, expectedStatus: HttpStatusCode.BAD_REQUEST_400 }) | ||
499 | }) | ||
500 | |||
501 | it('Should fail with only replay settings when save replay is disabled', async function () { | ||
502 | const fields = { replaySettings: { privacy: VideoPrivacy.INTERNAL } } | ||
503 | |||
504 | await command.update({ videoId: video.id, fields, expectedStatus: HttpStatusCode.BAD_REQUEST_400 }) | ||
505 | }) | ||
506 | |||
467 | it('Should fail to set latency if the server does not allow it', async function () { | 507 | it('Should fail to set latency if the server does not allow it', async function () { |
468 | const fields = { latencyMode: LiveVideoLatencyMode.HIGH_LATENCY } | 508 | const fields = { latencyMode: LiveVideoLatencyMode.HIGH_LATENCY } |
469 | 509 | ||
@@ -474,6 +514,9 @@ describe('Test video lives API validator', function () { | |||
474 | await command.update({ videoId: video.id, fields: { saveReplay: false } }) | 514 | await command.update({ videoId: video.id, fields: { saveReplay: false } }) |
475 | await command.update({ videoId: video.uuid, fields: { saveReplay: false } }) | 515 | await command.update({ videoId: video.uuid, fields: { saveReplay: false } }) |
476 | await command.update({ videoId: video.shortUUID, fields: { saveReplay: false } }) | 516 | await command.update({ videoId: video.shortUUID, fields: { saveReplay: false } }) |
517 | |||
518 | await command.update({ videoId: video.id, fields: { saveReplay: true, replaySettings: { privacy: VideoPrivacy.PUBLIC } } }) | ||
519 | |||
477 | }) | 520 | }) |
478 | 521 | ||
479 | it('Should fail to update replay status if replay is not allowed on the instance', async function () { | 522 | it('Should fail to update replay status if replay is not allowed on the instance', async function () { |
diff --git a/server/tests/api/live/live-constraints.ts b/server/tests/api/live/live-constraints.ts index c82585a9e..fabb8798d 100644 --- a/server/tests/api/live/live-constraints.ts +++ b/server/tests/api/live/live-constraints.ts | |||
@@ -24,10 +24,7 @@ describe('Test live constraints', function () { | |||
24 | let userAccessToken: string | 24 | let userAccessToken: string |
25 | let userChannelId: number | 25 | let userChannelId: number |
26 | 26 | ||
27 | async function createLiveWrapper (options: { | 27 | async function createLiveWrapper (options: { replay: boolean, permanent: boolean }) { |
28 | replay: boolean | ||
29 | permanent: boolean | ||
30 | }) { | ||
31 | const { replay, permanent } = options | 28 | const { replay, permanent } = options |
32 | 29 | ||
33 | const liveAttributes = { | 30 | const liveAttributes = { |
@@ -35,6 +32,7 @@ describe('Test live constraints', function () { | |||
35 | channelId: userChannelId, | 32 | channelId: userChannelId, |
36 | privacy: VideoPrivacy.PUBLIC, | 33 | privacy: VideoPrivacy.PUBLIC, |
37 | saveReplay: replay, | 34 | saveReplay: replay, |
35 | replaySettings: options.replay ? { privacy: VideoPrivacy.PUBLIC } : undefined, | ||
38 | permanentLive: permanent | 36 | permanentLive: permanent |
39 | } | 37 | } |
40 | 38 | ||
diff --git a/server/tests/api/live/live-fast-restream.ts b/server/tests/api/live/live-fast-restream.ts index 9e6d10dbd..4e30feaef 100644 --- a/server/tests/api/live/live-fast-restream.ts +++ b/server/tests/api/live/live-fast-restream.ts | |||
@@ -23,6 +23,7 @@ describe('Fast restream in live', function () { | |||
23 | privacy: VideoPrivacy.PUBLIC, | 23 | privacy: VideoPrivacy.PUBLIC, |
24 | name: 'my super live', | 24 | name: 'my super live', |
25 | saveReplay: options.replay, | 25 | saveReplay: options.replay, |
26 | replaySettings: options.replay ? { privacy: VideoPrivacy.PUBLIC } : undefined, | ||
26 | permanentLive: options.permanent | 27 | permanentLive: options.permanent |
27 | } | 28 | } |
28 | 29 | ||
diff --git a/server/tests/api/live/live-save-replay.ts b/server/tests/api/live/live-save-replay.ts index 8f17b4566..3a9a84f7e 100644 --- a/server/tests/api/live/live-save-replay.ts +++ b/server/tests/api/live/live-save-replay.ts | |||
@@ -27,7 +27,7 @@ describe('Save replay setting', function () { | |||
27 | let liveVideoUUID: string | 27 | let liveVideoUUID: string |
28 | let ffmpegCommand: FfmpegCommand | 28 | let ffmpegCommand: FfmpegCommand |
29 | 29 | ||
30 | async function createLiveWrapper (options: { permanent: boolean, replay: boolean }) { | 30 | async function createLiveWrapper (options: { permanent: boolean, replay: boolean, replaySettings?: { privacy: VideoPrivacy } }) { |
31 | if (liveVideoUUID) { | 31 | if (liveVideoUUID) { |
32 | try { | 32 | try { |
33 | await servers[0].videos.remove({ id: liveVideoUUID }) | 33 | await servers[0].videos.remove({ id: liveVideoUUID }) |
@@ -40,6 +40,7 @@ describe('Save replay setting', function () { | |||
40 | privacy: VideoPrivacy.PUBLIC, | 40 | privacy: VideoPrivacy.PUBLIC, |
41 | name: 'my super live', | 41 | name: 'my super live', |
42 | saveReplay: options.replay, | 42 | saveReplay: options.replay, |
43 | replaySettings: options.replaySettings, | ||
43 | permanentLive: options.permanent | 44 | permanentLive: options.permanent |
44 | } | 45 | } |
45 | 46 | ||
@@ -47,7 +48,7 @@ describe('Save replay setting', function () { | |||
47 | return uuid | 48 | return uuid |
48 | } | 49 | } |
49 | 50 | ||
50 | async function publishLive (options: { permanent: boolean, replay: boolean }) { | 51 | async function publishLive (options: { permanent: boolean, replay: boolean, replaySettings?: { privacy: VideoPrivacy } }) { |
51 | liveVideoUUID = await createLiveWrapper(options) | 52 | liveVideoUUID = await createLiveWrapper(options) |
52 | 53 | ||
53 | const ffmpegCommand = await servers[0].live.sendRTMPStreamInVideo({ videoId: liveVideoUUID }) | 54 | const ffmpegCommand = await servers[0].live.sendRTMPStreamInVideo({ videoId: liveVideoUUID }) |
@@ -61,7 +62,7 @@ describe('Save replay setting', function () { | |||
61 | return { ffmpegCommand, liveDetails } | 62 | return { ffmpegCommand, liveDetails } |
62 | } | 63 | } |
63 | 64 | ||
64 | async function publishLiveAndDelete (options: { permanent: boolean, replay: boolean }) { | 65 | async function publishLiveAndDelete (options: { permanent: boolean, replay: boolean, replaySettings?: { privacy: VideoPrivacy } }) { |
65 | const { ffmpegCommand, liveDetails } = await publishLive(options) | 66 | const { ffmpegCommand, liveDetails } = await publishLive(options) |
66 | 67 | ||
67 | await Promise.all([ | 68 | await Promise.all([ |
@@ -76,7 +77,7 @@ describe('Save replay setting', function () { | |||
76 | return { liveDetails } | 77 | return { liveDetails } |
77 | } | 78 | } |
78 | 79 | ||
79 | async function publishLiveAndBlacklist (options: { permanent: boolean, replay: boolean }) { | 80 | async function publishLiveAndBlacklist (options: { permanent: boolean, replay: boolean, replaySettings?: { privacy: VideoPrivacy } }) { |
80 | const { ffmpegCommand, liveDetails } = await publishLive(options) | 81 | const { ffmpegCommand, liveDetails } = await publishLive(options) |
81 | 82 | ||
82 | await Promise.all([ | 83 | await Promise.all([ |
@@ -112,6 +113,13 @@ describe('Save replay setting', function () { | |||
112 | } | 113 | } |
113 | } | 114 | } |
114 | 115 | ||
116 | async function checkVideoPrivacy (videoId: string, privacy: VideoPrivacy) { | ||
117 | for (const server of servers) { | ||
118 | const video = await server.videos.get({ id: videoId }) | ||
119 | expect(video.privacy.id).to.equal(privacy) | ||
120 | } | ||
121 | } | ||
122 | |||
115 | before(async function () { | 123 | before(async function () { |
116 | this.timeout(120000) | 124 | this.timeout(120000) |
117 | 125 | ||
@@ -247,12 +255,13 @@ describe('Save replay setting', function () { | |||
247 | it('Should correctly create and federate the "waiting for stream" live', async function () { | 255 | it('Should correctly create and federate the "waiting for stream" live', async function () { |
248 | this.timeout(20000) | 256 | this.timeout(20000) |
249 | 257 | ||
250 | liveVideoUUID = await createLiveWrapper({ permanent: false, replay: true }) | 258 | liveVideoUUID = await createLiveWrapper({ permanent: false, replay: true, replaySettings: { privacy: VideoPrivacy.UNLISTED } }) |
251 | 259 | ||
252 | await waitJobs(servers) | 260 | await waitJobs(servers) |
253 | 261 | ||
254 | await checkVideosExist(liveVideoUUID, false, HttpStatusCode.OK_200) | 262 | await checkVideosExist(liveVideoUUID, false, HttpStatusCode.OK_200) |
255 | await checkVideoState(liveVideoUUID, VideoState.WAITING_FOR_LIVE) | 263 | await checkVideoState(liveVideoUUID, VideoState.WAITING_FOR_LIVE) |
264 | await checkVideoPrivacy(liveVideoUUID, VideoPrivacy.PUBLIC) | ||
256 | }) | 265 | }) |
257 | 266 | ||
258 | it('Should correctly have updated the live and federated it when streaming in the live', async function () { | 267 | it('Should correctly have updated the live and federated it when streaming in the live', async function () { |
@@ -265,6 +274,7 @@ describe('Save replay setting', function () { | |||
265 | 274 | ||
266 | await checkVideosExist(liveVideoUUID, true, HttpStatusCode.OK_200) | 275 | await checkVideosExist(liveVideoUUID, true, HttpStatusCode.OK_200) |
267 | await checkVideoState(liveVideoUUID, VideoState.PUBLISHED) | 276 | await checkVideoState(liveVideoUUID, VideoState.PUBLISHED) |
277 | await checkVideoPrivacy(liveVideoUUID, VideoPrivacy.PUBLIC) | ||
268 | }) | 278 | }) |
269 | 279 | ||
270 | it('Should correctly have saved the live and federated it after the streaming', async function () { | 280 | it('Should correctly have saved the live and federated it after the streaming', async function () { |
@@ -274,6 +284,8 @@ describe('Save replay setting', function () { | |||
274 | expect(session.endDate).to.not.exist | 284 | expect(session.endDate).to.not.exist |
275 | expect(session.endingProcessed).to.be.false | 285 | expect(session.endingProcessed).to.be.false |
276 | expect(session.saveReplay).to.be.true | 286 | expect(session.saveReplay).to.be.true |
287 | expect(session.replaySettings).to.exist | ||
288 | expect(session.replaySettings.privacy).to.equal(VideoPrivacy.UNLISTED) | ||
277 | 289 | ||
278 | await stopFfmpeg(ffmpegCommand) | 290 | await stopFfmpeg(ffmpegCommand) |
279 | 291 | ||
@@ -281,8 +293,9 @@ describe('Save replay setting', function () { | |||
281 | await waitJobs(servers) | 293 | await waitJobs(servers) |
282 | 294 | ||
283 | // Live has been transcoded | 295 | // Live has been transcoded |
284 | await checkVideosExist(liveVideoUUID, true, HttpStatusCode.OK_200) | 296 | await checkVideosExist(liveVideoUUID, false, HttpStatusCode.OK_200) |
285 | await checkVideoState(liveVideoUUID, VideoState.PUBLISHED) | 297 | await checkVideoState(liveVideoUUID, VideoState.PUBLISHED) |
298 | await checkVideoPrivacy(liveVideoUUID, VideoPrivacy.UNLISTED) | ||
286 | }) | 299 | }) |
287 | 300 | ||
288 | it('Should find the replay live session', async function () { | 301 | it('Should find the replay live session', async function () { |
@@ -296,6 +309,8 @@ describe('Save replay setting', function () { | |||
296 | expect(session.error).to.not.exist | 309 | expect(session.error).to.not.exist |
297 | expect(session.saveReplay).to.be.true | 310 | expect(session.saveReplay).to.be.true |
298 | expect(session.endingProcessed).to.be.true | 311 | expect(session.endingProcessed).to.be.true |
312 | expect(session.replaySettings).to.exist | ||
313 | expect(session.replaySettings.privacy).to.equal(VideoPrivacy.UNLISTED) | ||
299 | 314 | ||
300 | expect(session.replayVideo).to.exist | 315 | expect(session.replayVideo).to.exist |
301 | expect(session.replayVideo.id).to.exist | 316 | expect(session.replayVideo.id).to.exist |
@@ -306,13 +321,14 @@ describe('Save replay setting', function () { | |||
306 | it('Should update the saved live and correctly federate the updated attributes', async function () { | 321 | it('Should update the saved live and correctly federate the updated attributes', async function () { |
307 | this.timeout(30000) | 322 | this.timeout(30000) |
308 | 323 | ||
309 | await servers[0].videos.update({ id: liveVideoUUID, attributes: { name: 'video updated' } }) | 324 | await servers[0].videos.update({ id: liveVideoUUID, attributes: { name: 'video updated', privacy: VideoPrivacy.PUBLIC } }) |
310 | await waitJobs(servers) | 325 | await waitJobs(servers) |
311 | 326 | ||
312 | for (const server of servers) { | 327 | for (const server of servers) { |
313 | const video = await server.videos.get({ id: liveVideoUUID }) | 328 | const video = await server.videos.get({ id: liveVideoUUID }) |
314 | expect(video.name).to.equal('video updated') | 329 | expect(video.name).to.equal('video updated') |
315 | expect(video.isLive).to.be.false | 330 | expect(video.isLive).to.be.false |
331 | expect(video.privacy.id).to.equal(VideoPrivacy.PUBLIC) | ||
316 | } | 332 | } |
317 | }) | 333 | }) |
318 | 334 | ||
@@ -323,7 +339,7 @@ describe('Save replay setting', function () { | |||
323 | it('Should correctly terminate the stream on blacklist and blacklist the saved replay video', async function () { | 339 | it('Should correctly terminate the stream on blacklist and blacklist the saved replay video', async function () { |
324 | this.timeout(120000) | 340 | this.timeout(120000) |
325 | 341 | ||
326 | await publishLiveAndBlacklist({ permanent: false, replay: true }) | 342 | await publishLiveAndBlacklist({ permanent: false, replay: true, replaySettings: { privacy: VideoPrivacy.PUBLIC } }) |
327 | 343 | ||
328 | await checkVideosExist(liveVideoUUID, false) | 344 | await checkVideosExist(liveVideoUUID, false) |
329 | 345 | ||
@@ -338,7 +354,7 @@ describe('Save replay setting', function () { | |||
338 | it('Should correctly terminate the stream on delete and delete the video', async function () { | 354 | it('Should correctly terminate the stream on delete and delete the video', async function () { |
339 | this.timeout(40000) | 355 | this.timeout(40000) |
340 | 356 | ||
341 | await publishLiveAndDelete({ permanent: false, replay: true }) | 357 | await publishLiveAndDelete({ permanent: false, replay: true, replaySettings: { privacy: VideoPrivacy.PUBLIC } }) |
342 | 358 | ||
343 | await checkVideosExist(liveVideoUUID, false, HttpStatusCode.NOT_FOUND_404) | 359 | await checkVideosExist(liveVideoUUID, false, HttpStatusCode.NOT_FOUND_404) |
344 | await checkLiveCleanup({ server: servers[0], videoUUID: liveVideoUUID, permanent: false }) | 360 | await checkLiveCleanup({ server: servers[0], videoUUID: liveVideoUUID, permanent: false }) |
@@ -348,103 +364,201 @@ describe('Save replay setting', function () { | |||
348 | describe('With save replay enabled on permanent live', function () { | 364 | describe('With save replay enabled on permanent live', function () { |
349 | let lastReplayUUID: string | 365 | let lastReplayUUID: string |
350 | 366 | ||
351 | it('Should correctly create and federate the "waiting for stream" live', async function () { | 367 | describe('With a first live and its replay', function () { |
352 | this.timeout(20000) | ||
353 | 368 | ||
354 | liveVideoUUID = await createLiveWrapper({ permanent: true, replay: true }) | 369 | it('Should correctly create and federate the "waiting for stream" live', async function () { |
370 | this.timeout(20000) | ||
355 | 371 | ||
356 | await waitJobs(servers) | 372 | liveVideoUUID = await createLiveWrapper({ permanent: true, replay: true, replaySettings: { privacy: VideoPrivacy.UNLISTED } }) |
357 | 373 | ||
358 | await checkVideosExist(liveVideoUUID, false, HttpStatusCode.OK_200) | 374 | await waitJobs(servers) |
359 | await checkVideoState(liveVideoUUID, VideoState.WAITING_FOR_LIVE) | ||
360 | }) | ||
361 | 375 | ||
362 | it('Should correctly have updated the live and federated it when streaming in the live', async function () { | 376 | await checkVideosExist(liveVideoUUID, false, HttpStatusCode.OK_200) |
363 | this.timeout(20000) | 377 | await checkVideoState(liveVideoUUID, VideoState.WAITING_FOR_LIVE) |
378 | await checkVideoPrivacy(liveVideoUUID, VideoPrivacy.PUBLIC) | ||
379 | }) | ||
364 | 380 | ||
365 | ffmpegCommand = await servers[0].live.sendRTMPStreamInVideo({ videoId: liveVideoUUID }) | 381 | it('Should correctly have updated the live and federated it when streaming in the live', async function () { |
366 | await waitUntilLivePublishedOnAllServers(servers, liveVideoUUID) | 382 | this.timeout(20000) |
367 | 383 | ||
368 | await waitJobs(servers) | 384 | ffmpegCommand = await servers[0].live.sendRTMPStreamInVideo({ videoId: liveVideoUUID }) |
385 | await waitUntilLivePublishedOnAllServers(servers, liveVideoUUID) | ||
369 | 386 | ||
370 | await checkVideosExist(liveVideoUUID, true, HttpStatusCode.OK_200) | 387 | await waitJobs(servers) |
371 | await checkVideoState(liveVideoUUID, VideoState.PUBLISHED) | ||
372 | }) | ||
373 | 388 | ||
374 | it('Should correctly have saved the live and federated it after the streaming', async function () { | 389 | await checkVideosExist(liveVideoUUID, true, HttpStatusCode.OK_200) |
375 | this.timeout(30000) | 390 | await checkVideoState(liveVideoUUID, VideoState.PUBLISHED) |
391 | await checkVideoPrivacy(liveVideoUUID, VideoPrivacy.PUBLIC) | ||
392 | }) | ||
376 | 393 | ||
377 | const liveDetails = await servers[0].videos.get({ id: liveVideoUUID }) | 394 | it('Should correctly have saved the live and federated it after the streaming', async function () { |
395 | this.timeout(30000) | ||
378 | 396 | ||
379 | await stopFfmpeg(ffmpegCommand) | 397 | const liveDetails = await servers[0].videos.get({ id: liveVideoUUID }) |
380 | 398 | ||
381 | await waitUntilLiveWaitingOnAllServers(servers, liveVideoUUID) | 399 | await stopFfmpeg(ffmpegCommand) |
382 | await waitJobs(servers) | ||
383 | 400 | ||
384 | const video = await findExternalSavedVideo(servers[0], liveDetails) | 401 | await waitUntilLiveWaitingOnAllServers(servers, liveVideoUUID) |
385 | expect(video).to.exist | 402 | await waitJobs(servers) |
386 | 403 | ||
387 | for (const server of servers) { | 404 | const video = await findExternalSavedVideo(servers[0], liveDetails) |
388 | await server.videos.get({ id: video.uuid }) | 405 | expect(video).to.exist |
389 | } | ||
390 | 406 | ||
391 | lastReplayUUID = video.uuid | 407 | for (const server of servers) { |
392 | }) | 408 | await server.videos.get({ id: video.uuid }) |
409 | } | ||
393 | 410 | ||
394 | it('Should have appropriate ended session and replay live session', async function () { | 411 | lastReplayUUID = video.uuid |
395 | const { data, total } = await servers[0].live.listSessions({ videoId: liveVideoUUID }) | 412 | }) |
396 | expect(total).to.equal(1) | ||
397 | expect(data).to.have.lengthOf(1) | ||
398 | 413 | ||
399 | const sessionFromLive = data[0] | 414 | it('Should have appropriate ended session and replay live session', async function () { |
400 | const sessionFromReplay = await servers[0].live.getReplaySession({ videoId: lastReplayUUID }) | 415 | const { data, total } = await servers[0].live.listSessions({ videoId: liveVideoUUID }) |
416 | expect(total).to.equal(1) | ||
417 | expect(data).to.have.lengthOf(1) | ||
401 | 418 | ||
402 | for (const session of [ sessionFromLive, sessionFromReplay ]) { | 419 | const sessionFromLive = data[0] |
403 | expect(session.startDate).to.exist | 420 | const sessionFromReplay = await servers[0].live.getReplaySession({ videoId: lastReplayUUID }) |
404 | expect(session.endDate).to.exist | ||
405 | 421 | ||
406 | expect(session.error).to.not.exist | 422 | for (const session of [ sessionFromLive, sessionFromReplay ]) { |
423 | expect(session.startDate).to.exist | ||
424 | expect(session.endDate).to.exist | ||
407 | 425 | ||
408 | expect(session.replayVideo).to.exist | 426 | expect(session.replaySettings).to.exist |
409 | expect(session.replayVideo.id).to.exist | 427 | expect(session.replaySettings.privacy).to.equal(VideoPrivacy.UNLISTED) |
410 | expect(session.replayVideo.shortUUID).to.exist | ||
411 | expect(session.replayVideo.uuid).to.equal(lastReplayUUID) | ||
412 | } | ||
413 | }) | ||
414 | 428 | ||
415 | it('Should have cleaned up the live files', async function () { | 429 | expect(session.error).to.not.exist |
416 | await checkLiveCleanup({ server: servers[0], videoUUID: liveVideoUUID, permanent: false }) | 430 | |
431 | expect(session.replayVideo).to.exist | ||
432 | expect(session.replayVideo.id).to.exist | ||
433 | expect(session.replayVideo.shortUUID).to.exist | ||
434 | expect(session.replayVideo.uuid).to.equal(lastReplayUUID) | ||
435 | } | ||
436 | }) | ||
437 | |||
438 | it('Should have the first live replay with correct settings', async function () { | ||
439 | await checkVideosExist(lastReplayUUID, false, HttpStatusCode.OK_200) | ||
440 | await checkVideoState(lastReplayUUID, VideoState.PUBLISHED) | ||
441 | await checkVideoPrivacy(lastReplayUUID, VideoPrivacy.UNLISTED) | ||
442 | }) | ||
417 | }) | 443 | }) |
418 | 444 | ||
419 | it('Should correctly terminate the stream on blacklist and blacklist the saved replay video', async function () { | 445 | describe('With a second live and its replay', function () { |
420 | this.timeout(120000) | 446 | it('Should update the replay settings', async function () { |
447 | await servers[0].live.update( | ||
448 | { videoId: liveVideoUUID, fields: { replaySettings: { privacy: VideoPrivacy.PUBLIC } } }) | ||
449 | await waitJobs(servers) | ||
450 | const live = await servers[0].live.get({ videoId: liveVideoUUID }) | ||
421 | 451 | ||
422 | await servers[0].videos.remove({ id: lastReplayUUID }) | 452 | expect(live.saveReplay).to.be.true |
423 | const { liveDetails } = await publishLiveAndBlacklist({ permanent: true, replay: true }) | 453 | expect(live.replaySettings).to.exist |
454 | expect(live.replaySettings.privacy).to.equal(VideoPrivacy.PUBLIC) | ||
424 | 455 | ||
425 | const replay = await findExternalSavedVideo(servers[0], liveDetails) | 456 | }) |
426 | expect(replay).to.exist | ||
427 | 457 | ||
428 | for (const videoId of [ liveVideoUUID, replay.uuid ]) { | 458 | it('Should correctly have updated the live and federated it when streaming in the live', async function () { |
429 | await checkVideosExist(videoId, false) | 459 | this.timeout(20000) |
430 | 460 | ||
431 | await servers[0].videos.get({ id: videoId, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 }) | 461 | ffmpegCommand = await servers[0].live.sendRTMPStreamInVideo({ videoId: liveVideoUUID }) |
432 | await servers[1].videos.get({ id: videoId, expectedStatus: HttpStatusCode.NOT_FOUND_404 }) | 462 | await waitUntilLivePublishedOnAllServers(servers, liveVideoUUID) |
433 | } | ||
434 | 463 | ||
435 | await checkLiveCleanup({ server: servers[0], videoUUID: liveVideoUUID, permanent: false }) | 464 | await waitJobs(servers) |
436 | }) | ||
437 | 465 | ||
438 | it('Should correctly terminate the stream on delete and not save the video', async function () { | 466 | await checkVideosExist(liveVideoUUID, true, HttpStatusCode.OK_200) |
439 | this.timeout(40000) | 467 | await checkVideoState(liveVideoUUID, VideoState.PUBLISHED) |
468 | await checkVideoPrivacy(liveVideoUUID, VideoPrivacy.PUBLIC) | ||
469 | }) | ||
440 | 470 | ||
441 | const { liveDetails } = await publishLiveAndDelete({ permanent: true, replay: true }) | 471 | it('Should correctly have saved the live and federated it after the streaming', async function () { |
472 | this.timeout(30000) | ||
473 | const liveDetails = await servers[0].videos.get({ id: liveVideoUUID }) | ||
442 | 474 | ||
443 | const replay = await findExternalSavedVideo(servers[0], liveDetails) | 475 | await stopFfmpeg(ffmpegCommand) |
444 | expect(replay).to.not.exist | ||
445 | 476 | ||
446 | await checkVideosExist(liveVideoUUID, false, HttpStatusCode.NOT_FOUND_404) | 477 | await waitUntilLiveWaitingOnAllServers(servers, liveVideoUUID) |
447 | await checkLiveCleanup({ server: servers[0], videoUUID: liveVideoUUID, permanent: false }) | 478 | await waitJobs(servers) |
479 | |||
480 | const video = await findExternalSavedVideo(servers[0], liveDetails) | ||
481 | expect(video).to.exist | ||
482 | |||
483 | for (const server of servers) { | ||
484 | await server.videos.get({ id: video.uuid }) | ||
485 | } | ||
486 | |||
487 | lastReplayUUID = video.uuid | ||
488 | }) | ||
489 | |||
490 | it('Should have appropriate ended session and replay live session', async function () { | ||
491 | const { data, total } = await servers[0].live.listSessions({ videoId: liveVideoUUID }) | ||
492 | expect(total).to.equal(2) | ||
493 | expect(data).to.have.lengthOf(2) | ||
494 | |||
495 | const sessionFromLive = data[1] | ||
496 | const sessionFromReplay = await servers[0].live.getReplaySession({ videoId: lastReplayUUID }) | ||
497 | |||
498 | for (const session of [ sessionFromLive, sessionFromReplay ]) { | ||
499 | expect(session.startDate).to.exist | ||
500 | expect(session.endDate).to.exist | ||
501 | |||
502 | expect(session.replaySettings).to.exist | ||
503 | expect(session.replaySettings.privacy).to.equal(VideoPrivacy.PUBLIC) | ||
504 | |||
505 | expect(session.error).to.not.exist | ||
506 | |||
507 | expect(session.replayVideo).to.exist | ||
508 | expect(session.replayVideo.id).to.exist | ||
509 | expect(session.replayVideo.shortUUID).to.exist | ||
510 | expect(session.replayVideo.uuid).to.equal(lastReplayUUID) | ||
511 | } | ||
512 | }) | ||
513 | |||
514 | it('Should have the first live replay with correct settings', async function () { | ||
515 | await checkVideosExist(lastReplayUUID, true, HttpStatusCode.OK_200) | ||
516 | await checkVideoState(lastReplayUUID, VideoState.PUBLISHED) | ||
517 | await checkVideoPrivacy(lastReplayUUID, VideoPrivacy.PUBLIC) | ||
518 | }) | ||
519 | |||
520 | it('Should have cleaned up the live files', async function () { | ||
521 | await checkLiveCleanup({ server: servers[0], videoUUID: liveVideoUUID, permanent: false }) | ||
522 | }) | ||
523 | |||
524 | it('Should correctly terminate the stream on blacklist and blacklist the saved replay video', async function () { | ||
525 | this.timeout(120000) | ||
526 | |||
527 | await servers[0].videos.remove({ id: lastReplayUUID }) | ||
528 | const { liveDetails } = await publishLiveAndBlacklist({ | ||
529 | permanent: true, | ||
530 | replay: true, | ||
531 | replaySettings: { privacy: VideoPrivacy.PUBLIC } | ||
532 | }) | ||
533 | |||
534 | const replay = await findExternalSavedVideo(servers[0], liveDetails) | ||
535 | expect(replay).to.exist | ||
536 | |||
537 | for (const videoId of [ liveVideoUUID, replay.uuid ]) { | ||
538 | await checkVideosExist(videoId, false) | ||
539 | |||
540 | await servers[0].videos.get({ id: videoId, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 }) | ||
541 | await servers[1].videos.get({ id: videoId, expectedStatus: HttpStatusCode.NOT_FOUND_404 }) | ||
542 | } | ||
543 | |||
544 | await checkLiveCleanup({ server: servers[0], videoUUID: liveVideoUUID, permanent: false }) | ||
545 | }) | ||
546 | |||
547 | it('Should correctly terminate the stream on delete and not save the video', async function () { | ||
548 | this.timeout(40000) | ||
549 | |||
550 | const { liveDetails } = await publishLiveAndDelete({ | ||
551 | permanent: true, | ||
552 | replay: true, | ||
553 | replaySettings: { privacy: VideoPrivacy.PUBLIC } | ||
554 | }) | ||
555 | |||
556 | const replay = await findExternalSavedVideo(servers[0], liveDetails) | ||
557 | expect(replay).to.not.exist | ||
558 | |||
559 | await checkVideosExist(liveVideoUUID, false, HttpStatusCode.NOT_FOUND_404) | ||
560 | await checkLiveCleanup({ server: servers[0], videoUUID: liveVideoUUID, permanent: false }) | ||
561 | }) | ||
448 | }) | 562 | }) |
449 | }) | 563 | }) |
450 | 564 | ||
diff --git a/server/tests/api/live/live.ts b/server/tests/api/live/live.ts index 003cc934f..ceb606af1 100644 --- a/server/tests/api/live/live.ts +++ b/server/tests/api/live/live.ts | |||
@@ -87,6 +87,7 @@ describe('Test live', function () { | |||
87 | commentsEnabled: false, | 87 | commentsEnabled: false, |
88 | downloadEnabled: false, | 88 | downloadEnabled: false, |
89 | saveReplay: true, | 89 | saveReplay: true, |
90 | replaySettings: { privacy: VideoPrivacy.PUBLIC }, | ||
90 | latencyMode: LiveVideoLatencyMode.SMALL_LATENCY, | 91 | latencyMode: LiveVideoLatencyMode.SMALL_LATENCY, |
91 | privacy: VideoPrivacy.PUBLIC, | 92 | privacy: VideoPrivacy.PUBLIC, |
92 | previewfile: 'video_short1-preview.webm.jpg', | 93 | previewfile: 'video_short1-preview.webm.jpg', |
@@ -128,6 +129,9 @@ describe('Test live', function () { | |||
128 | if (server.url === servers[0].url) { | 129 | if (server.url === servers[0].url) { |
129 | expect(live.rtmpUrl).to.equal('rtmp://' + server.hostname + ':' + servers[0].rtmpPort + '/live') | 130 | expect(live.rtmpUrl).to.equal('rtmp://' + server.hostname + ':' + servers[0].rtmpPort + '/live') |
130 | expect(live.streamKey).to.not.be.empty | 131 | expect(live.streamKey).to.not.be.empty |
132 | |||
133 | expect(live.replaySettings).to.exist | ||
134 | expect(live.replaySettings.privacy).to.equal(VideoPrivacy.PUBLIC) | ||
131 | } else { | 135 | } else { |
132 | expect(live.rtmpUrl).to.not.exist | 136 | expect(live.rtmpUrl).to.not.exist |
133 | expect(live.streamKey).to.not.exist | 137 | expect(live.streamKey).to.not.exist |
@@ -196,6 +200,7 @@ describe('Test live', function () { | |||
196 | } | 200 | } |
197 | 201 | ||
198 | expect(live.saveReplay).to.be.false | 202 | expect(live.saveReplay).to.be.false |
203 | expect(live.replaySettings).to.not.exist | ||
199 | expect(live.latencyMode).to.equal(LiveVideoLatencyMode.DEFAULT) | 204 | expect(live.latencyMode).to.equal(LiveVideoLatencyMode.DEFAULT) |
200 | } | 205 | } |
201 | }) | 206 | }) |
@@ -366,7 +371,10 @@ describe('Test live', function () { | |||
366 | name: 'live video', | 371 | name: 'live video', |
367 | channelId: servers[0].store.channel.id, | 372 | channelId: servers[0].store.channel.id, |
368 | privacy: VideoPrivacy.PUBLIC, | 373 | privacy: VideoPrivacy.PUBLIC, |
369 | saveReplay | 374 | saveReplay, |
375 | replaySettings: saveReplay | ||
376 | ? { privacy: VideoPrivacy.PUBLIC } | ||
377 | : undefined | ||
370 | } | 378 | } |
371 | 379 | ||
372 | const { uuid } = await commands[0].create({ fields: liveAttributes }) | 380 | const { uuid } = await commands[0].create({ fields: liveAttributes }) |
@@ -670,6 +678,9 @@ describe('Test live', function () { | |||
670 | channelId: servers[0].store.channel.id, | 678 | channelId: servers[0].store.channel.id, |
671 | privacy: VideoPrivacy.PUBLIC, | 679 | privacy: VideoPrivacy.PUBLIC, |
672 | saveReplay: options.saveReplay, | 680 | saveReplay: options.saveReplay, |
681 | replaySettings: options.saveReplay | ||
682 | ? { privacy: VideoPrivacy.PUBLIC } | ||
683 | : undefined, | ||
673 | permanentLive: options.permanent | 684 | permanentLive: options.permanent |
674 | } | 685 | } |
675 | 686 | ||
diff --git a/server/tests/api/notifications/user-notifications.ts b/server/tests/api/notifications/user-notifications.ts index f945cb6a8..7a8a234c2 100644 --- a/server/tests/api/notifications/user-notifications.ts +++ b/server/tests/api/notifications/user-notifications.ts | |||
@@ -342,6 +342,7 @@ describe('Test user notifications', function () { | |||
342 | privacy: VideoPrivacy.PUBLIC, | 342 | privacy: VideoPrivacy.PUBLIC, |
343 | channelId: servers[1].store.channel.id, | 343 | channelId: servers[1].store.channel.id, |
344 | saveReplay: true, | 344 | saveReplay: true, |
345 | replaySettings: { privacy: VideoPrivacy.PUBLIC }, | ||
345 | permanentLive: false | 346 | permanentLive: false |
346 | } | 347 | } |
347 | }) | 348 | }) |
@@ -367,6 +368,7 @@ describe('Test user notifications', function () { | |||
367 | privacy: VideoPrivacy.PUBLIC, | 368 | privacy: VideoPrivacy.PUBLIC, |
368 | channelId: servers[1].store.channel.id, | 369 | channelId: servers[1].store.channel.id, |
369 | saveReplay: true, | 370 | saveReplay: true, |
371 | replaySettings: { privacy: VideoPrivacy.PUBLIC }, | ||
370 | permanentLive: true | 372 | permanentLive: true |
371 | } | 373 | } |
372 | }) | 374 | }) |
diff --git a/server/tests/api/object-storage/live.ts b/server/tests/api/object-storage/live.ts index 2a3fc4779..588e0a8d7 100644 --- a/server/tests/api/object-storage/live.ts +++ b/server/tests/api/object-storage/live.ts | |||
@@ -27,6 +27,7 @@ async function createLive (server: PeerTubeServer, permanent: boolean) { | |||
27 | privacy: VideoPrivacy.PUBLIC, | 27 | privacy: VideoPrivacy.PUBLIC, |
28 | name: 'my super live', | 28 | name: 'my super live', |
29 | saveReplay: true, | 29 | saveReplay: true, |
30 | replaySettings: { privacy: VideoPrivacy.PUBLIC }, | ||
30 | permanentLive: permanent | 31 | permanentLive: permanent |
31 | } | 32 | } |
32 | 33 | ||
diff --git a/server/tests/api/object-storage/video-static-file-privacy.ts b/server/tests/api/object-storage/video-static-file-privacy.ts index 869d437d5..930c88543 100644 --- a/server/tests/api/object-storage/video-static-file-privacy.ts +++ b/server/tests/api/object-storage/video-static-file-privacy.ts | |||
@@ -305,13 +305,21 @@ describe('Object storage for video static file privacy', function () { | |||
305 | }) | 305 | }) |
306 | 306 | ||
307 | { | 307 | { |
308 | const { video, live } = await server.live.quickCreate({ saveReplay: true, permanentLive: false, privacy: VideoPrivacy.PRIVATE }) | 308 | const { video, live } = await server.live.quickCreate({ |
309 | saveReplay: true, | ||
310 | permanentLive: false, | ||
311 | privacy: VideoPrivacy.PRIVATE | ||
312 | }) | ||
309 | normalLiveId = video.uuid | 313 | normalLiveId = video.uuid |
310 | normalLive = live | 314 | normalLive = live |
311 | } | 315 | } |
312 | 316 | ||
313 | { | 317 | { |
314 | const { video, live } = await server.live.quickCreate({ saveReplay: true, permanentLive: true, privacy: VideoPrivacy.PRIVATE }) | 318 | const { video, live } = await server.live.quickCreate({ |
319 | saveReplay: true, | ||
320 | permanentLive: true, | ||
321 | privacy: VideoPrivacy.PRIVATE | ||
322 | }) | ||
315 | permanentLiveId = video.uuid | 323 | permanentLiveId = video.uuid |
316 | permanentLive = live | 324 | permanentLive = live |
317 | } | 325 | } |
diff --git a/server/tests/api/videos/video-static-file-privacy.ts b/server/tests/api/videos/video-static-file-privacy.ts index 16530884e..2dcfbbc57 100644 --- a/server/tests/api/videos/video-static-file-privacy.ts +++ b/server/tests/api/videos/video-static-file-privacy.ts | |||
@@ -364,13 +364,21 @@ describe('Test video static file privacy', function () { | |||
364 | }) | 364 | }) |
365 | 365 | ||
366 | { | 366 | { |
367 | const { video, live } = await server.live.quickCreate({ saveReplay: true, permanentLive: false, privacy: VideoPrivacy.PRIVATE }) | 367 | const { video, live } = await server.live.quickCreate({ |
368 | saveReplay: true, | ||
369 | permanentLive: false, | ||
370 | privacy: VideoPrivacy.PRIVATE | ||
371 | }) | ||
368 | normalLiveId = video.uuid | 372 | normalLiveId = video.uuid |
369 | normalLive = live | 373 | normalLive = live |
370 | } | 374 | } |
371 | 375 | ||
372 | { | 376 | { |
373 | const { video, live } = await server.live.quickCreate({ saveReplay: true, permanentLive: true, privacy: VideoPrivacy.PRIVATE }) | 377 | const { video, live } = await server.live.quickCreate({ |
378 | saveReplay: true, | ||
379 | permanentLive: true, | ||
380 | privacy: VideoPrivacy.PRIVATE | ||
381 | }) | ||
374 | permanentLiveId = video.uuid | 382 | permanentLiveId = video.uuid |
375 | permanentLive = live | 383 | permanentLive = live |
376 | } | 384 | } |