Skip to content

Commit 408e6bc

Browse files
committed
feat(rooms): create adapter interface
1 parent c808f3f commit 408e6bc

File tree

3 files changed

+122
-0
lines changed

3 files changed

+122
-0
lines changed

src/adapters/RoomsAdapter.js

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import {throwError} from 'rxjs';
2+
3+
import WebexAdapter from './WebexAdapter';
4+
5+
/**
6+
* Enum for room type values.
7+
*
8+
* @readonly
9+
* @enum {string}
10+
*/
11+
export const RoomType = {
12+
GROUP: 'group',
13+
DIRECT: 'direct',
14+
};
15+
16+
/**
17+
* This is a base class that defines the interface that maps room data.
18+
* Developers that want to extend `RoomsAdapter` must implement all of its methods,
19+
* adhering to the exact parameters and structure of the returned objects.
20+
*/
21+
export default class RoomsAdapter extends WebexAdapter {
22+
/**
23+
* A Room object with details about the room.
24+
*
25+
* @typedef {Object} Room
26+
* @property {string} ID The room identifier.
27+
* @property {string} title The room title.
28+
* @property {RoomType} type The type of the room. @see RoomType enum
29+
*/
30+
31+
/**
32+
* Returns an observable that emits room data of the given ID.
33+
*
34+
* @param {string} ID ID of the room to get.
35+
* @returns {Observable.<Room>}
36+
* @memberof RoomsAdapter
37+
*/
38+
// eslint-disable-next-line no-unused-vars
39+
getRoom(ID) {
40+
return throwError(new Error('getRoom(ID) must be defined in RoomsAdapter'));
41+
}
42+
43+
/**
44+
* Returns an observable that emits an array of previous activity IDs of the given roomID.
45+
*
46+
* @param {string} ID ID of the room to get.
47+
* @returns {Observable.<Array.<string>>}
48+
* @memberof RoomsAdapter
49+
*/
50+
// eslint-disable-next-line no-unused-vars
51+
getPreviousRoomActivities(ID) {
52+
return throwError(new Error('getPreviousRoomActivities(ID) must be defined in RoomsAdapter'));
53+
}
54+
55+
/**
56+
* Returns an observable that emits an array of current activity IDs of the given roomID.
57+
*
58+
* @param {string} ID ID of the room to get.
59+
* @returns {Observable.<Array.<string>>}
60+
* @memberof RoomsAdapter
61+
*/
62+
// eslint-disable-next-line no-unused-vars
63+
getRoomActivities(ID) {
64+
return throwError(new Error('getRoomActivities(ID) must be defined in RoomsAdapter'));
65+
}
66+
}

src/adapters/RoomsAdapter.test.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import RoomsAdapter from './RoomsAdapter';
2+
3+
describe('Rooms Adapter Interface', () => {
4+
let roomsAdapter;
5+
6+
beforeEach(() => {
7+
roomsAdapter = new RoomsAdapter();
8+
});
9+
10+
test('getRoom() returns an observable', () => {
11+
expect(rxjs.isObservable(roomsAdapter.getRoom())).toBeTruthy();
12+
});
13+
14+
test('getRoom() throws a proper error message', (done) => {
15+
roomsAdapter.getRoom('id').subscribe(
16+
() => {},
17+
(error) => {
18+
expect(error.message).toBe('getRoom(ID) must be defined in RoomsAdapter');
19+
done();
20+
}
21+
);
22+
});
23+
24+
test('getPreviousRoomActivities() returns an observable', () => {
25+
expect(rxjs.isObservable(roomsAdapter.getPreviousRoomActivities())).toBeTruthy();
26+
});
27+
28+
test('getPreviousRoomActivities() throws a proper error message', (done) => {
29+
roomsAdapter.getPreviousRoomActivities('id').subscribe(
30+
() => {},
31+
(error) => {
32+
expect(error.message).toBe('getPreviousRoomActivities(ID) must be defined in RoomsAdapter');
33+
done();
34+
}
35+
);
36+
});
37+
38+
test('getRoomActivities() returns an observable', () => {
39+
expect(rxjs.isObservable(roomsAdapter.getRoomActivities())).toBeTruthy();
40+
});
41+
42+
test('getRoomActivities() throws a proper error message', (done) => {
43+
roomsAdapter.getRoomActivities('id').subscribe(
44+
() => {},
45+
(error) => {
46+
expect(error.message).toBe('getRoomActivities(ID) must be defined in RoomsAdapter');
47+
done();
48+
}
49+
);
50+
});
51+
52+
afterEach(() => {
53+
roomsAdapter = null;
54+
});
55+
});

src/adapters/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ export {default as PeopleAdapter} from './PeopleAdapter';
33
export {default as PeopleJSONAdapter} from './PeopleJSONAdapter';
44
export {default as ActivitiesAdapter} from './ActivitiesAdapter';
55
export {default as ActivitiesJSONAdapter} from './ActivitiesJSONAdapter';
6+
export {default as RoomsAdapter} from './RoomsAdapter';

0 commit comments

Comments
 (0)