Skip to content

Commit

Permalink
test: Add unit tests for SmartTV seek behavior
Browse files Browse the repository at this point in the history
- Added tests in `controls.test.js` to verify UI updates (progress bar & current-time display)
- Added tests in `player.test.js` to validate SmartTV seek logic
- Ensured `stepForward()` and `stepBack()` correctly update `pendingSeekTime`
- Verified `handleAction()` finalizes the seek and resets `pendingSeekTime`
- Fixed test for `disableSeekWhileScrubbingOnSTV = false` by recreating `SeekBar` instance
  • Loading branch information
Borut Zizmond committed Feb 20, 2025
1 parent ebf0a44 commit 948c275
Show file tree
Hide file tree
Showing 2 changed files with 209 additions and 3 deletions.
103 changes: 101 additions & 2 deletions test/unit/controls.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -320,11 +320,11 @@ QUnit.test('Seek bar percent should represent scrub location if we are scrubbing
const seekBar = player.controlBar.progressControl.seekBar;

player.duration(100);
seekBar.pendingSeekTime_ = 20;
seekBar.pendingSeekTime(20);

assert.equal(seekBar.getPercent(), 0.2, 'seek bar percent set correctly to pending seek time');

seekBar.pendingSeekTime_ = 50;
seekBar.pendingSeekTime(50);

assert.equal(seekBar.getPercent(), 0.5, 'seek bar percent set correctly to next pending seek time');
});
Expand Down Expand Up @@ -680,3 +680,102 @@ QUnit.test('Remaing time negative sign can be optional', function(assert) {
rtd2.dispose();
player.dispose();
});

QUnit.module('SmartTV UI Updates (Progress Bar & Time Display)', function(hooks) {
let player;
let seekBar;
let currentTimeDisplay;

hooks.beforeEach(function() {
player = TestHelpers.makePlayer({
disableSeekWhileScrubbingOnSTV: true,
controlBar: {
progressControl: {
seekBar: {
stepSeconds: 5
}
}
}
});

seekBar = player.controlBar.progressControl.seekBar;
currentTimeDisplay = player.controlBar.getChild('currentTimeDisplay');

player.duration(100);
});

hooks.afterEach(function() {
player.dispose();
});

QUnit.test('Step forward updates seek bar progress and current-time display', function(assert) {
player.currentTime(40);
seekBar.stepForward();

assert.equal(
seekBar.pendingSeekTime(),
45,
'pendingSeekTime should be 45 (40 + 5) after stepForward'
);

assert.equal(
seekBar.getPercent(),
0.45,
'Seek bar progress should reflect 45% progress after stepForward'
);

assert.equal(
currentTimeDisplay.formattedTime_,
'0:45',
'Current-time-display should update to 45s after stepForward'
);
});

QUnit.test('Step back updates seek bar progress and current-time display', function(assert) {
player.currentTime(40);
seekBar.stepBack();

assert.equal(
seekBar.pendingSeekTime(),
35,
'pendingSeekTime should be 35 (40 - 5) after stepBack'
);

assert.equal(
seekBar.getPercent(),
0.35,
'Seek bar progress should reflect 35% progress after stepBack'
);

assert.equal(
currentTimeDisplay.formattedTime_,
'0:35',
'Current-time-display should update to 35s after stepBack'
);
});

QUnit.test('Pressing enter finalizes the seek and updates UI', function(assert) {
player.currentTime(40);
seekBar.stepForward();

seekBar.handleAction();

assert.equal(
seekBar.pendingSeekTime(),
null,
'pendingSeekTime should be reset to null after seeking'
);

assert.equal(
seekBar.getPercent(),
0.45,
'Seek bar progress should remain at 45% after seeking'
);

assert.equal(
currentTimeDisplay.formattedTime_,
'0:45',
'Current-time-display should remain at 45s after seeking'
);
});
});
109 changes: 108 additions & 1 deletion test/unit/player.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import * as middleware from '../../src/js/tech/middleware.js';
import * as Events from '../../src/js/utils/events.js';
import pkg from '../../package.json';
import * as Guid from '../../src/js/utils/guid.js';
import SeekBar from '../../src/js/control-bar/progress-control/seek-bar';

QUnit.module('Player', {
beforeEach() {
Expand Down Expand Up @@ -3731,7 +3732,7 @@ QUnit.test('Seek should occur when scrubbing completes on mobile when disableSee
// Simulate a source loaded
player.duration(10);

seekBar.pendingSeekTime_ = targetSeekTime;
seekBar.pendingSeekTime(targetSeekTime);

// Simulate scrubbing completion
seekBar.handleMouseUp();
Expand Down Expand Up @@ -3848,3 +3849,109 @@ QUnit.test('removeSourceElement returns false if no tech', function(assert) {
assert.notOk(removed, 'Returned false');
player.dispose();
});

QUnit.module('SmartTV Seek Logic', function(hooks) {
let player;
let seekBar;

hooks.beforeEach(function() {
player = TestHelpers.makePlayer({
disableSeekWhileScrubbingOnSTV: true,
controlBar: {
progressControl: {
seekBar: {
stepSeconds: 5
}
}
}
});

seekBar = player.controlBar.progressControl.seekBar;
player.duration(100);
});

hooks.afterEach(function() {
player.dispose();
});

QUnit.test('Step forward updates pendingSeekTime but does not seek immediately', function(assert) {
player.currentTime(40);
seekBar.stepForward();

assert.equal(
seekBar.pendingSeekTime(),
45,
'pendingSeekTime should be 45 (40 + 5) after stepForward'
);

assert.equal(
player.currentTime(),
40,
'Player currentTime remains unchanged (no immediate seek)'
);
});

QUnit.test('Step back updates pendingSeekTime but does not seek immediately', function(assert) {
player.currentTime(40);
seekBar.stepBack();

assert.equal(
seekBar.pendingSeekTime(),
35,
'pendingSeekTime should be 35 (40 - 5) after stepBack'
);

assert.equal(
player.currentTime(),
40,
'Player currentTime remains unchanged (no immediate seek)'
);
});

QUnit.test('Pressing Enter seeks to pendingSeekTime and resets it', function(assert) {
seekBar.pendingSeekTime(50);

const userSeekSpy = sinon.spy(seekBar, 'userSeek_');

seekBar.handleAction();

assert.ok(
userSeekSpy.calledWith(50),
'Pressing Enter should trigger seek to pendingSeekTime (50)'
);

assert.equal(
seekBar.pendingSeekTime(),
null,
'pendingSeekTime should be reset to null after seeking'
);

assert.equal(
player.currentTime(),
50,
'Player currentTime should be updated to 50 after pressing Enter'
);
});

QUnit.test('Step forward/back seeks immediately when disableSeekWhileScrubbingOnSTV is false', function(assert) {
player.options_.disableSeekWhileScrubbingOnSTV = false;
seekBar = new SeekBar(player);
player.currentTime(40);

seekBar.stepForward();

assert.equal(
player.currentTime(),
45,
'Player currentTime should update immediately when stepping forward'
);

seekBar.stepBack();

assert.equal(
player.currentTime(),
40,
'Player currentTime should update immediately when stepping back'
);
});
});

0 comments on commit 948c275

Please sign in to comment.