Merge "Change the npm repo"
diff --git a/docs/release-notes.rst b/docs/release-notes.rst
index 7f95b7c..525001d 100644
--- a/docs/release-notes.rst
+++ b/docs/release-notes.rst
@@ -26,6 +26,7 @@
 **Known Issues**
 
     - `CLAMP-506 <https://jira.onap.org/browse/CLAMP-506>`_ Elastic Search Clamp image cannot be built anymore(SearchGuard DMCA issue)
+    - Due to the uncertainties with the DMCA SearchGuard issue, the ELK stack has been removed from El Alto release, meaning the CLAMP "Control Loop Dashboard" is not part of the El Alto release.
     - `CLAMP-519 <https://jira.onap.org/browse/CLAMP-519>`_ Clamp cannot authenticate to AAF(Local authentication as workaround)
 
 
diff --git a/pom.xml b/pom.xml
index ad05fee..cae53df 100644
--- a/pom.xml
+++ b/pom.xml
@@ -97,7 +97,7 @@
 		<sonar.javascript.lcov.reportPaths>${project.build.directory}/${ui.react.src}/coverage/lcov.info</sonar.javascript.lcov.reportPaths>
 
 		<sonar.exclusions>src/main/resources/**</sonar.exclusions>
-
+		<sonar.coverage.exclusions>src/main/resources/**,target/ui-react/src/**/*.test.js,target/ui-react/src/setupTests.js,src/main/docker/kibana/*.py</sonar.coverage.exclusions>
 		<docker.push.registry>localhost:5000</docker.push.registry>
 		<docker.pull.registry>nexus3.onap.org:10001</docker.pull.registry>
 		<docker.skip.build>true</docker.skip.build>
diff --git a/ui-react/src/components/loop_viewer/svg/LoopSvg.js b/ui-react/src/components/loop_viewer/svg/LoopSvg.js
index 48f0335..06cfd23 100644
--- a/ui-react/src/components/loop_viewer/svg/LoopSvg.js
+++ b/ui-react/src/components/loop_viewer/svg/LoopSvg.js
@@ -61,7 +61,7 @@
 		return this.state.svgContent !== nextState.svgContent;
 	}
 
-	componentWillReceiveProps(newProps) {	
+	componentWillReceiveProps(newProps) {
 		if (this.state.loopCache !== newProps.loopCache) {
 			this.setState({
 				loopCache: newProps.loopCache,
diff --git a/ui-react/src/components/loop_viewer/svg/LoopSvg.test.js b/ui-react/src/components/loop_viewer/svg/LoopSvg.test.js
index 5a28328..6351854 100644
--- a/ui-react/src/components/loop_viewer/svg/LoopSvg.test.js
+++ b/ui-react/src/components/loop_viewer/svg/LoopSvg.test.js
@@ -23,12 +23,111 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 import LoopSvg from './LoopSvg';
+import LoopCache from '../../../api/LoopCache';
+import LoopService from '../../../api/LoopService';
 
 describe('Verify LoopSvg', () => {
+    const loopCache = new LoopCache({
+        "name": "LOOP_Jbv1z_v1_0_ResourceInstanceName1_tca",
+        "microServicePolicies": [{
+            "name": "TCA_h2NMX_v1_0_ResourceInstanceName1_tca",
+            "modelType": "onap.policies.monitoring.cdap.tca.hi.lo.app",
+            "properties": {"domain": "measurementsForVfScaling"},
+            "shared": false,
+            "jsonRepresentation": {"schema": {}}
+        }],
+        "operationalPolicies": [{
+            "name": "OPERATIONAL_h2NMX_v1_0_ResourceInstanceName1_tca",
+            "configurationsJson": {
+                "guard_policies": {},
+                "operational_policy": {
+                    "controlLoop": {},
+                    "policies": []
+                }
+            }
+        }]
+    });
 
-	it('Test the render method', () => {
-		const component = shallow(<LoopSvg />)
+    it('Test the render method no loopName', () => {
+        const localLoopCache = new LoopCache({
+        "microServicePolicies": [{
+            "name": "TCA_h2NMX_v1_0_ResourceInstanceName1_tca",
+            "modelType": "onap.policies.monitoring.cdap.tca.hi.lo.app",
+            "properties": {"domain": "measurementsForVfScaling"},
+            "shared": false,
+            "jsonRepresentation": {"schema": {}}
+          }]
+        });
+        const component = shallow(
+            <LoopSvg.WrappedComponent loopCache={localLoopCache}/>
+        );
 
-		expect(component).toMatchSnapshot();
-	});
+        expect(component).toMatchSnapshot();
+    });
+
+    it('Test the render method', () => {
+        const component = shallow(
+            <LoopSvg.WrappedComponent  loopCache={loopCache}/>
+        );
+
+        expect(component).toMatchSnapshot();
+    });
+
+    it('Test the render method svg not empty', async () => {
+        const flushPromises = () => new Promise(setImmediate);
+        LoopService.getSvg = jest.fn().mockImplementation(() => {
+            return Promise.resolve("<svg><text test</text></svg>");
+        });
+        const component = shallow(
+            <LoopSvg.WrappedComponent  loopCache={loopCache}/>
+        );
+        await flushPromises();
+        expect(component).toMatchSnapshot();
+    });
+
+    it('Test handleSvgClick', () => {
+        const historyMock = { push: jest.fn() };
+
+        const component = shallow(
+            <LoopSvg.WrappedComponent loopCache={loopCache} history={historyMock}/>
+        );
+        let dummyElement = document.createElement('div');
+        dummyElement.setAttribute("data-element-id","TCA_h2NMX_v1_0_ResourceInstanceName1_tca");
+
+        const event = { target: { parentNode: { parentNode:{ parentNode: dummyElement }}}};
+
+        component.simulate('click', event);
+        component.update();
+
+        expect(historyMock.push.mock.calls[0]).toEqual([ '/configurationPolicyModal/TCA_h2NMX_v1_0_ResourceInstanceName1_tca']);
+
+        //click operational policy
+        dummyElement.setAttribute("data-element-id","OPERATIONAL_h2NMX_v1_0_ResourceInstanceName1_tca");
+        const event2 = { target: { parentNode: { parentNode:{ parentNode: dummyElement }}}};
+
+        component.simulate('click', event2);
+        component.update();
+
+        expect(historyMock.push.mock.calls[1]).toEqual([ '/operationalPolicyModal']);
+    });
+
+    it('Test componentWillReceiveProps method', () => {
+        const localLoopCache = new LoopCache({
+        "microServicePolicies": [{
+            "name": "TCA_h2NMX_v1_0_ResourceInstanceName1_tca",
+            "modelType": "onap.policies.monitoring.cdap.tca.hi.lo.app",
+            "properties": {"domain": "measurementsForVfScaling"},
+            "shared": false,
+            "jsonRepresentation": {"schema": {}}
+          }]
+        });
+        const component = shallow(
+            <LoopSvg.WrappedComponent loopCache={localLoopCache}/>
+        );
+
+        expect(component.state('componentModalMapping').size).toEqual(2);
+
+        component.setProps({loopCache: loopCache});
+        expect(component.state('componentModalMapping').size).toEqual(3);
+    });
 });
diff --git a/ui-react/src/components/loop_viewer/svg/__snapshots__/LoopSvg.test.js.snap b/ui-react/src/components/loop_viewer/svg/__snapshots__/LoopSvg.test.js.snap
index 23d2225..cecfb42 100644
--- a/ui-react/src/components/loop_viewer/svg/__snapshots__/LoopSvg.test.js.snap
+++ b/ui-react/src/components/loop_viewer/svg/__snapshots__/LoopSvg.test.js.snap
@@ -1,7 +1,34 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
 exports[`Verify LoopSvg Test the render method 1`] = `
-<ContextConsumer>
-  <Component />
-</ContextConsumer>
+<styled.div
+  dangerouslySetInnerHTML={
+    Object {
+      "__html": "<svg><text x=\\"20\\" y=\\"40\\">No LOOP (SVG)</text></svg>",
+    }
+  }
+  onClick={[Function]}
+/>
+`;
+
+exports[`Verify LoopSvg Test the render method no loopName 1`] = `
+<styled.div
+  dangerouslySetInnerHTML={
+    Object {
+      "__html": "<svg><text x=\\"20\\" y=\\"40\\">No LOOP (SVG)</text></svg>",
+    }
+  }
+  onClick={[Function]}
+/>
+`;
+
+exports[`Verify LoopSvg Test the render method svg not empty 1`] = `
+<styled.div
+  dangerouslySetInnerHTML={
+    Object {
+      "__html": "<svg><text test</text></svg>",
+    }
+  }
+  onClick={[Function]}
+/>
 `;