Commit 694d6761 by Anton Stupak

Merge pull request #7031 from edx/anton/video-fix-flaky-js-tests

[TNL-439]: Fix flaky jasmine tests.
parents bf7f7e14 f9738b92
...@@ -217,44 +217,31 @@ ...@@ -217,44 +217,31 @@
expect(menuSubmenuItem).not.toHaveClass('is-opened'); expect(menuSubmenuItem).not.toHaveClass('is-opened');
}); });
// Flaky-test resulting in timeout errors. Disabled 09/18/2014 it('mouse left/right-clicking behaves as expected on play/pause menu item', function () {
// See TNL-439
xit('mouse left/right-clicking behaves as expected on play/pause menu item', function () {
var menuItem = menuItems.first(); var menuItem = menuItems.first();
runs(function () { spyOn(state.videoPlayer, 'play').andCallFake(function () {
state.videoControl.isPlaying = true;
state.el.trigger('play');
});
spyOn(state.videoPlayer, 'pause').andCallFake(function () {
state.videoControl.isPlaying = false;
state.el.trigger('pause');
});
// Left-click on play // Left-click on play
menuItem.click(); menuItem.click();
}); expect(state.videoPlayer.play).toHaveBeenCalled();
waitsFor(function () {
return state.videoPlayer.isPlaying();
}, 'video to start playing', 200);
runs(function () {
expect(menuItem).toHaveText('Pause'); expect(menuItem).toHaveText('Pause');
openMenu(); openMenu();
// Left-click on pause // Left-click on pause
menuItem.click(); menuItem.click();
}); expect(state.videoPlayer.pause).toHaveBeenCalled();
waitsFor(function () {
return !state.videoPlayer.isPlaying();
}, 'video to start playing', 200);
runs(function () {
expect(menuItem).toHaveText('Play'); expect(menuItem).toHaveText('Play');
state.videoPlayer.play.reset();
// Right-click on play // Right-click on play
menuItem.trigger('contextmenu'); menuItem.trigger('contextmenu');
}); expect(state.videoPlayer.play).toHaveBeenCalled();
waitsFor(function () {
return state.videoPlayer.isPlaying();
}, 'video to start playing', 200);
runs(function () {
expect(menuItem).toHaveText('Pause'); expect(menuItem).toHaveText('Pause');
}); });
});
it('mouse left/right-clicking behaves as expected on mute/unmute menu item', function () { it('mouse left/right-clicking behaves as expected on mute/unmute menu item', function () {
var menuItem = menuItems.eq(1); var menuItem = menuItems.eq(1);
......
...@@ -367,6 +367,8 @@ function (VideoPlayer) { ...@@ -367,6 +367,8 @@ function (VideoPlayer) {
beforeEach(function () { beforeEach(function () {
state = jasmine.initializePlayer(); state = jasmine.initializePlayer();
state.videoEl = $('video, iframe'); state.videoEl = $('video, iframe');
jasmine.Clock.useMock();
spyOn(state.videoPlayer, 'duration').andReturn(120);
}); });
describe('when the video is playing', function () { describe('when the video is playing', function () {
...@@ -376,9 +378,7 @@ function (VideoPlayer) { ...@@ -376,9 +378,7 @@ function (VideoPlayer) {
}); });
waitsFor(function () { waitsFor(function () {
var duration = state.videoPlayer.duration(); return state.videoPlayer.isPlaying();
return duration > 0 && state.videoPlayer.isPlaying();
}, 'video didn\'t start playing', WAIT_TIMEOUT); }, 'video didn\'t start playing', WAIT_TIMEOUT);
}); });
...@@ -388,140 +388,96 @@ function (VideoPlayer) { ...@@ -388,140 +388,96 @@ function (VideoPlayer) {
spyOn(state.videoPlayer, 'stopTimer'); spyOn(state.videoPlayer, 'stopTimer');
spyOn(state.videoPlayer, 'runTimer'); spyOn(state.videoPlayer, 'runTimer');
state.videoPlayer.seekTo(10); state.videoPlayer.seekTo(10);
}); // Video player uses _.debounce (with a wait time in 300 ms) for seeking.
// That's why we have to do this tick(300).
waitsFor(function () { jasmine.Clock.tick(300);
return state.videoPlayer.currentTime >= 10; expect(state.videoPlayer.currentTime).toBe(10);
}, 'currentTime is less than 10 seconds', WAIT_TIMEOUT); expect(state.videoPlayer.stopTimer).toHaveBeenCalled();
expect(state.videoPlayer.runTimer).toHaveBeenCalled();
runs(function () {
expect(state.videoPlayer.stopTimer)
.toHaveBeenCalled();
expect(state.videoPlayer.runTimer)
.toHaveBeenCalled();
}); });
}); });
// as per TNL-439 this test is deemed flaky and needs to be fixed. it('slider event causes log update', function () {
// disabled 09/18/2014
xit('slider event causes log update', function () {
runs(function () { runs(function () {
spyOn(state.videoPlayer, 'log'); spyOn(state.videoPlayer, 'log');
state.videoProgressSlider.onSlide( state.videoProgressSlider.onSlide(
jQuery.Event('slide'), { value: 2 } jQuery.Event('slide'), { value: 2 }
); );
}); // Video player uses _.debounce (with a wait time in 300 ms) for seeking.
// That's why we have to do this tick(300).
waitsFor(function () { jasmine.Clock.tick(300);
return state.videoPlayer.currentTime >= 2; expect(state.videoPlayer.currentTime).toBe(2);
}, 'currentTime is less than 2 seconds', WAIT_TIMEOUT);
runs(function () {
// Depending on the browser, the object of arrays may list the
// arrays in a different order. Find the array that is relevent
// to onSeek. Fail if that is not found.
var seekVideoArgIndex
for(var i = 0; i < state.videoPlayer.log.calls.length; i++){
if (state.videoPlayer.log.calls[i].args[0] == 'seek_video') {
seekVideoArgIndex = i
break;
}
}
expect(seekVideoArgIndex).toBeDefined;
var args = state.videoPlayer.log.calls[seekVideoArgIndex].args; expect(state.videoPlayer.log).toHaveBeenCalledWith('seek_video', {
old_time: jasmine.any(Number),
expect(args[1].old_time).toBeLessThan(2); new_time: 2,
expect(args[1].new_time).toBe(2); type: 'onSlideSeek'
expect(args[1].type).toBe('onSlideSeek'); });
}); });
}); });
// as per TNL-439 this test is deemed flaky and needs to be fixed. it('seek the player', function () {
// disabled 09/18/2014
xit('seek the player', function () {
runs(function () { runs(function () {
spyOn(state.videoPlayer.player, 'seekTo') spyOn(state.videoPlayer.player, 'seekTo').andCallThrough();
.andCallThrough();
state.videoProgressSlider.onSlide( state.videoProgressSlider.onSlide(
jQuery.Event('slide'), { value: 30 } jQuery.Event('slide'), { value: 30 }
); );
}); // Video player uses _.debounce (with a wait time in 300 ms) for seeking.
// That's why we have to do this tick(300).
waitsFor(function () { jasmine.Clock.tick(300);
return state.videoPlayer.currentTime >= 30; expect(state.videoPlayer.currentTime).toBe(30);
}, 'currentTime is less than 30 seconds', WAIT_TIMEOUT); expect(state.videoPlayer.player.seekTo).toHaveBeenCalledWith(30, true);
runs(function () {
expect(state.videoPlayer.player.seekTo)
.toHaveBeenCalledWith(30, true);
}); });
}); });
// as per TNL-439 this test is deemed flaky and needs to be fixed. it('call updatePlayTime on player', function () {
// disabled 09/18/2014
xit('call updatePlayTime on player', function () {
runs(function () { runs(function () {
spyOn(state.videoPlayer, 'updatePlayTime') spyOn(state.videoPlayer, 'updatePlayTime').andCallThrough();
.andCallThrough();
state.videoProgressSlider.onSlide( state.videoProgressSlider.onSlide(
jQuery.Event('slide'), { value: 30 } jQuery.Event('slide'), { value: 30 }
); );
}); // Video player uses _.debounce (with a wait time in 300 ms) for seeking.
// That's why we have to do this tick(300).
waitsFor(function () { jasmine.Clock.tick(300);
return state.videoPlayer.currentTime >= 30; expect(state.videoPlayer.currentTime).toBe(30);
}, 'currentTime is less than 30 seconds', WAIT_TIMEOUT); expect(state.videoPlayer.updatePlayTime).toHaveBeenCalledWith(30, true);
runs(function () {
expect(state.videoPlayer.updatePlayTime)
.toHaveBeenCalledWith(30, true);
}); });
}); });
}); });
// Disabled 10/25/13 due to flakiness in master it('when the player is not playing: set the current time', function () {
xit(
'when the player is not playing: set the current time',
function ()
{
runs(function () {
state.videoProgressSlider.onSlide( state.videoProgressSlider.onSlide(
jQuery.Event('slide'), { value: 20 } jQuery.Event('slide'), { value: 20 }
); );
// Video player uses _.debounce (with a wait time in 300 ms) for seeking.
// That's why we have to do this tick(300).
jasmine.Clock.tick(300);
state.videoPlayer.pause(); state.videoPlayer.pause();
expect(state.videoPlayer.currentTime).toBe(20);
state.videoProgressSlider.onSlide( state.videoProgressSlider.onSlide(
jQuery.Event('slide'), { value: 10 } jQuery.Event('slide'), { value: 10 }
); );
// Video player uses _.debounce (with a wait time in 300 ms) for seeking.
waitsFor(function () { // That's why we have to do this tick(300).
return Math.round(state.videoPlayer.currentTime) === 10; jasmine.Clock.tick(300);
}, 'currentTime got updated', 10000); expect(state.videoPlayer.currentTime).toBe(10);
});
}); });
// as per TNL-439 these tests are deemed flaky and needs to be fixed. describe('when the video is not playing', function () {
// disabled 09/18/2014
xdescribe('when the video is not playing', function () {
beforeEach(function () { beforeEach(function () {
spyOn(state.videoPlayer, 'setPlaybackRate') spyOn(state.videoPlayer, 'setPlaybackRate')
.andCallThrough(); .andCallThrough();
}); });
it('slider event causes log update', function () { it('slider event causes log update', function () {
runs(function () {
spyOn(state.videoPlayer, 'log'); spyOn(state.videoPlayer, 'log');
state.videoProgressSlider.onSlide( state.videoProgressSlider.onSlide(
jQuery.Event('slide'), { value: 2 } jQuery.Event('slide'), { value: 2 }
); );
}); // Video player uses _.debounce (with a wait time in 300 ms) for seeking.
// That's why we have to do this tick(300).
waitsFor(function () { jasmine.Clock.tick(300);
return state.videoPlayer.currentTime >= 2; expect(state.videoPlayer.currentTime).toBe(2);
}, 'currentTime is less than 2 seconds', WAIT_TIMEOUT);
runs(function () {
expect(state.videoPlayer.log).toHaveBeenCalledWith( expect(state.videoPlayer.log).toHaveBeenCalledWith(
'seek_video', { 'seek_video', {
old_time: 0, old_time: 0,
...@@ -530,7 +486,6 @@ function (VideoPlayer) { ...@@ -530,7 +486,6 @@ function (VideoPlayer) {
} }
); );
}); });
});
it('video has a correct speed', function () { it('video has a correct speed', function () {
state.speed = '2.0'; state.speed = '2.0';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment