视频播放器仓库

api.test.js 9.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. import {
  2. mute,
  3. unmute,
  4. setVolume,
  5. showTrack,
  6. toggleMute,
  7. hideTracks,
  8. togglePause,
  9. toggleTracks,
  10. setCurrentTime,
  11. toggleFullscreen,
  12. getPercentagePlayed
  13. } from './api';
  14. describe('api', () => {
  15. let videoElMock;
  16. let textTracksMock;
  17. beforeEach(() => {
  18. videoElMock = {
  19. play: jest.fn(),
  20. pause: jest.fn()
  21. };
  22. textTracksMock = [{
  23. id: 1,
  24. mode: 'showing'
  25. }, {
  26. id: 2,
  27. mode: 'disabled'
  28. }, {
  29. id: 3,
  30. mode: 'disabled'
  31. }];
  32. });
  33. describe('togglePause', () => {
  34. it('plays if the video is paused', () => {
  35. expect(videoElMock.play).not.toHaveBeenCalled();
  36. togglePause(videoElMock, { paused: true });
  37. expect(videoElMock.play).toHaveBeenCalled();
  38. expect(videoElMock.pause).not.toHaveBeenCalled();
  39. });
  40. it('pauses if the video is playing', () => {
  41. expect(videoElMock.pause).not.toHaveBeenCalled();
  42. togglePause(videoElMock, { paused: false });
  43. expect(videoElMock.pause).toHaveBeenCalled();
  44. expect(videoElMock.play).not.toHaveBeenCalled();
  45. });
  46. });
  47. describe('setCurrentTime', () => {
  48. it('sets the current time', () => {
  49. expect(videoElMock.currentTime).toBe(undefined);
  50. setCurrentTime(videoElMock, undefined, 10);
  51. expect(videoElMock.currentTime).toBe(10);
  52. });
  53. });
  54. describe('setVolume', () => {
  55. it('unmutes', () => {
  56. expect(videoElMock.muted).toBe(undefined);
  57. setVolume(videoElMock, undefined, 10);
  58. expect(videoElMock.muted).toBe(false);
  59. });
  60. it('sets the volume', () => {
  61. expect(videoElMock.volume).toBe(undefined);
  62. setVolume(videoElMock, undefined, 10);
  63. expect(videoElMock.volume).toBe(10);
  64. });
  65. });
  66. describe('mute', () => {
  67. it('mutes', () => {
  68. expect(videoElMock.muted).toBe(undefined);
  69. mute(videoElMock);
  70. expect(videoElMock.muted).toBe(true);
  71. });
  72. });
  73. describe('unmute', () => {
  74. it('unmutes', () => {
  75. expect(videoElMock.muted).toBe(undefined);
  76. unmute(videoElMock);
  77. expect(videoElMock.muted).toBe(false);
  78. });
  79. });
  80. describe('toggleMute', () => {
  81. it('unmutes if muted and does not change volume', () => {
  82. expect(videoElMock.muted).toBe(undefined);
  83. toggleMute(videoElMock, { volume: 0.5, muted: true });
  84. expect(videoElMock.volume).toBe(undefined);
  85. expect(videoElMock.muted).toBe(false);
  86. });
  87. it('mutes if unmuted and does not change volume', () => {
  88. expect(videoElMock.muted).toBe(undefined);
  89. toggleMute(videoElMock, { volume: 0.5, muted: false });
  90. expect(videoElMock.volume).toBe(undefined);
  91. expect(videoElMock.muted).toBe(true);
  92. });
  93. it('sets volume to max if volume is 0', () => {
  94. expect(videoElMock.muted).toBe(undefined);
  95. expect(videoElMock.volume).toBe(undefined);
  96. toggleMute(videoElMock, { volume: 0, muted: false });
  97. expect(videoElMock.volume).toBe(1);
  98. expect(videoElMock.muted).toBe(false);
  99. });
  100. it('unmutes and sets volume to max if volume is 0', () => {
  101. expect(videoElMock.muted).toBe(undefined);
  102. expect(videoElMock.volume).toBe(undefined);
  103. toggleMute(videoElMock, { volume: 0, muted: true });
  104. expect(videoElMock.volume).toBe(1);
  105. expect(videoElMock.muted).toBe(false);
  106. });
  107. });
  108. describe('toggleFullscreen', () => {
  109. describe('going fullscreen', () => {
  110. it('requestsFullscreen', () => {
  111. videoElMock.requestFullscreen = jest.fn();
  112. toggleFullscreen(videoElMock);
  113. expect(videoElMock.requestFullscreen).toHaveBeenCalled();
  114. });
  115. it('requestsFullscreen for ms', () => {
  116. videoElMock.msRequestFullscreen = jest.fn();
  117. toggleFullscreen(videoElMock);
  118. expect(videoElMock.msRequestFullscreen).toHaveBeenCalled();
  119. });
  120. it('requestsFullscreen for moz', () => {
  121. videoElMock.mozRequestFullScreen = jest.fn();
  122. toggleFullscreen(videoElMock);
  123. expect(videoElMock.mozRequestFullScreen).toHaveBeenCalled();
  124. });
  125. it('requestsFullscreen for webkit', () => {
  126. videoElMock.webkitRequestFullscreen = jest.fn();
  127. toggleFullscreen(videoElMock);
  128. expect(videoElMock.webkitRequestFullscreen).toHaveBeenCalled();
  129. });
  130. });
  131. describe('exiting fullscreen', () => {
  132. beforeEach(() => {
  133. document.exitFullscreen = undefined;
  134. document.msExitFullscreen = undefined;
  135. document.mozCancelFullScreen = undefined;
  136. document.webkitExitFullscreen = undefined;
  137. document.fullscreenElement = undefined;
  138. document.msFullscreenElement = undefined;
  139. document.mozFullScreenElement = undefined;
  140. document.webkitFullscreenElement = undefined;
  141. });
  142. it('exitFullscreen', () => {
  143. document.fullscreenElement = videoElMock;
  144. document.exitFullscreen = jest.fn();
  145. toggleFullscreen(videoElMock);
  146. expect(document.exitFullscreen).toHaveBeenCalled();
  147. });
  148. it('exitFullscreen for ms', () => {
  149. document.msFullscreenElement = videoElMock;
  150. document.msExitFullscreen = jest.fn();
  151. toggleFullscreen(videoElMock);
  152. expect(document.msExitFullscreen).toHaveBeenCalled();
  153. });
  154. it('exitFullscreen for moz', () => {
  155. document.mozFullScreenElement = videoElMock;
  156. document.mozCancelFullScreen = jest.fn();
  157. toggleFullscreen(videoElMock);
  158. expect(document.mozCancelFullScreen).toHaveBeenCalled();
  159. });
  160. it('exitFullscreen for webkit', () => {
  161. document.webkitFullscreenElement = videoElMock;
  162. document.webkitExitFullscreen = jest.fn();
  163. toggleFullscreen(videoElMock);
  164. expect(document.webkitExitFullscreen).toHaveBeenCalled();
  165. });
  166. });
  167. });
  168. describe('hideTracks', () => {
  169. it('hides all of the tracks', () => {
  170. expect(textTracksMock[0].mode).toBe('showing');
  171. hideTracks({ textTracks: textTracksMock });
  172. expect(textTracksMock[0].mode).toBe('disabled');
  173. });
  174. it('uses constants on text tracks if they exist for IE', () => {
  175. textTracksMock[0].DISABLED = 3;
  176. expect(textTracksMock[0].mode).toBe('showing');
  177. hideTracks({ textTracks: textTracksMock });
  178. expect(textTracksMock[0].mode).toBe(3);
  179. });
  180. });
  181. describe('showTrack', () => {
  182. it('hides all of the tracks', () => {
  183. expect(textTracksMock[0].mode).toBe('showing');
  184. showTrack({ textTracks: textTracksMock }, textTracksMock[2]);
  185. expect(textTracksMock[0].mode).toBe('disabled');
  186. });
  187. it('sets the given track to show', () => {
  188. expect(textTracksMock[2].mode).toBe('disabled');
  189. showTrack({ textTracks: textTracksMock }, textTracksMock[2]);
  190. expect(textTracksMock[2].mode).toBe('showing');
  191. });
  192. it('uses constants on text tracks if they exist for IE', () => {
  193. textTracksMock[2].SHOWING = 2;
  194. expect(textTracksMock[2].mode).toBe('disabled');
  195. showTrack({ textTracks: textTracksMock }, textTracksMock[2]);
  196. expect(textTracksMock[2].mode).toBe(2);
  197. });
  198. });
  199. describe('toggleTracks', () => {
  200. it('shows the first track if no tracks are showing and there is no previously active track', () => {
  201. textTracksMock[0].mode = 'disabled';
  202. expect(textTracksMock[0].mode).toBe('disabled');
  203. toggleTracks({ textTracks: textTracksMock });
  204. expect(textTracksMock[0].mode).toBe('showing');
  205. });
  206. it('hides all tracks if a current track is showing', () => {
  207. expect(textTracksMock[0].mode).toBe('showing');
  208. toggleTracks({ textTracks: textTracksMock });
  209. expect(textTracksMock[0].mode).toBe('disabled');
  210. expect(textTracksMock[1].mode).toBe('disabled');
  211. expect(textTracksMock[2].mode).toBe('disabled');
  212. });
  213. it('shows the previously active track if no tracks are showing', () => {
  214. expect(textTracksMock[0].mode).toBe('showing');
  215. toggleTracks({ textTracks: textTracksMock });
  216. expect(textTracksMock[0].mode).toBe('disabled');
  217. toggleTracks({ textTracks: textTracksMock });
  218. expect(textTracksMock[0].mode).toBe('showing');
  219. showTrack({ textTracks: textTracksMock }, textTracksMock[2]);
  220. expect(textTracksMock[2].mode).toBe('showing');
  221. toggleTracks({ textTracks: textTracksMock });
  222. expect(textTracksMock[2].mode).toBe('disabled');
  223. toggleTracks({ textTracks: textTracksMock });
  224. expect(textTracksMock[2].mode).toBe('showing');
  225. });
  226. });
  227. describe('getPercentagePlayed', () => {
  228. it('returns correct percentage played', () => {
  229. expect(getPercentagePlayed({
  230. currentTime: 10,
  231. duration: 100
  232. })).toBe(10);
  233. expect(getPercentagePlayed({
  234. currentTime: 1,
  235. duration: 10
  236. })).toBe(10);
  237. expect(getPercentagePlayed({
  238. currentTime: 5,
  239. duration: 20
  240. })).toBe(25);
  241. });
  242. });
  243. });