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,43 +217,30 @@ ...@@ -217,43 +217,30 @@
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 () {
// Left-click on play state.videoControl.isPlaying = true;
menuItem.click(); state.el.trigger('play');
}); });
spyOn(state.videoPlayer, 'pause').andCallFake(function () {
waitsFor(function () { state.videoControl.isPlaying = false;
return state.videoPlayer.isPlaying(); state.el.trigger('pause');
}, 'video to start playing', 200);
runs(function () {
expect(menuItem).toHaveText('Pause');
openMenu();
// Left-click on pause
menuItem.click();
});
waitsFor(function () {
return !state.videoPlayer.isPlaying();
}, 'video to start playing', 200);
runs(function () {
expect(menuItem).toHaveText('Play');
// Right-click on play
menuItem.trigger('contextmenu');
});
waitsFor(function () {
return state.videoPlayer.isPlaying();
}, 'video to start playing', 200);
runs(function () {
expect(menuItem).toHaveText('Pause');
}); });
// Left-click on play
menuItem.click();
expect(state.videoPlayer.play).toHaveBeenCalled();
expect(menuItem).toHaveText('Pause');
openMenu();
// Left-click on pause
menuItem.click();
expect(state.videoPlayer.pause).toHaveBeenCalled();
expect(menuItem).toHaveText('Play');
state.videoPlayer.play.reset();
// Right-click on play
menuItem.trigger('contextmenu');
expect(state.videoPlayer.play).toHaveBeenCalled();
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 () {
......
...@@ -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,148 +388,103 @@ function (VideoPlayer) { ...@@ -388,148 +388,103 @@ 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);
expect(state.videoPlayer.log).toHaveBeenCalledWith('seek_video', {
runs(function () { old_time: jasmine.any(Number),
// Depending on the browser, the object of arrays may list the new_time: 2,
// arrays in a different order. Find the array that is relevent type: 'onSlideSeek'
// 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(args[1].old_time).toBeLessThan(2);
expect(args[1].new_time).toBe(2);
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( state.videoProgressSlider.onSlide(
'when the player is not playing: set the current time', jQuery.Event('slide'), { value: 20 }
function () );
{ // Video player uses _.debounce (with a wait time in 300 ms) for seeking.
runs(function () { // That's why we have to do this tick(300).
state.videoProgressSlider.onSlide( jasmine.Clock.tick(300);
jQuery.Event('slide'), { value: 20 } state.videoPlayer.pause();
); expect(state.videoPlayer.currentTime).toBe(20);
state.videoPlayer.pause(); 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.
// That's why we have to do this tick(300).
waitsFor(function () { jasmine.Clock.tick(300);
return Math.round(state.videoPlayer.currentTime) === 10; expect(state.videoPlayer.currentTime).toBe(10);
}, 'currentTime got updated', 10000);
});
}); });
// 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).
jasmine.Clock.tick(300);
waitsFor(function () { expect(state.videoPlayer.currentTime).toBe(2);
return state.videoPlayer.currentTime >= 2; expect(state.videoPlayer.log).toHaveBeenCalledWith(
}, 'currentTime is less than 2 seconds', WAIT_TIMEOUT); 'seek_video', {
old_time: 0,
runs(function () { new_time: 2,
expect(state.videoPlayer.log).toHaveBeenCalledWith( type: 'onSlideSeek'
'seek_video', { }
old_time: 0, );
new_time: 2,
type: 'onSlideSeek'
}
);
});
}); });
it('video has a correct speed', function () { it('video has a correct speed', function () {
......
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