[CORD-2324] Position the nodes not defined in the constraints

Change-Id: I712a90828e0b6a12b31f62f7391feee64c123f2c
diff --git a/src/app/service-graph/services/node-positioner.service.spec.ts b/src/app/service-graph/services/node-positioner.service.spec.ts
index 14fb9c4..c6308e9 100644
--- a/src/app/service-graph/services/node-positioner.service.spec.ts
+++ b/src/app/service-graph/services/node-positioner.service.spec.ts
@@ -43,7 +43,8 @@
   beforeEach(() => {
     angular.module('XosNodePositioner', [])
       .service('XosNodePositioner', XosNodePositioner)
-      .value('ModelRest', mockModelRest);
+      .value('ModelRest', mockModelRest)
+      .value('XosConfirm', {});
 
     angular.mock.module('XosNodePositioner');
   });
@@ -125,4 +126,30 @@
 
     scope.$apply();
   });
+
+  it('should set unpositioned nodes at the top', (done) => {
+    const svg = {width: 300, height: 200};
+    const nodes = [
+      {data: {name: 'a'}},
+      {data: {name: 'b'}},
+      {data: {name: 'c'}, type: 'service'},
+      {data: {name: 'd'}, type: 'service'}
+    ];
+    constraints = '["a", "b"]';
+
+    service.positionNodes(svg, nodes)
+      .then((positioned) => {
+        expect(positioned[0].x).toBe(100);
+        expect(positioned[0].y).toBe(100);
+        expect(positioned[1].x).toBe(200);
+        expect(positioned[1].y).toBe(100);
+        expect(positioned[2].x).toBe(100);
+        expect(positioned[2].y).toBe(150);
+        expect(positioned[3].x).toBe(200);
+        expect(positioned[3].y).toBe(150);
+        done();
+      });
+
+    scope.$apply();
+  });
 });