[CORD-1117] XOS GUI Various fix

Change-Id: I4237a5e23509e9173c958d76aa929a70583ba1e6
diff --git a/src/app/core/loader/loader.spec.ts b/src/app/core/loader/loader.spec.ts
new file mode 100644
index 0000000..1bcff9c
--- /dev/null
+++ b/src/app/core/loader/loader.spec.ts
@@ -0,0 +1,115 @@
+import * as angular from 'angular';
+import 'angular-mocks';
+import {xosLoader} from './loader';
+
+let loaded = true;
+
+const MockConfig = {
+  lastVisitedUrl: '/test'
+};
+
+const MockDiscover = {
+  areModelsLoaded: () => loaded,
+  discover: null
+};
+
+const MockOnboarder = {
+  onboard: null
+};
+
+describe('The XosLoader component', () => {
+  beforeEach(() => {
+    angular
+      .module('loader', [])
+      .value('XosConfig', MockConfig)
+      .value('XosModelDiscoverer', MockDiscover)
+      .value('XosOnboarder', MockOnboarder)
+      .component('xosLoader', xosLoader);
+    angular.mock.module('loader');
+  });
+
+  let scope, element, isolatedScope, rootScope, compile, timeout, location;
+  const compileElement = () => {
+
+    if (!scope) {
+      scope = rootScope.$new();
+    }
+
+    element = angular.element('<xos-loader></xos-loader>');
+    compile(element)(scope);
+    scope.$digest();
+    isolatedScope = element.isolateScope().vm;
+  };
+
+  beforeEach(inject(function ($q: ng.IQService, $compile: ng.ICompileService, $rootScope: ng.IScope, $timeout: ng.ITimeoutService, $location: ng.ILocationService) {
+    compile = $compile;
+    rootScope = $rootScope;
+    timeout = $timeout;
+    location = $location;
+    spyOn(location, 'path');
+
+    MockDiscover.discover = jasmine.createSpy('discover')
+      .and.callFake(() => {
+        const d = $q.defer();
+        d.resolve(true);
+        return d.promise;
+      });
+
+    MockOnboarder.onboard = jasmine.createSpy('onboard')
+      .and.callFake(() => {
+        const d = $q.defer();
+        d.resolve();
+        return d.promise;
+      });
+  }));
+
+  describe('when models are already loaded', () => {
+
+    beforeEach(() => {
+      compileElement();
+      spyOn(isolatedScope, 'moveOnTo');
+      isolatedScope.run();
+      timeout.flush();
+    });
+
+    it('should redirect to the last visited page', (done) => {
+      window.setTimeout(() => {
+        expect(isolatedScope.moveOnTo).toHaveBeenCalledWith('/test');
+        expect(location.path).toHaveBeenCalledWith('/test');
+        done();
+      }, 600);
+    });
+  });
+
+  describe('when the last visited page is "loader"', () => {
+
+    beforeEach(() => {
+      MockConfig.lastVisitedUrl = '/loader';
+      compileElement();
+      spyOn(isolatedScope, 'moveOnTo');
+      isolatedScope.run();
+    });
+
+    it('should redirect to the "dashboard" page', (done) => {
+      window.setTimeout(() => {
+        expect(isolatedScope.moveOnTo).toHaveBeenCalledWith('/loader');
+        expect(location.path).toHaveBeenCalledWith('/dashboard');
+        done();
+      }, 600);
+    });
+  });
+
+  describe('when models are not loaded', () => {
+
+    beforeEach(() => {
+      loaded = false;
+      compileElement();
+      spyOn(isolatedScope, 'moveOnTo');
+    });
+
+    it('should call XosModelDiscoverer.discover', () => {
+      expect(MockDiscover.discover).toHaveBeenCalled();
+    });
+  });
+
+});