Skip to content

Commit 7d30e10

Browse files
committed
feat(rooms): implemented rooms JSON adapter interface
1 parent 34fdf43 commit 7d30e10

File tree

4 files changed

+202
-0
lines changed

4 files changed

+202
-0
lines changed

src/adapters/RoomsJSONAdapter.js

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import {Observable} from 'rxjs';
2+
3+
import RoomsAdapter from './RoomsAdapter';
4+
5+
/**
6+
* @typedef RoomJSON
7+
* @param {object} datasource An object that contains a set of rooms keyed by ID.
8+
* @example
9+
* {
10+
* "room-1": {
11+
* "ID": "room-1",
12+
* "title": "title",
13+
* "roomType": "group"
14+
* },
15+
* "room-1-activities": []
16+
* }
17+
*/
18+
19+
/*
20+
* Implements the RoomsAdapter interface with a JSON object as its datasource. See @RoomsJSON
21+
*/
22+
export default class RoomsJSONAdapter extends RoomsAdapter {
23+
constructor(datasource) {
24+
super(datasource);
25+
this.getRoom = this.getRoom.bind(this);
26+
this.getPreviousRoomActivities = this.getPreviousRoomActivities.bind(this);
27+
this.getRoomActivities = this.getRoomActivities.bind(this);
28+
}
29+
30+
/**
31+
* Returns an observable that emits room data of the given ID.
32+
*
33+
* @param {string} ID ID of room to get
34+
* @returns {Observable.<Room>}
35+
* @memberof RoomsJSONAdapter
36+
*/
37+
getRoom(ID) {
38+
return Observable.create((observer) => {
39+
if (this.datasource[ID]) {
40+
observer.next(this.datasource[ID]);
41+
} else {
42+
observer.error(new Error(`Could not find room with ID "${ID}"`));
43+
}
44+
45+
observer.complete();
46+
});
47+
}
48+
49+
/**
50+
* Returns an observable that emits an array of previous activity IDs of the given roomID.
51+
*
52+
* @param {string} ID ID of the room to get.
53+
* @returns {Observable.<Array.<string>>}
54+
* @memberof RoomsAdapter
55+
*/
56+
getPreviousRoomActivities(ID) {
57+
return Observable.create((observer) => {
58+
const data = !this.datasource[ID] ? [] : this.datasource[ID];
59+
60+
observer.next(data);
61+
62+
observer.complete();
63+
});
64+
}
65+
66+
/**
67+
* Returns an observable that emits an array of current activity IDs of the given roomID.
68+
*
69+
* @param {string} ID ID of the room to get.
70+
* @returns {Observable.<Array.<string>>}
71+
* @memberof RoomsAdapter
72+
*/
73+
getRoomActivities(ID) {
74+
return Observable.create((observer) => {
75+
const data = !this.datasource[ID] ? [] : this.datasource[ID];
76+
77+
observer.next(data);
78+
79+
observer.complete();
80+
});
81+
}
82+
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import rooms from './../data/rooms';
2+
import RoomsJSONAdapter from './RoomsJSONAdapter';
3+
4+
describe('Rooms JSON Adapter Interface', () => {
5+
let roomsJSONAdapter, roomID, roomActivitiesID;
6+
7+
beforeEach(() => {
8+
[roomID, roomActivitiesID] = Object.keys(rooms);
9+
roomsJSONAdapter = new RoomsJSONAdapter(rooms);
10+
});
11+
12+
test('getRoom() returns an observable', () => {
13+
expect(rxjs.isObservable(roomsJSONAdapter.getRoom())).toBeTruthy();
14+
});
15+
16+
test('getRoom() returns a person data', (done) => {
17+
roomsJSONAdapter.getRoom(roomID).subscribe((data) => {
18+
expect(data).toEqual(rooms[roomID]);
19+
done();
20+
});
21+
});
22+
23+
test('getRoom() throws a proper error message', (done) => {
24+
const wrongRoomID = 'wrongRoomID';
25+
26+
roomsJSONAdapter.getRoom(wrongRoomID).subscribe(
27+
() => {},
28+
(error) => {
29+
expect(error.message).toBe(`Could not find room with ID "${wrongRoomID}"`);
30+
done();
31+
}
32+
);
33+
});
34+
35+
test('getRoom() completes the observable', (done) => {
36+
roomsJSONAdapter.getRoom(roomID).subscribe(
37+
() => {},
38+
() => {},
39+
() => {
40+
expect(true).toBeTruthy();
41+
done();
42+
}
43+
);
44+
});
45+
46+
test('getPreviousRoomActivities() returns an observable', () => {
47+
expect(rxjs.isObservable(roomsJSONAdapter.getPreviousRoomActivities())).toBeTruthy();
48+
});
49+
50+
test('getPreviousRoomActivities() returns an array of previous activity IDs', (done) => {
51+
roomsJSONAdapter.getPreviousRoomActivities(roomActivitiesID).subscribe((data) => {
52+
expect(data).toEqual(rooms[roomActivitiesID]);
53+
done();
54+
});
55+
});
56+
57+
test('getPreviousRoomActivities() returns an observable to an empty array for a given wrong room ID', (done) => {
58+
const wrongRoomActivitiesID = 'wrongRoomActivitiesID';
59+
60+
roomsJSONAdapter.getRoomActivities(wrongRoomActivitiesID).subscribe((data) => {
61+
expect(data).toEqual([]);
62+
done();
63+
});
64+
});
65+
66+
test('getPreviousRoomActivities() completes the observable', (done) => {
67+
roomsJSONAdapter.getPreviousRoomActivities(roomID).subscribe(
68+
() => {},
69+
() => {},
70+
() => {
71+
expect(true).toBeTruthy();
72+
done();
73+
}
74+
);
75+
});
76+
77+
test('getRoomActivities() returns an observable', () => {
78+
expect(rxjs.isObservable(roomsJSONAdapter.getRoomActivities())).toBeTruthy();
79+
});
80+
81+
test('getRoomActivities() returns an array of previous activity IDs', (done) => {
82+
roomsJSONAdapter.getRoomActivities(roomActivitiesID).subscribe((data) => {
83+
expect(data).toEqual(rooms[roomActivitiesID]);
84+
done();
85+
});
86+
});
87+
88+
test('getRoomActivities() returns an observable to an empty array for a given wrong room ID', (done) => {
89+
const wrongRoomActivitiesID = 'wrongRoomActivitiesID';
90+
91+
roomsJSONAdapter.getRoomActivities(wrongRoomActivitiesID).subscribe((data) => {
92+
expect(data).toEqual([]);
93+
done();
94+
});
95+
});
96+
97+
test('getRoomActivities() completes the observable', (done) => {
98+
roomsJSONAdapter.getRoomActivities(roomID).subscribe(
99+
() => {},
100+
() => {},
101+
() => {
102+
expect(true).toBeTruthy();
103+
done();
104+
}
105+
);
106+
});
107+
108+
afterEach(() => {
109+
roomsJSONAdapter = null;
110+
});
111+
});

src/data/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export {default as people} from './people';
22
export {default as activities} from './activities';
3+
export {default as rooms} from './rooms';

src/data/rooms.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"room-1": {
3+
"ID": "room-1",
4+
"title": "title",
5+
"roomType": "group"
6+
},
7+
"room-1-activities": []
8+
}

0 commit comments

Comments
 (0)