Added tests
Change-Id: I493675212f4b1548b32a6d92ce3664d184bc0e04
diff --git a/src/app/datasources/stores/model.store.spec.ts b/src/app/datasources/stores/model.store.spec.ts
new file mode 100644
index 0000000..48798df
--- /dev/null
+++ b/src/app/datasources/stores/model.store.spec.ts
@@ -0,0 +1,117 @@
+import * as angular from 'angular';
+import 'angular-mocks';
+import 'angular-resource';
+import {IModelStoreService, ModelStore} from './model.store';
+import {Subject} from 'rxjs';
+import {IWSEvent} from '../websocket/global';
+import {StoreHelpers} from '../helpers/store.helpers';
+import {ModelRest} from '../rest/model.rest';
+import {AppConfig} from '../../config/app.config';
+
+let service: IModelStoreService;
+let httpBackend: ng.IHttpBackendService;
+let $scope;
+let WebSocket;
+
+class MockWs {
+ private _list;
+ constructor() {
+ this._list = new Subject<IWSEvent>();
+ }
+ list() {
+ return this._list.asObservable();
+ }
+
+ next(event: IWSEvent) {
+ this._list.next(event);
+ }
+}
+
+const queryData = [
+ {id: 1, name: 'foo'},
+ {id: 1, name: 'bar'}
+];
+
+describe('The ModelStore service', () => {
+
+ beforeEach(() => {
+ angular
+ .module('ModelStore', ['ngResource'])
+ .service('WebSocket', MockWs)
+ .service('StoreHelpers', StoreHelpers) // TODO mock
+ .service('ModelRest', ModelRest) // TODO mock
+ .service('ModelStore', ModelStore);
+
+ angular.mock.module('ModelStore');
+ });
+
+ beforeEach(angular.mock.inject((
+ ModelStore: IModelStoreService,
+ $httpBackend: ng.IHttpBackendService,
+ _$rootScope_: ng.IRootScopeService,
+ _WebSocket_: any
+ ) => {
+ service = ModelStore;
+ httpBackend = $httpBackend;
+ $scope = _$rootScope_;
+ WebSocket = _WebSocket_;
+
+ // ModelRest will call the backend
+ httpBackend.expectGET(`${AppConfig.apiEndpoint}/core/tests`)
+ .respond(queryData);
+ }));
+
+ it('should return an Observable', () => {
+ expect(typeof service.query('test').subscribe).toBe('function');
+ });
+
+ it('the first event should be the resource response', (done) => {
+ let event = 0;
+ service.query('test')
+ .subscribe(collection => {
+ event++;
+ if (event === 2) {
+ expect(collection[0].id).toEqual(queryData[0].id);
+ expect(collection[1].id).toEqual(queryData[1].id);
+ done();
+ }
+ });
+ $scope.$apply();
+ httpBackend.flush();
+ });
+
+ describe('when a web-socket event is received for that model', () => {
+ it('should update the collection', (done) => {
+ let event = 0;
+ service.query('test')
+ .subscribe(
+ collection => {
+ event++;
+ if (event === 3) {
+ expect(collection[0].id).toEqual(queryData[0].id);
+ expect(collection[1].id).toEqual(queryData[1].id);
+ expect(collection[2].id).toEqual(3);
+ expect(collection[2].name).toEqual('baz');
+ done();
+ }
+ },
+ err => {
+ console.log(err);
+ done(err);
+ }
+ );
+ window.setTimeout(() => {
+ WebSocket.next({
+ model: 'test',
+ msg: {
+ changed_fields: ['id'],
+ object: {id: 3, name: 'baz'},
+ pk: 3
+ }
+ });
+ }, 1);
+ $scope.$apply();
+ httpBackend.flush();
+ });
+ });
+});
diff --git a/src/app/datasources/stores/model.store.ts b/src/app/datasources/stores/model.store.ts
index f31d571..d306f9d 100644
--- a/src/app/datasources/stores/model.store.ts
+++ b/src/app/datasources/stores/model.store.ts
@@ -11,11 +11,11 @@
export class ModelStore {
static $inject = ['WebSocket', 'StoreHelpers', 'ModelRest'];
- private _slices: BehaviorSubject<any[]> = new BehaviorSubject([]);
+ private _collection: BehaviorSubject<any[]> = new BehaviorSubject([]);
constructor(
private webSocket: IWSEventService,
private storeHelpers: IStoreHelpersService,
- private sliceService: IXosResourceService
+ private ModelRest: IXosResourceService
) {
}
@@ -25,18 +25,19 @@
.filter((e: IWSEvent) => e.model === model)
.subscribe(
(event: IWSEvent) => {
- this.storeHelpers.updateCollection(event, this._slices);
- }
+ this.storeHelpers.updateCollection(event, this._collection);
+ },
+ err => console.error
);
- return this._slices.asObservable();
+ return this._collection.asObservable();
}
private loadInitialData(model: string) {
const endpoint = `/core/${model.toLowerCase()}s/`;
- this.sliceService.getResource(endpoint).query().$promise
+ this.ModelRest.getResource(endpoint).query().$promise
.then(
res => {
- this._slices.next(res);
+ this._collection.next(res);
},
err => console.log(`Error retrieving ${model}`, err)
);