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();
+ });
+ });
+});