Skip to content

Commit

Permalink
feat(MeetingSdkAdapter): implement join control in its own file and c…
Browse files Browse the repository at this point in the history
…reate the tests accordingly
  • Loading branch information
karinasigartau0798 authored and cipak committed Aug 6, 2021
1 parent ebed406 commit 68a4376
Show file tree
Hide file tree
Showing 6 changed files with 114 additions and 39 deletions.
27 changes: 2 additions & 25 deletions src/MeetingsSDKAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import {
} from 'rxjs/operators';

import ExitControl from './MeetingsSDKAdapter/controls/ExitControl';
import JoinControl from './MeetingsSDKAdapter/controls/JoinControl';
import RosterControl from './MeetingsSDKAdapter/controls/RosterControl';
import SettingsControl from './MeetingsSDKAdapter/controls/SettingsControl';
import {chainWith} from './utils';
Expand Down Expand Up @@ -111,11 +112,7 @@ export default class MeetingsSDKAdapter extends MeetingsAdapter {
this.getMeetingObservables = {};
this.meetings = {};

this.meetingControls[JOIN_CONTROL] = {
ID: JOIN_CONTROL,
action: this.joinMeeting.bind(this),
display: this.joinControl.bind(this),
};
this.meetingControls[JOIN_CONTROL] = new JoinControl(this, JOIN_CONTROL);

this.meetingControls[AUDIO_CONTROL] = {
ID: AUDIO_CONTROL,
Expand Down Expand Up @@ -615,26 +612,6 @@ export default class MeetingsSDKAdapter extends MeetingsAdapter {
}
}

/**
* Returns an observable that emits the display data of a meeting control.
*
* @private
* @returns {Observable.<MeetingControlDisplay>} Observable stream that emits display data of the join control
*/
// eslint-disable-next-line class-methods-use-this
joinControl() {
return Observable.create((observer) => {
observer.next({
ID: JOIN_CONTROL,
text: 'Join meeting',
tooltip: 'Join meeting',
state: MeetingControlState.ACTIVE,
});

observer.complete();
});
}

/**
* Attempts to mute the microphone of the given meeting ID.
* If the microphone is successfully muted, an audio mute event is dispatched.
Expand Down
52 changes: 38 additions & 14 deletions src/MeetingsSDKAdapter.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -458,20 +458,6 @@ describe('Meetings SDK Adapter', () => {
});
});

describe('joinControl()', () => {
test('returns the display data of a meeting control in a proper shape', (done) => {
meetingsSDKAdapter.joinControl().subscribe((dataDisplay) => {
expect(dataDisplay).toMatchObject({
ID: 'join-meeting',
text: 'Join meeting',
tooltip: 'Join meeting',
state: 'active',
});
done();
});
});
});

describe('leaveMeeting()', () => {
test('calls removeMedia() sdk adapter method and sdk leave method', async () => {
meetingsSDKAdapter.removeMedia = jest.fn();
Expand All @@ -494,6 +480,44 @@ describe('Meetings SDK Adapter', () => {
});
});

describe('joinMeeting()', () => {
test('calls join() sdk method', async () => {
await meetingsSDKAdapter.joinMeeting(meetingID);
expect(mockSDKMeeting.join).toHaveBeenCalled();
});

test('calls addMedia() sdk method', async () => {
await meetingsSDKAdapter.joinMeeting(meetingID);
expect(mockSDKMeeting.addMedia).toHaveBeenCalled();
});

test('calls muteAudio() sdk method if local audio is muted before join', async () => {
meetingsSDKAdapter.meetings[meetingID].localAudio.stream = null;
await meetingsSDKAdapter.joinMeeting(meetingID);
expect(mockSDKMeeting.muteAudio).toHaveBeenCalled();
});

test('calls muteVideo() sdk method if local video is muted before join', async () => {
meetingsSDKAdapter.meetings[meetingID].localAudio.stream = null;
await meetingsSDKAdapter.joinMeeting(meetingID);
expect(mockSDKMeeting.muteVideo).toHaveBeenCalled();
});

test('logs error if sdk refuses to join', async () => {
const sdkError = new Error('sdk join error');

mockSDKMeeting.join = jest.fn(() => Promise.reject(sdkError));
global.console.error = jest.fn();

await meetingsSDKAdapter.joinMeeting(meetingID);

expect(global.console.error).toHaveBeenCalledWith(
'Unable to join meeting "meetingID"',
sdkError,
);
});
});

describe('audioControl()', () => {
test('returns the display data of a meeting control in a proper shape', (done) => {
meetingsSDKAdapter.audioControl(meetingID).subscribe((dataDisplay) => {
Expand Down
36 changes: 36 additions & 0 deletions src/MeetingsSDKAdapter/controls/JoinControl.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import {Observable, of} from 'rxjs';
import {MeetingControlState} from '@webex/component-adapter-interfaces';
import MeetingControl from './MeetingControl';

/**
* Display options of a meeting control.
*
* @external MeetingControlDisplay
* @see {@link https://github.com/webex/component-adapter-interfaces/blob/master/src/MeetingsAdapter.js#L58}
*/

export default class JoinControl extends MeetingControl {
/**
* Calls the adapter joinMeeting method.
*
* @param {string} meetingID Id of the meeting to join
*/
async action(meetingID) {
await this.adapter.joinMeeting(meetingID);
}

/**
* Returns an observable that emits the display data of the control.
*
* @returns {Observable.<MeetingControlDisplay>} Observable that emits display of the join control
*/
// eslint-disable-next-line class-methods-use-this
display() {
return of({
ID: this.ID,
text: 'Join meeting',
tooltip: 'Join meeting',
state: MeetingControlState.ACTIVE,
});
}
}
36 changes: 36 additions & 0 deletions src/MeetingsSDKAdapter/controls/JoinControl.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import {first} from 'rxjs/operators';
import {meetingID, createTestMeetingsSDKAdapter} from '../testHelper';

describe('Join Control', () => {
let meetingsSDKAdapter;

beforeEach(() => {
meetingsSDKAdapter = createTestMeetingsSDKAdapter();
});

afterEach(() => {
meetingsSDKAdapter = null;
});

describe('display()', () => {
test('returns the display data in a proper shape', (done) => {
meetingsSDKAdapter.meetingControls['join-meeting'].display().pipe(first()).subscribe((display) => {
expect(display).toMatchObject({
ID: 'join-meeting',
text: 'Join meeting',
tooltip: 'Join meeting',
state: 'active',
});
done();
});
});
});

describe('action()', () => {
test('calls joinMeeting() SDK adapter method', async () => {
meetingsSDKAdapter.joinMeeting = jest.fn();
await meetingsSDKAdapter.meetingControls['join-meeting'].action(meetingID);
expect(meetingsSDKAdapter.joinMeeting).toHaveBeenCalledWith(meetingID);
});
});
});
1 change: 1 addition & 0 deletions src/MeetingsSDKAdapter/controls/index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/* eslint-disable import/prefer-default-export */
export {default as JoinControl} from './JoinControl';
export {default as MeetingControl} from './MeetingControl';
export {default as RosterControl} from './RosterControl';
export {default as SettingsControl} from './SettingsControl';
Expand Down
1 change: 1 addition & 0 deletions src/mockSdk.js
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ export const createMockSDKMeeting = () => ({
},
addMedia: jest.fn(() => Promise.resolve()),
emit: jest.fn(() => Promise.resolve()),
getDevices: jest.fn(() => Promise.resolve([])),
getMediaStreams: jest.fn((constraint) => {
const mockSDKMediaStreams = createMockSDKMediaStreams();

Expand Down

0 comments on commit 68a4376

Please sign in to comment.