diff --git a/src/__mocks__/mockData.js b/src/__mocks__/mockData.js index caed815..1bacd29 100644 --- a/src/__mocks__/mockData.js +++ b/src/__mocks__/mockData.js @@ -87,6 +87,7 @@ const MOCK_SESSION = { }; const MOCK_SIGNAL = { + to: 'to-specific-user', type: 'foo', data: JSON.stringify({ foo: 'bar', diff --git a/src/index.js b/src/index.js index 4e1ab11..da65f97 100644 --- a/src/index.js +++ b/src/index.js @@ -191,15 +191,15 @@ const useOpenTok = () => { ); const sendSignal = useCallback( - ({ type, data, completionHandler }) => { + ({ type, data, to, completionHandler }) => { if (!isSessionConnected) { throw new Error('[ReactUseOpenTok] sendSignal: Session is not connected'); } - let signal = { data }; - - if (typeof type === 'string' && type.length > 0) { - signal.type = type; + let signal = { + data, + ...type && { type }, + ...to && { to }, } session.signal(signal, error => { diff --git a/src/index.test.js b/src/index.test.js index 0eee183..5b3be90 100644 --- a/src/index.test.js +++ b/src/index.test.js @@ -44,7 +44,12 @@ describe('session initialization and connection', () => { expect(error).toMatch(/token/); } - await act(() => opentokMethods.connectSession(MOCK_CREDENTIALS.token, opentokProps.session)); + await act(() => + opentokMethods.connectSession( + MOCK_CREDENTIALS.token, + opentokProps.session + ) + ); [opentokProps, opentokMethods] = result.current; expect(opentokProps.isSessionConnected).toBeTruthy(); expect(opentokProps.connectionId).toEqual(expect.any(String)); @@ -82,7 +87,12 @@ describe('session methods after initialization', () => { connectionId: undefined, }); - await act(() => opentokMethods.connectSession(MOCK_CREDENTIALS.token, opentokProps.session)); + await act(() => + opentokMethods.connectSession( + MOCK_CREDENTIALS.token, + opentokProps.session + ) + ); [opentokProps, opentokMethods] = result.current; expect(opentokProps).toMatchObject({ isSessionConnected: true, @@ -180,12 +190,14 @@ describe('session methods after initialization', () => { const stream = opentokProps.publisher[name].stream; // subscribe - act(() => + act(() => { opentokMethods.subscribe({ stream, element: 'subscriber', - }) - ); + }); + return undefined; + }); + [opentokProps, opentokMethods] = result.current; expect(opentokProps.subscribers.length).toBe(1); @@ -200,7 +212,7 @@ describe('session methods after initialization', () => { expect(opentokProps.subscribers.length).toBe(0); }); - it('sendSignal', async () => { + it('sendSignal with to and type', async () => { const { result } = renderHook(() => reactUseOpentok()); let [opentokProps, opentokMethods] = result.current; expect(() => act(() => opentokMethods.sendSignal(MOCK_SIGNAL))).toThrow(); @@ -208,7 +220,12 @@ describe('session methods after initialization', () => { await act(() => opentokMethods.initSession(MOCK_CREDENTIALS)); [opentokProps, opentokMethods] = result.current; - await act(() => opentokMethods.connectSession(MOCK_CREDENTIALS.token, opentokProps.session)); + await act(() => + opentokMethods.connectSession( + MOCK_CREDENTIALS.token, + opentokProps.session + ) + ); [opentokProps, opentokMethods] = result.current; // register signal event @@ -224,6 +241,42 @@ describe('session methods after initialization', () => { expect(handleSignal).toHaveBeenCalledWith({ type: MOCK_SIGNAL.type, data: MOCK_SIGNAL.data, + to: MOCK_SIGNAL.to, + }); + }); + + it('sendSignal without to and type', async () => { + const { result } = renderHook(() => reactUseOpentok()); + let [opentokProps, opentokMethods] = result.current; + const { to, type, ...mockSignalWithoutTypeAndTo } = MOCK_SIGNAL; + + expect(() => + act(() => opentokMethods.sendSignal(mockSignalWithoutTypeAndTo)) + ).toThrow(); + + await act(() => opentokMethods.initSession(MOCK_CREDENTIALS)); + [opentokProps, opentokMethods] = result.current; + + await act(() => + opentokMethods.connectSession( + MOCK_CREDENTIALS.token, + opentokProps.session + ) + ); + [opentokProps, opentokMethods] = result.current; + + // register signal event + const handleSignal = jest.fn(e => e); + act(() => opentokProps.session.on('signal', handleSignal)); + expect(handleSignal).not.toHaveBeenCalled(); + + // dispatch signal event + [opentokProps, opentokMethods] = result.current; + act(() => opentokMethods.sendSignal(mockSignalWithoutTypeAndTo)); + + expect(handleSignal).toHaveBeenCalledTimes(1); + expect(handleSignal).toHaveBeenCalledWith({ + data: MOCK_SIGNAL.data, }); }); });