From 686e271bb91c444e0b1ce1659756e92beb9c7e51 Mon Sep 17 00:00:00 2001 From: Sebastian Piquerez Date: Mon, 22 Sep 2025 15:57:50 -0300 Subject: [PATCH 1/2] test: implement switch back to main content unit test --- src/streaming/MediaManager.js | 5 +++ .../test/streaming/streaming.MediaManager.js | 35 +++++++++++++++---- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/streaming/MediaManager.js b/src/streaming/MediaManager.js index aa12691c05..d7424c7209 100644 --- a/src/streaming/MediaManager.js +++ b/src/streaming/MediaManager.js @@ -231,6 +231,11 @@ function MediaManager() { logger.debug('Switch already in progress - ignoring request'); return }; + + if (!altPlayer) { + logger.warn('No alternative player to switch back from'); + return; + } logger.info('Switching back to main content'); isSwitching = true; diff --git a/test/unit/test/streaming/streaming.MediaManager.js b/test/unit/test/streaming/streaming.MediaManager.js index b4be56eec2..a3fad315dd 100644 --- a/test/unit/test/streaming/streaming.MediaManager.js +++ b/test/unit/test/streaming/streaming.MediaManager.js @@ -32,7 +32,7 @@ describe('MediaManager', function () { } }); - describe('setAlternativeVideoElement', function () { + describe('set the alternative video element', function () { it('should not throw error when setting alternative video element', function () { const mockVideoElement = videoModelMock.getElement(); @@ -42,7 +42,7 @@ describe('MediaManager', function () { }); }); - describe('prebufferAlternativeContent', function () { + describe('prebuffer the alternative content', function () { it('should start prebuffering alternative content and log the action', function () { const testUrl = 'http://test.mpd'; const testPlayerId = 'testPlayer'; @@ -53,7 +53,7 @@ describe('MediaManager', function () { }); }); - describe('switchToAlternativeContent', function () { + describe('switch to the alternative content', function () { beforeEach(function () { const mockVideoElement = videoModelMock.getElement(); mediaManager.setAlternativeVideoElement(mockVideoElement); @@ -73,8 +73,6 @@ describe('MediaManager', function () { const testPlayerId = 'testPlayer'; mediaManager.prebufferAlternativeContent(testPlayerId, testUrl); - expect(debugMock.log.info).to.equal(`Starting prebuffering for player ${testPlayerId}`); - mediaManager.switchToAlternativeContent(testPlayerId, testUrl); expect(debugMock.log.info).to.equal(`Alternative content playback started for player ${testPlayerId}`); }); @@ -91,7 +89,7 @@ describe('MediaManager', function () { }); }); - describe('getAlternativePlayer', function () { + describe('get alternative player', function () { beforeEach(function () { const mockVideoElement = videoModelMock.getElement(); mediaManager.setAlternativeVideoElement(mockVideoElement); @@ -113,4 +111,29 @@ describe('MediaManager', function () { expect(result).to.be.an('object'); }); }); + + describe('switch back to the main content', function () { + beforeEach(function () { + const mockVideoElement = videoModelMock.getElement(); + mediaManager.setAlternativeVideoElement(mockVideoElement); + }); + + it('should warn when no alternative player is set', function () { + mediaManager.switchBackToMainContent(10); + + expect(debugMock.log.warn).to.equal('No alternative player to switch back from'); + }); + + it('should switch back to main content', function () { + const testUrl = 'http://test.mpd'; + const testPlayerId = 'testPlayer'; + const seekTime = 20; + + mediaManager.switchToAlternativeContent(testPlayerId, testUrl, 0); + mediaManager.switchBackToMainContent(seekTime); + + expect(debugMock.log.info).to.equal('Main content playback resumed'); + expect(mediaManager.getAlternativePlayer()).to.be.null; + }); + }); }); \ No newline at end of file From 8fdbd8d3e5794c68b333b656eca68ed19f549f24 Mon Sep 17 00:00:00 2001 From: Sebastian Piquerez Date: Mon, 22 Sep 2025 17:21:45 -0300 Subject: [PATCH 2/2] test: Improve MediaManager unit test and add switchBackToMain contet tests --- src/streaming/MediaManager.js | 6 +--- test/unit/mocks/VideoModelMock.js | 5 +++ .../test/streaming/streaming.MediaManager.js | 31 ++++++++++++++----- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/streaming/MediaManager.js b/src/streaming/MediaManager.js index d7424c7209..2700ae737c 100644 --- a/src/streaming/MediaManager.js +++ b/src/streaming/MediaManager.js @@ -108,7 +108,7 @@ function MediaManager() { function prebufferAlternativeContent(playerId, alternativeMpdUrl) { try { if (prebufferedPlayers.has(playerId)) { - return; // Already prebuffered + return; } logger.info(`Starting prebuffering for player ${playerId}`); @@ -150,10 +150,6 @@ function MediaManager() { prebufferedPlayer.player.off(Events.ERROR); prebufferedPlayer.player.reset(); - if (prebufferedPlayer.videoElement && prebufferedPlayer.videoElement?.parentNode) { - prebufferedPlayer.videoElement.parentNode?.removeChild(prebufferedPlayer.videoElement); - } - prebufferedPlayers.delete(playerId); } logger.debug(`Cleaned up prebuffered content for ${playerId}`); diff --git a/test/unit/mocks/VideoModelMock.js b/test/unit/mocks/VideoModelMock.js index a1f64c0ec1..2ff7095355 100644 --- a/test/unit/mocks/VideoModelMock.js +++ b/test/unit/mocks/VideoModelMock.js @@ -111,9 +111,14 @@ class VideoModelMock { } pause() { + this.isplaying = false; this.ispaused = true; } + isPlaying() { + return this.isplaying; + } + isPaused() { return this.ispaused; } diff --git a/test/unit/test/streaming/streaming.MediaManager.js b/test/unit/test/streaming/streaming.MediaManager.js index a3fad315dd..4fb1062304 100644 --- a/test/unit/test/streaming/streaming.MediaManager.js +++ b/test/unit/test/streaming/streaming.MediaManager.js @@ -5,16 +5,18 @@ import DebugMock from '../../mocks/DebugMock.js'; import { expect } from 'chai'; describe('MediaManager', function () { - const mediaManager = MediaManager().getInstance(); + let mediaManager; let videoModelMock; + let mockVideoElement; let playbackControllerMock; let debugMock; beforeEach(function () { + mediaManager = MediaManager().getInstance(); videoModelMock = new VideoModelMock(); + videoModelMock.play(); playbackControllerMock = new PlaybackControllerMock(); debugMock = new DebugMock(); - mediaManager.setConfig({ videoModel: videoModelMock, playbackController: playbackControllerMock, @@ -34,7 +36,7 @@ describe('MediaManager', function () { describe('set the alternative video element', function () { it('should not throw error when setting alternative video element', function () { - const mockVideoElement = videoModelMock.getElement(); + mockVideoElement = document.createElement('video'); expect(() => { mediaManager.setAlternativeVideoElement(mockVideoElement); @@ -47,7 +49,9 @@ describe('MediaManager', function () { const testUrl = 'http://test.mpd'; const testPlayerId = 'testPlayer'; - mediaManager.prebufferAlternativeContent(testPlayerId, testUrl); + expect(() => { + mediaManager.prebufferAlternativeContent(testPlayerId, testUrl); + }).to.not.throw(); expect(debugMock.log.info).to.equal(`Starting prebuffering for player ${testPlayerId}`); }); @@ -55,7 +59,7 @@ describe('MediaManager', function () { describe('switch to the alternative content', function () { beforeEach(function () { - const mockVideoElement = videoModelMock.getElement(); + mockVideoElement = document.createElement('video'); mediaManager.setAlternativeVideoElement(mockVideoElement); }); @@ -66,6 +70,9 @@ describe('MediaManager', function () { mediaManager.switchToAlternativeContent(testPlayerId, testUrl); expect(debugMock.log.info).to.equal(`Alternative content playback started for player ${testPlayerId}`); + expect(videoModelMock.isPaused()).to.be.true; + expect(mockVideoElement.style.display).to.be.equal('block'); + expect(videoModelMock.getElement().style.display).to.be.equal('none'); }); it('should switch to alternative content with prebuffered content', function () { @@ -74,7 +81,11 @@ describe('MediaManager', function () { mediaManager.prebufferAlternativeContent(testPlayerId, testUrl); mediaManager.switchToAlternativeContent(testPlayerId, testUrl); + expect(debugMock.log.info).to.equal(`Alternative content playback started for player ${testPlayerId}`); + expect(videoModelMock.isPaused()).to.be.true; + expect(mockVideoElement.style.display).to.be.equal('block'); + expect(videoModelMock.getElement().style.display).to.be.equal('none'); }); it('should switch to alternative content and seek to a given time', function () { @@ -86,18 +97,21 @@ describe('MediaManager', function () { expect(debugMock.log.debug).to.equal(`Seeking alternative content to time: ${testTime}`); expect(debugMock.log.info).to.equal(`Alternative content playback started for player ${testPlayerId}`); + expect(videoModelMock.isPaused()).to.be.true; + expect(mockVideoElement.style.display).to.be.equal('block'); + expect(videoModelMock.getElement().style.display).to.be.equal('none'); }); }); describe('get alternative player', function () { beforeEach(function () { - const mockVideoElement = videoModelMock.getElement(); + mockVideoElement = document.createElement('video'); mediaManager.setAlternativeVideoElement(mockVideoElement); }); it('should return null when no alternative player is set', function () { const result = mediaManager.getAlternativePlayer(); - expect(result).to.be.null; + expect(result).to.be.undefined; }); it('should return the alternative player when it is set', function () { @@ -114,7 +128,7 @@ describe('MediaManager', function () { describe('switch back to the main content', function () { beforeEach(function () { - const mockVideoElement = videoModelMock.getElement(); + mockVideoElement = document.createElement('video'); mediaManager.setAlternativeVideoElement(mockVideoElement); }); @@ -134,6 +148,7 @@ describe('MediaManager', function () { expect(debugMock.log.info).to.equal('Main content playback resumed'); expect(mediaManager.getAlternativePlayer()).to.be.null; + expect(videoModelMock.isPlaying()).to.be.true; }); }); }); \ No newline at end of file