diff --git a/src/adapters/PeopleJSONAdapter.js b/src/adapters/PeopleJSONAdapter.js new file mode 100644 index 000000000..2988d4ceb --- /dev/null +++ b/src/adapters/PeopleJSONAdapter.js @@ -0,0 +1,23 @@ +import {Observable} from 'rxjs'; + +import person from './../data/person'; +import PeopleAdapter from './PeopleAdapter'; + +export default class PeopleJSONAdapter extends PeopleAdapter { + /** + * Returns an observable that emits person data. + * Person data comes from JSON file `person.json` in the data folder. + * + * @param {String} id - ID of person to get + * @returns {Observable} + * @memberof PeopleJSONAdapter + */ + getPerson(id) { + return Observable.create((observer) => { + if (person.id === id) observer.next(person); + else observer.error(new Error(`Could not find person with id "${id}"`)); + + observer.complete(); + }); + } +} diff --git a/src/adapters/PeopleJSONAdapter.test.js b/src/adapters/PeopleJSONAdapter.test.js new file mode 100644 index 000000000..4be23a0ea --- /dev/null +++ b/src/adapters/PeopleJSONAdapter.test.js @@ -0,0 +1,48 @@ +import person from './../data/person'; +import PeopleJSONAdapter from './PeopleJSONAdapter'; + +describe('People Adapter Interface', () => { + let peopleJSONAdapter; + + beforeEach(() => { + peopleJSONAdapter = new PeopleJSONAdapter(); + }); + + test('getPerson() returns an observable', () => { + expect(rxjs.isObservable(peopleJSONAdapter.getPerson())).toBeTruthy(); + }); + + test('getPerson() returns a person data', (done) => { + peopleJSONAdapter.getPerson(person.id).subscribe((data) => { + expect(data).toEqual(person); + done(); + }); + }); + + test('getPerson() throws a proper error message', (done) => { + const personID = 'personID'; + + peopleJSONAdapter.getPerson(personID).subscribe( + () => {}, + (error) => { + expect(error.message).toBe(`Could not find person with id "${personID}"`); + done(); + } + ); + }); + + test('getPerson() completes the observable', (done) => { + peopleJSONAdapter.getPerson(person.id).subscribe( + () => {}, + () => {}, + () => { + expect(true).toBeTruthy(); + done(); + } + ); + }); + + afterEach(() => { + peopleJSONAdapter = null; + }); +}); diff --git a/src/adapters/index.js b/src/adapters/index.js index 470119197..5e504efa6 100644 --- a/src/adapters/index.js +++ b/src/adapters/index.js @@ -1 +1,3 @@ export {default as WebexAdapter} from './WebexAdapter'; +export {default as PeopleAdapter} from './PeopleAdapter'; +export {default as PeopleJSONAdapter} from './PeopleJSONAdapter'; diff --git a/src/data/person.json b/src/data/person.json new file mode 100644 index 000000000..b13fbf279 --- /dev/null +++ b/src/data/person.json @@ -0,0 +1,13 @@ +{ + "id": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9iMzNjYjE3Yy00MmUzLTQxYWMtYTA0NS00OTdlNDAwMjY0NmM", + "emails": [ + "webexcmps@gmail.com" + ], + "displayName": "Webex Component User", + "firstName": "Webex", + "LastName": "Component User", + "nickName": "Webex", + "avatar": "https://4b4dc97add6b1dcc891a-54bf3b4e4579920861d23cc001530c2a.ssl.cf1.rackcdn.com/V1~b33cb17c-42e3-41ac-a045-497e4002646c~697607d5347442a990719dd5d80ce379~1600", + "orgId": "Y2lzY29zcGFyazovL3VzL09SR0FOSVpBVElPTi9jb25zdW1lcg", + "status": "unknown" +} diff --git a/src/data/test.json b/src/data/test.json deleted file mode 100644 index f834b2a4e..000000000 --- a/src/data/test.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "test": true -}