Files
edx-platform/xmodule/js/spec/video/video_progress_slider_spec.js
Syed Ali Abbas Zaidi 8480dbc228 chore: apply amnesty on existing not fixable issues (#32215)
* fix: eslint operator-linebreak issue

* fix: eslint quotes issue

* fix: react jsx indent and props issues

* fix: eslint trailing spaces issues

* fix: eslint line around directives issue

* fix: eslint semi rule

* fix: eslint newline per chain rule

* fix: eslint space infix ops rule

* fix: eslint space-in-parens issue

* fix: eslint space before function paren issue

* fix: eslint space before blocks issue

* fix: eslint arrow body style issue

* fix: eslint dot-location issue

* fix: eslint quotes issue

* fix: eslint quote props issue

* fix: eslint operator assignment issue

* fix: eslint new line after import issue

* fix: indent issues

* fix: operator assignment issue

* fix: all autofixable eslint issues

* fix: all react related fixable issues

* fix: autofixable eslint issues

* chore: remove all template literals

* fix: remaining autofixable issues

* chore: apply amnesty on all existing issues

* fix: failing xss-lint issues

* refactor: apply amnesty on remaining issues

* refactor: apply amnesty on new issues

* fix: remove file level suppressions

* refactor: apply amnesty on new issues
2023-08-07 19:13:19 +05:00

327 lines
11 KiB
JavaScript

// eslint-disable-next-line no-shadow-restricted-names
(function(undefined) {
describe('VideoProgressSlider', function() {
var state, oldOTBD;
beforeEach(function() {
oldOTBD = window.onTouchBasedDevice;
window.onTouchBasedDevice = jasmine.createSpy('onTouchBasedDevice')
.and.returnValue(null);
});
afterEach(function() {
$('source').remove();
window.onTouchBasedDevice = oldOTBD;
state.storage.clear();
state.videoPlayer.destroy();
});
describe('constructor', function() {
describe('on a non-touch based device', function() {
beforeEach(function() {
spyOn($.fn, 'slider').and.callThrough();
state = jasmine.initializePlayer();
});
it('build the slider', function() {
expect($('.slider').toArray()).toContain(state.videoProgressSlider.slider);
expect($.fn.slider).toHaveBeenCalledWith({
range: 'min',
min: 0,
max: null,
slide: state.videoProgressSlider.onSlide,
stop: state.videoProgressSlider.onStop,
step: 5
});
});
it('build the seek handle', function() {
expect($('.ui-slider-handle').toArray())
.toContain(state.videoProgressSlider.handle);
});
it('add ARIA attributes to time control', function() {
var $timeControl = $('div.slider > .progress-handle');
expect($timeControl).toHaveAttrs({
role: 'slider',
'aria-label': 'Video position. Press space to toggle playback',
'aria-disabled': 'false'
});
expect($timeControl).toHaveAttr('aria-valuetext');
});
});
describe('on a touch-based device', function() {
it('does not build the slider on iPhone', function() {
window.onTouchBasedDevice.and.returnValue(['iPhone']);
state = jasmine.initializePlayer();
expect(state.videoProgressSlider).toBeUndefined();
// We can't expect $.fn.slider not to have been called,
// because sliders are used in other parts of Video.
});
$.each(['iPad', 'Android'], function(index, device) {
it('build the slider on ' + device, function() {
window.onTouchBasedDevice.and.returnValue([device]);
state = jasmine.initializePlayer();
expect(state.videoProgressSlider.slider).toBeDefined();
});
});
});
});
describe('play', function() {
beforeEach(function() {
state = jasmine.initializePlayer();
});
describe('when the slider was already built', function() {
var spy;
beforeEach(function() {
spy = spyOn(state.videoProgressSlider, 'buildSlider');
spy.and.callThrough();
state.videoPlayer.play();
});
it('does not build the slider', function() {
expect(spy.calls.count()).toEqual(0);
});
});
// Currently, the slider is not rebuilt if it does not exist.
});
describe('updatePlayTime', function() {
beforeEach(function() {
state = jasmine.initializePlayer();
});
describe('when frozen', function() {
beforeEach(function() {
spyOn($.fn, 'slider').and.callThrough();
state.videoProgressSlider.frozen = true;
state.videoProgressSlider.updatePlayTime(20, 120);
});
it('does not update the slider', function() {
expect($.fn.slider).not.toHaveBeenCalled();
});
});
describe('when not frozen', function() {
beforeEach(function() {
spyOn($.fn, 'slider').and.callThrough();
state.videoProgressSlider.frozen = false;
state.videoProgressSlider.updatePlayTime({
time: 20,
duration: 120
});
});
it('update the max value of the slider', function() {
expect($.fn.slider).toHaveBeenCalledWith(
'option', 'max', 120
);
});
it('update current value of the slider', function() {
expect($.fn.slider).toHaveBeenCalledWith(
'option', 'value', 20
);
});
it('required aria values updated', function() {
expect(state.videoProgressSlider.handle.attr('aria-valuenow')).toBe('20');
expect(state.videoProgressSlider.handle.attr('aria-valuemax')).toBe('120');
});
});
});
describe('onSlide', function() {
beforeEach(function() {
state = jasmine.initializePlayer();
spyOn($.fn, 'slider').and.callThrough();
spyOn(state.videoPlayer, 'onSlideSeek').and.callThrough();
});
// Disabled 12/30/13 due to flakiness in master
xit('freeze the slider', function() {
state.videoProgressSlider.onSlide(
jQuery.Event('slide'), {value: 20}
);
expect(state.videoProgressSlider.frozen).toBeTruthy();
});
// Disabled 12/30/13 due to flakiness in master
xit('trigger seek event', function() {
state.videoProgressSlider.onSlide(
jQuery.Event('slide'), {value: 20}
);
expect(state.videoPlayer.onSlideSeek).toHaveBeenCalled();
});
});
describe('onStop', function() {
beforeEach(function() {
jasmine.clock().install();
state = jasmine.initializePlayer();
spyOn(state.videoPlayer, 'onSlideSeek').and.callThrough();
});
afterEach(function() {
jasmine.clock().uninstall();
});
// Disabled 12/30/13 due to flakiness in master
xit('freeze the slider', function() {
state.videoProgressSlider.onStop(
jQuery.Event('stop'), {value: 20}
);
expect(state.videoProgressSlider.frozen).toBeTruthy();
});
// Disabled 12/30/13 due to flakiness in master
xit('trigger seek event', function() {
state.videoProgressSlider.onStop(
jQuery.Event('stop'), {value: 20}
);
expect(state.videoPlayer.onSlideSeek).toHaveBeenCalled();
});
// Disabled 12/30/13 due to flakiness in master
xit('set timeout to unfreeze the slider', function() {
state.videoProgressSlider.onStop(
jQuery.Event('stop'), {value: 20}
);
jasmine.clock().tick(200);
expect(state.videoProgressSlider.frozen).toBeFalsy();
});
});
it('getRangeParams', function() {
var testCases = [
{
startTime: 10,
endTime: 20,
duration: 150
},
{
startTime: 90,
endTime: 100,
duration: 100
},
{
startTime: 0,
endTime: 200,
duration: 200
}
];
state = jasmine.initializePlayer();
$.each(testCases, function(index, testCase) {
var step = 100 / testCase.duration,
left = testCase.startTime * step,
width = testCase.endTime * step - left,
expectedParams = {
left: left + '%',
width: width + '%'
},
params = state.videoProgressSlider.getRangeParams(
testCase.startTime, testCase.endTime, testCase.duration
);
expect(params).toEqual(expectedParams);
});
});
describe('notifyThroughHandleEnd', function() {
beforeEach(function() {
state = jasmine.initializePlayer();
spyOnEvent(state.videoProgressSlider.handle, 'focus');
spyOn(state.videoProgressSlider, 'notifyThroughHandleEnd')
.and.callThrough();
});
it('params.end = true', function() {
state.videoProgressSlider.notifyThroughHandleEnd({end: true});
expect(state.videoProgressSlider.handle.attr('title'))
.toBe('Video ended');
expect('focus').toHaveBeenTriggeredOn(
state.videoProgressSlider.handle
);
});
it('params.end = false', function() {
state.videoProgressSlider.notifyThroughHandleEnd({end: false});
expect(state.videoProgressSlider.handle.attr('title'))
.toBe('Video position');
expect('focus').not.toHaveBeenTriggeredOn(
state.videoProgressSlider.handle
);
});
it('is called when video plays', function(done) {
state.videoPlayer.play();
jasmine.waitUntil(function() {
return state.videoPlayer.isPlaying();
}).done(function() {
expect(state.videoProgressSlider.notifyThroughHandleEnd).toHaveBeenCalledWith({end: false});
}).always(done);
});
});
it('getTimeDescription', function() {
var cases = {
0: '0 seconds',
1: '1 second',
10: '10 seconds',
60: '1 minute 0 seconds',
121: '2 minutes 1 second',
3670: '1 hour 1 minute 10 seconds',
21541: '5 hours 59 minutes 1 second'
},
getTimeDescription;
state = jasmine.initializePlayer();
getTimeDescription = state.videoProgressSlider.getTimeDescription;
$.each(cases, function(input, output) {
expect(getTimeDescription(input)).toBe(output);
});
});
it('can destroy itself', function() {
state = jasmine.initializePlayer();
state.videoProgressSlider.destroy();
expect(state.videoProgressSlider).toBeUndefined();
expect($('.slider')).toBeEmpty();
});
});
}).call(this);