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