[CORD-1250] Rendering new ServiceInstance Models

Change-Id: Ic8fdb4775b119816b4b7aa085e6af699eaa13a67
diff --git a/src/app/service-graph/services/service-graph.store.spec.ts b/src/app/service-graph/services/service-graph.store.spec.ts
new file mode 100644
index 0000000..7ddc393
--- /dev/null
+++ b/src/app/service-graph/services/service-graph.store.spec.ts
@@ -0,0 +1,140 @@
+import * as angular from 'angular';
+import 'angular-mocks';
+import 'angular-ui-router';
+import {IXosServiceGraphStore, XosServiceGraphStore} from './service-graph.store';
+import {Subject} from 'rxjs';
+import {XosDebouncer} from '../../core/services/helpers/debounce.helper';
+import {IXosServiceGraph} from '../interfaces';
+import {XosServiceGraphExtender, IXosServiceGraphExtender} from './graph.extender';
+
+let service: IXosServiceGraphStore, extender: IXosServiceGraphExtender;
+
+const subjects = {
+  service: new Subject<any>(),
+  tenant: new Subject<any>(),
+  subscriber: new Subject<any>(),
+  tenantroot: new Subject<any>(),
+  network: new Subject<any>(),
+  servicedependency: new Subject<any>()
+};
+
+// COARSE data
+const coarseServices = [
+  {
+    id: 1,
+    name: 'Service A',
+    class_names: 'Service, XOSBase'
+  },
+  {
+    id: 2,
+    name: 'Service B',
+    class_names: 'Service, XOSBase'
+  }
+];
+
+const coarseTenants = [
+  {
+    id: 1,
+    provider_service_id: 2,
+    subscriber_service_id: 1,
+    kind: 'coarse',
+    class_names: 'Tenant, XOSBase'
+  }
+];
+
+const mockModelStore = {
+  query: (modelName: string) => {
+    return subjects[modelName.toLowerCase()].asObservable();
+  }
+};
+
+describe('The XosServiceGraphStore service', () => {
+
+  beforeEach(() => {
+    angular.module('xosServiceGraphStore', [])
+      .service('XosServiceGraphStore', XosServiceGraphStore)
+      .value('XosModelStore', mockModelStore)
+      .service('XosServiceGraphExtender', XosServiceGraphExtender)
+      .service('XosDebouncer', XosDebouncer);
+
+    angular.mock.module('xosServiceGraphStore');
+  });
+
+  beforeEach(angular.mock.inject((
+    XosServiceGraphStore: IXosServiceGraphStore,
+    XosServiceGraphExtender: IXosServiceGraphExtender
+  ) => {
+    service = XosServiceGraphStore;
+    extender = XosServiceGraphExtender;
+  }));
+
+  describe('when subscribing for the COARSE service graph', () => {
+    beforeEach((done) => {
+      subjects.service.next(coarseServices);
+      subjects.servicedependency.next(coarseTenants);
+      setTimeout(done, 500);
+    });
+
+    it('should return an observer for the Coarse Service Graph', (done) => {
+      service.getCoarse()
+        .subscribe(
+          (res: IXosServiceGraph) => {
+            expect(res.nodes.length).toBe(2);
+            expect(res.nodes[0].d3Class).toBeUndefined();
+            expect(res.links.length).toBe(1);
+            expect(res.links[0].d3Class).toBeUndefined();
+            done();
+          },
+          (err) => {
+            done(err);
+          }
+        );
+    });
+
+    xdescribe('when a reducer is registered', () => {
+      // NOTE the reducer appliance has been moved in the component
+      beforeEach((done) => {
+        extender.register('coarse', 'test', (graph: IXosServiceGraph) => {
+          graph.nodes = graph.nodes.map(n => {
+            n.d3Class = `testNode`;
+            return n;
+          });
+
+          graph.links = graph.links.map(n => {
+            n.d3Class = `testLink`;
+            return n;
+          });
+
+          return graph;
+        });
+
+        // triggering another next cycle to apply the reducer
+        subjects.service.next(coarseServices);
+        subjects.tenant.next(coarseTenants);
+        setTimeout(done, 500);
+      });
+
+      it('should transform the result', (done) => {
+        service.getCoarse()
+          .subscribe(
+            (res: IXosServiceGraph) => {
+              expect(res.nodes.length).toBe(2);
+              expect(res.nodes[0].d3Class).toEqual('testNode');
+              expect(res.links.length).toBe(1);
+              expect(res.links[0].d3Class).toEqual('testLink');
+              done();
+            },
+            (err) => {
+              done(err);
+            }
+          );
+      });
+    });
+  });
+
+  describe('when subscribing for the Fine-grained service graph', () => {
+    xit('should have a test', () => {
+      expect(true).toBeTruthy();
+    });
+  });
+});