Added tests for the details panel service

Change-Id: I76c09bab2843fafe3e67d5905be77c56d7319aed
diff --git a/web/gui/src/main/webapp/tests/app/fw/layer/details-panel-spec.js b/web/gui/src/main/webapp/tests/app/fw/layer/details-panel-spec.js
new file mode 100644
index 0000000..06148c1
--- /dev/null
+++ b/web/gui/src/main/webapp/tests/app/fw/layer/details-panel-spec.js
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2015-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Layer -- Veil Service - Unit Tests
+ */
+
+describe('factory: fw/layer/details-panel.js', function () {
+    var $log, $timeout, fs, ps, dps, d3Elem, $scope;
+
+    beforeEach(module('onosLayer', 'onosMast', 'onosRemote', 'onosSvg'));
+
+    beforeEach(inject(function (_$log_, _$timeout_, $rootScope, FnService, PanelService, DetailsPanelService) {
+        $log = _$log_;
+        $timeout = _$timeout_;
+        $scope = $rootScope.$new();
+        fs = FnService;
+        dps = DetailsPanelService;
+        ps = PanelService;
+
+        spyOn(fs, 'debugOn').and.returnValue(true);
+        d3Elem = d3.select('body').append('div').attr('id', 'floatpanels');
+        d3.select('body').append('div').attr('class', 'tabular-header').style({ height: 10 });
+        ps.init();
+
+    }));
+
+    afterEach(function () {
+        d3.select('#floatpanels').remove();
+        ps.init();
+    });
+
+    function floatPanelSelection() {
+        return d3Elem.selectAll('.floatpanel');
+    }
+
+    it('should define PanelService', function () {
+        expect(ps).toBeDefined();
+    });
+
+    it('should define api functions', function () {
+        expect(fs.areFunctions(dps, [
+            'create', 'setResponse',
+            'addContainers', 'addCloseButton', 'addHeading', 'addPropsList',
+            'container', 'top', 'bottom', 'select',
+            'empty', 'hide', 'destroy',
+        ])).toBeTruthy();
+    });
+
+    it('should create a default panel', function () {
+        var p = dps.create('foo', { scope: $scope });
+        expect(p).toBeDefined();
+    });
+
+    it('should add response handler', function () {
+        var p = dps.create('foo', { scope: $scope });
+        dps.setResponse('responseName', function () {});
+    });
+
+    it('should add content', function () {
+        var p = dps.create('foo', { scope: $scope });
+
+        dps.addContainers();
+        dps.addCloseButton(function () {});
+
+        expect(dps.container()).toBeDefined();
+        expect(dps.top()).toBeDefined();
+        expect(dps.bottom()).toBeDefined();
+
+        var top = dps.top();
+        top.append('div').classed('top-content', true);
+        dps.addHeading('icon', false);
+        dps.addPropsList(dps.select('.top-content'), { id: 'foo', name: 'bar' });
+
+        // TODO: props have been added to the table
+        // TODO: close button has been created
+        // TODO: heading placeholder has been added
+    });
+
+    it('should add editable header', function () {
+        var p = dps.create('foo', { scope: $scope });
+        dps.addHeading('icon', true);
+        // TODO: editable heading placeholder has been added
+    });
+
+    it('should add unbind on destroy', function () {
+        var p = dps.create('foo', { scope: $scope });
+        dps.setResponse('responseName', function () {});
+        dps.destroy();
+    });
+
+});
\ No newline at end of file