blob: d4b88dda90a4bcb893ba18875201c73160a568a3 [file] [log] [blame]
Matteo Scandolo9b460042017-04-14 16:24:45 -07001import * as angular from 'angular';
2import 'angular-mocks';
3import {xosLoader} from './loader';
4
5let loaded = true;
Matteo Scandolobd60dee2017-05-08 17:53:25 -07006let authenticated = true;
Matteo Scandolo9b460042017-04-14 16:24:45 -07007
8const MockConfig = {
9 lastVisitedUrl: '/test'
10};
11
12const MockDiscover = {
13 areModelsLoaded: () => loaded,
14 discover: null
15};
16
17const MockOnboarder = {
18 onboard: null
19};
20
Matteo Scandolobd60dee2017-05-08 17:53:25 -070021const MockAuth = {
22 isAuthenticated: jasmine.createSpy('isAuthenticated')
23 .and.callFake(() => authenticated)
24};
25
26const MockState = {
27 go: jasmine.createSpy('state.go')
28};
29
Matteo Scandolo9b460042017-04-14 16:24:45 -070030describe('The XosLoader component', () => {
31 beforeEach(() => {
32 angular
33 .module('loader', [])
34 .value('XosConfig', MockConfig)
35 .value('XosModelDiscoverer', MockDiscover)
36 .value('XosOnboarder', MockOnboarder)
Matteo Scandolobd60dee2017-05-08 17:53:25 -070037 .value('AuthService', MockAuth)
38 .value('$state', MockState)
Matteo Scandolo9b460042017-04-14 16:24:45 -070039 .component('xosLoader', xosLoader);
40 angular.mock.module('loader');
41 });
42
43 let scope, element, isolatedScope, rootScope, compile, timeout, location;
44 const compileElement = () => {
45
46 if (!scope) {
47 scope = rootScope.$new();
48 }
49
50 element = angular.element('<xos-loader></xos-loader>');
51 compile(element)(scope);
52 scope.$digest();
53 isolatedScope = element.isolateScope().vm;
54 };
55
56 beforeEach(inject(function ($q: ng.IQService, $compile: ng.ICompileService, $rootScope: ng.IScope, $timeout: ng.ITimeoutService, $location: ng.ILocationService) {
57 compile = $compile;
58 rootScope = $rootScope;
59 timeout = $timeout;
60 location = $location;
61 spyOn(location, 'path');
62
63 MockDiscover.discover = jasmine.createSpy('discover')
64 .and.callFake(() => {
65 const d = $q.defer();
66 d.resolve(true);
67 return d.promise;
68 });
69
70 MockOnboarder.onboard = jasmine.createSpy('onboard')
71 .and.callFake(() => {
72 const d = $q.defer();
73 d.resolve();
74 return d.promise;
75 });
76 }));
77
78 describe('when models are already loaded', () => {
79
80 beforeEach(() => {
81 compileElement();
82 spyOn(isolatedScope, 'moveOnTo');
83 isolatedScope.run();
84 timeout.flush();
85 });
86
87 it('should redirect to the last visited page', (done) => {
88 window.setTimeout(() => {
89 expect(isolatedScope.moveOnTo).toHaveBeenCalledWith('/test');
90 expect(location.path).toHaveBeenCalledWith('/test');
91 done();
92 }, 600);
93 });
94 });
95
96 describe('when the last visited page is "loader"', () => {
97
98 beforeEach(() => {
99 MockConfig.lastVisitedUrl = '/loader';
100 compileElement();
101 spyOn(isolatedScope, 'moveOnTo');
102 isolatedScope.run();
103 });
104
105 it('should redirect to the "dashboard" page', (done) => {
106 window.setTimeout(() => {
107 expect(isolatedScope.moveOnTo).toHaveBeenCalledWith('/loader');
108 expect(location.path).toHaveBeenCalledWith('/dashboard');
109 done();
110 }, 600);
111 });
112 });
113
Matteo Scandolobd60dee2017-05-08 17:53:25 -0700114 describe('when user is not authenticated', () => {
115
116 beforeEach(() => {
117 loaded = false;
118 authenticated = false;
119 compileElement();
120 isolatedScope.run();
121 });
122
123 it('should redirect to the login page', () => {
124 expect(MockState.go).toHaveBeenCalledWith('xos.login');
125 });
126
127 afterEach(() => {
128 authenticated = true;
129 });
130 });
131
Matteo Scandolo9b460042017-04-14 16:24:45 -0700132 describe('when models are not loaded', () => {
133
134 beforeEach(() => {
135 loaded = false;
136 compileElement();
137 spyOn(isolatedScope, 'moveOnTo');
138 });
139
140 it('should call XosModelDiscoverer.discover', () => {
141 expect(MockDiscover.discover).toHaveBeenCalled();
142 });
143 });
144
145});