import { render, fireEvent } from '@testing-library/react-native';
import React from 'react';
import { Platform, UIManager } from 'react-native';
import type { IVSPlayerRef } from '../types';
import IVSPlayer from '../IVSPlayer';
const URL =
'https://fcc3ddae59ed.us-west-2.playback.live-video.net/api/video/v1/us-west-2.893648527354.channel.DmumNckWFTqz.m3u8';
jest.mock('react-native', () => {
const RN = jest.requireActual('react-native');
RN.UIManager.getViewManagerConfig = (name: string) => {
if (name === 'AmazonIvs') {
return {
Commands: {
play: 1,
pause: 2,
seekTo: 3,
setOrigin: 4,
togglePip: undefined,
},
};
}
return {};
};
return RN;
});
const testCallbackPassing = async (
name: string,
nativeEvent?: any,
result?: any
) => {
const mockFn = jest.fn();
const { findByTestId } = render(
);
const nativePlayer = await findByTestId('IVSPlayer');
fireEvent(
nativePlayer,
name,
nativeEvent
? {
nativeEvent,
}
: undefined
);
expect(mockFn).toHaveBeenCalledWith(result);
};
test('Renders the native component', async () => {
const { findByTestId } = render();
const nativePlayer = await findByTestId('IVSPlayer');
expect(nativePlayer).toBeDefined();
});
test('Passing onDurationChange down works correctly', async () => {
await testCallbackPassing('onDurationChange', { duration: 1 }, 1);
});
test('Passing onSeek down works correctly', async () => {
await testCallbackPassing('onSeek', { position: 1 }, 1);
});
test('Passing onData down works correctly', async () => {
await testCallbackPassing(
'onData',
{ playerData: { sessionId: 1 } },
{ sessionId: 1 }
);
});
test('Passing onVideoStatistics down works correctly', async () => {
await testCallbackPassing(
'onVideoStatistics',
{ videoData: { duration: 1 } },
{ duration: 1 }
);
});
test('Passing onPlayerStateChange down works correctly', async () => {
await testCallbackPassing('onPlayerStateChange', { state: 1 }, 1);
});
test('Passing onQualityChange down works correctly', async () => {
await testCallbackPassing(
'onQualityChange',
{ quality: { bitrate: 1 } },
{ bitrate: 1 }
);
});
test('Passing onRebuffering down works correctly', async () => {
await testCallbackPassing('onRebuffering');
});
test('Passing onLoadStart down works correctly', async () => {
await testCallbackPassing('onLoadStart');
});
test('Passing onLoad down works correctly', async () => {
await testCallbackPassing('onLoad', { duration: 1 }, 1);
});
test('Passing onLiveLatencyChange down works correctly', async () => {
await testCallbackPassing('onLiveLatencyChange', { liveLatency: 1 }, 1);
});
test('Passing onTextCue down works correctly', async () => {
await testCallbackPassing(
'onTextCue',
{ textCue: { text: 'text' } },
{ text: 'text' }
);
});
test('Passing onTextMetadataCue down works correctly', async () => {
await testCallbackPassing(
'onTextMetadataCue',
{ textMetadataCue: { text: 'text' } },
{ text: 'text' }
);
});
test('Passing onProgress down works correctly', async () => {
await testCallbackPassing('onProgress', { position: 1 }, 1);
});
test('Passing onError down works correctly', async () => {
await testCallbackPassing('onError', { error: 'err' }, 'err');
});
test('Passing onTimePoint down works correctly', async () => {
await testCallbackPassing('onTimePoint', { position: 1 }, 1);
});
test('Player will autoplay without any props', async () => {
const mockCommandFn = jest.fn();
UIManager.dispatchViewManagerCommand = mockCommandFn;
render();
expect(mockCommandFn).toHaveBeenCalled();
// Checking if the second argument of the function is the "play" command
expect(mockCommandFn.mock.calls[0][1]).toEqual(1);
});
test('Paused set to false wont play the video', async () => {
const mockCommandFn = jest.fn();
UIManager.dispatchViewManagerCommand = mockCommandFn;
render();
expect(mockCommandFn).toHaveBeenCalled();
// Checking if the second argument of the function is the "pause" command
expect(mockCommandFn.mock.calls[0][1]).toEqual(2);
});
test('Using pause on ref calls pause on native component', async () => {
const mockCommandFn = jest.fn();
const ref = React.createRef();
render();
UIManager.dispatchViewManagerCommand = mockCommandFn;
ref.current?.pause();
expect(mockCommandFn).toHaveBeenCalled();
// Checking if the second argument of the function is the "pause" command
expect(mockCommandFn.mock.calls[0][1]).toEqual(2);
});
test('Using play on ref calls play on native component', async () => {
const mockCommandFn = jest.fn();
const ref = React.createRef();
render();
UIManager.dispatchViewManagerCommand = mockCommandFn;
ref.current?.pause();
ref.current?.play();
expect(mockCommandFn).toHaveBeenCalledTimes(2);
// Checking if the second argument of the function is the "play" command
expect(mockCommandFn.mock.calls[1][1]).toEqual(1);
});
test('Using seekTo on ref calls seekTo on native component', async () => {
const mockCommandFn = jest.fn();
const ref = React.createRef();
render();
UIManager.dispatchViewManagerCommand = mockCommandFn;
ref.current?.seekTo(10);
expect(mockCommandFn).toHaveBeenCalled();
// Checking if the second argument of the function is the "play" command
expect(mockCommandFn.mock.calls[0][1]).toEqual(3);
// Checking if the value we pass down is proper
expect(mockCommandFn.mock.calls[0][2]).toEqual([10]);
});
test('Using togglePip on ref calls togglePip on native component', async () => {
const mockCommandFn = jest.fn();
const ref = React.createRef();
render();
UIManager.dispatchViewManagerCommand = mockCommandFn;
ref.current?.togglePip();
expect(mockCommandFn).toHaveBeenCalled();
ref.current?.togglePip();
expect(mockCommandFn).toHaveBeenCalledTimes(2);
});
test('Using setOrigin on ref calls setOrigin on native component', async () => {
const mockCommandFn = jest.fn();
const ref = React.createRef();
render();
UIManager.dispatchViewManagerCommand = mockCommandFn;
ref.current?.setOrigin('Access-Control-Allow-Origin');
});
test('Autoplay when onLoad', async () => {
const mockCommandFn = jest.fn();
Platform.OS = 'android';
const { findByTestId } = render();
UIManager.dispatchViewManagerCommand = mockCommandFn;
const nativePlayer = await findByTestId('IVSPlayer');
fireEvent(nativePlayer, 'onLoad', { nativeEvent: { duration: 10 } });
expect(mockCommandFn).toHaveBeenCalled();
// Checking if the second argument of the function is the "play" command
expect(mockCommandFn.mock.calls[0][1]).toEqual(1);
});