[CORD-2742] Remove elements from the service graph
Change-Id: Ibcb9fac4428f0b168ff66fab3219b8357e732dc5
diff --git a/src/app/service-graph/services/graph.store.spec.ts b/src/app/service-graph/services/graph.store.spec.ts
index 53f24fc..ad67f12 100644
--- a/src/app/service-graph/services/graph.store.spec.ts
+++ b/src/app/service-graph/services/graph.store.spec.ts
@@ -22,6 +22,7 @@
import {Subject} from 'rxjs/Subject';
import {Graph} from 'graphlib';
import {XosDebouncer} from '../../core/services/helpers/debounce.helper';
+import {IWSEvent} from '../../datasources/websocket/global';
interface ITestXosGraphStore extends IXosGraphStore {
@@ -94,6 +95,7 @@
const subject_servicedependency = new Subject();
const subject_serviceinstances = new Subject();
const subject_serviceinstancelinks = new Subject();
+const subject_websocket = new Subject();
let MockModelStore = {
query: jasmine.createSpy('XosModelStore.query')
@@ -113,6 +115,11 @@
})
};
+let MockWebSocket = {
+ list: jasmine.createSpy('WebSocket.list')
+ .and.returnValue(subject_websocket)
+};
+
describe('The XosGraphStore service', () => {
@@ -120,6 +127,7 @@
angular.module('XosGraphStore', [])
.service('XosGraphStore', XosGraphStore)
.value('XosModelStore', MockModelStore)
+ .value('WebSocket', MockWebSocket)
.service('XosDebouncer', XosDebouncer);
angular.mock.module('XosGraphStore');
@@ -134,25 +142,128 @@
}));
- it('should load services and service-dependency and add nodes to the graph', (done) => {
- let event = 0;
- service.get().subscribe(
- (graph: Graph) => {
- if (event === 1) {
- expect(graph.nodes().length).toBe(services.length);
- expect(graph.nodes()).toEqual(['service~1', 'service~2']);
- expect(graph.edges().length).toBe(servicedependencies.length);
- expect(graph.edges()).toEqual([{v: 'service~1', w: 'service~2'}]);
- done();
+ describe('when started', () => {
+
+ let subscription;
+
+ it('should load services and service-dependency and add nodes to the graph', (done) => {
+ let event = 0;
+ subscription = service.get().subscribe(
+ (graph: Graph) => {
+ if (event === 1) {
+ expect(graph.nodes().length).toBe(services.length);
+ expect(graph.nodes()).toEqual(['service~1', 'service~2']);
+ expect(graph.edges().length).toBe(servicedependencies.length);
+ expect(graph.edges()).toEqual([{v: 'service~1', w: 'service~2'}]);
+ done();
+ }
+ else {
+ event = event + 1;
+ }
}
- else {
- event = event + 1;
+ );
+ subject_services.next(services);
+ subject_servicedependency.next(servicedependencies);
+ scope.$apply();
+ });
+
+ afterEach(() => {
+ subscription.unsubscribe();
+ });
+ });
+
+ describe('when an observed model is removed', () => {
+
+ let subscription;
+
+ beforeEach(() => {
+ subject_services.next([]);
+ subject_servicedependency.next([]);
+ subject_services.next(services);
+ subject_servicedependency.next(servicedependencies);
+ service.addServiceInstances();
+ subject_serviceinstances.next([serviceInstances[0]]);
+ });
+
+ it('should be removed from the graph', (done) => {
+ let event = 0;
+ subscription = service.get().subscribe(
+ (graph: Graph) => {
+ if (event === 1) {
+ expect(graph.nodes().length).toBe(0);
+ expect(graph.nodes()).toEqual([]);
+ expect(graph.edges().length).toBe(0);
+ expect(graph.edges()).toEqual([]);
+ done();
+ }
+ else {
+ event = event + 1;
+ }
}
- }
- );
- subject_services.next(services);
- subject_servicedependency.next(servicedependencies);
- scope.$apply();
+ );
+
+ const removeService1: IWSEvent = {
+ model: 'Service',
+ deleted: true,
+ msg: {
+ changed_fields: [],
+ pk: 1,
+ object: {
+ id: 1,
+ class_names: 'Service, XOSBase'
+ }
+ }
+ };
+
+ const removeService2: IWSEvent = {
+ model: 'Service',
+ deleted: true,
+ msg: {
+ changed_fields: [],
+ pk: 2,
+ object: {
+ id: 2,
+ class_names: 'Service, XOSBase'
+ }
+ }
+ };
+
+ const removeServiceDependency1: IWSEvent = {
+ model: 'ServiceDependency',
+ deleted: true,
+ msg: {
+ changed_fields: [],
+ pk: 1,
+ object: {
+ id: 1,
+ class_names: 'ServiceDependency, XOSBase'
+ }
+ }
+ };
+
+ const removeServiceInstnace1: IWSEvent = {
+ model: 'VSGServiceInstance',
+ deleted: true,
+ msg: {
+ changed_fields: [],
+ pk: 1,
+ object: {
+ id: 1,
+ class_names: 'VSGServiceInstance,TenantWithContainer,ServiceInstance'
+ }
+ }
+ };
+
+ subject_websocket.next(removeService1);
+ subject_websocket.next(removeService2);
+ subject_websocket.next(removeServiceDependency1);
+ subject_websocket.next(removeServiceInstnace1);
+ scope.$apply();
+ });
+
+ afterEach(() => {
+ subscription.unsubscribe();
+ });
});
describe(`the getModelType`, () => {