@worktile/planet 10.0.0 → 12.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.all-contributorsrc +84 -0
- package/.circleci/config.yml +17 -0
- package/.coveralls.yml +1 -0
- package/.docgeni/public/assets/favicon.ico +0 -0
- package/.docgeni/public/index.html +13 -0
- package/.docgenirc.js +35 -0
- package/.dockerignore +1 -0
- package/.editorconfig +22 -0
- package/.github/FUNDING.yml +12 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- package/.prettierignore +7 -0
- package/.prettierrc +28 -0
- package/.travis.yml +26 -0
- package/.wpmrc.js +11 -0
- package/CHANGELOG.md +391 -0
- package/CODE_OF_CONDUCT.md +76 -0
- package/Dockerfile +11 -0
- package/LICENSE +21 -0
- package/README.md +348 -0
- package/README.zh-CN.md +307 -0
- package/SECURITY.md +21 -0
- package/angular.json +373 -0
- package/commitlint.config.js +6 -0
- package/docs/api/defineApplication.md +46 -0
- package/docs/api/globalEventDispatcher.md +51 -0
- package/docs/api/index.md +5 -0
- package/docs/api/planet.md +117 -0
- package/docs/guides/getting-started.md +174 -0
- package/docs/guides/index.md +5 -0
- package/docs/guides/intro.md +216 -0
- package/examples/app1/browserslist +11 -0
- package/examples/app1/extra-webpack.config.js +33 -0
- package/examples/app1/karma.conf.js +31 -0
- package/examples/app1/postcss.config.js +1 -0
- package/examples/app1/src/app/app.module.ts +44 -0
- package/examples/app1/src/app/app.routing.ts +49 -0
- package/examples/app1/src/app/counter.service.ts +16 -0
- package/examples/app1/src/app/dashboard/dashboard.component.html +51 -0
- package/examples/app1/src/app/dashboard/dashboard.component.ts +70 -0
- package/examples/app1/src/app/detail/detail.component.html +8 -0
- package/examples/app1/src/app/detail/detail.component.ts +18 -0
- package/examples/app1/src/app/overlay.ts +26 -0
- package/examples/app1/src/app/projects/dialog/projects-dialog.component.html +10 -0
- package/examples/app1/src/app/projects/dialog/projects-dialog.component.ts +41 -0
- package/examples/app1/src/app/projects/projects.component.ts +33 -0
- package/examples/app1/src/app/root/root.component.css +3 -0
- package/examples/app1/src/app/root/root.component.html +16 -0
- package/examples/app1/src/app/root/root.component.ts +35 -0
- package/examples/app1/src/app/services/initialized-data.resolver.ts +15 -0
- package/examples/app1/src/app/shared.module.ts +57 -0
- package/examples/app1/src/app/user/detail/user-detail.component.html +5 -0
- package/examples/app1/src/app/user/detail/user-detail.component.ts +20 -0
- package/examples/app1/src/app/user/user-list.component.html +7 -0
- package/examples/app1/src/app/user/user-list.component.ts +20 -0
- package/examples/app1/src/app/user/user.module.ts +31 -0
- package/examples/app1/src/assets/.gitkeep +0 -0
- package/examples/app1/src/assets/github.png +0 -0
- package/examples/app1/src/assets/main.css +3 -0
- package/examples/app1/src/environments/environment.prod.ts +3 -0
- package/examples/app1/src/environments/environment.ts +16 -0
- package/examples/app1/src/favicon.ico +0 -0
- package/examples/app1/src/index.html +14 -0
- package/examples/app1/src/main.ts +35 -0
- package/examples/app1/src/polyfills.ts +84 -0
- package/examples/app1/src/styles.scss +35 -0
- package/examples/app1/src/test.ts +14 -0
- package/examples/app1/temp.js +221 -0
- package/examples/app1/tsconfig.app.json +10 -0
- package/examples/app1/tsconfig.spec.json +18 -0
- package/examples/app1/tslint.json +17 -0
- package/examples/app1/webpack.config.js +127 -0
- package/examples/app2/browserslist +11 -0
- package/examples/app2/extra-webpack.config.js +32 -0
- package/examples/app2/karma.conf.js +31 -0
- package/examples/app2/src/app/app.module.ts +90 -0
- package/examples/app2/src/app/dashboard/dashboard.component.html +21 -0
- package/examples/app2/src/app/dashboard/dashboard.component.ts +27 -0
- package/examples/app2/src/app/overlay.ts +26 -0
- package/examples/app2/src/app/projects/detail/detail.component.html +16 -0
- package/examples/app2/src/app/projects/detail/detail.component.ts +21 -0
- package/examples/app2/src/app/projects/project-list.component.html +29 -0
- package/examples/app2/src/app/projects/project-list.component.ts +58 -0
- package/examples/app2/src/app/projects/project.resolver.ts +15 -0
- package/examples/app2/src/app/projects/projects.service.ts +28 -0
- package/examples/app2/src/app/projects/tasks/tasks.component.html +10 -0
- package/examples/app2/src/app/projects/tasks/tasks.component.ts +16 -0
- package/examples/app2/src/app/projects/view/view.component.html +1 -0
- package/examples/app2/src/app/projects/view/view.component.ts +20 -0
- package/examples/app2/src/app/root/root.component.html +14 -0
- package/examples/app2/src/app/root/root.component.scss +12 -0
- package/examples/app2/src/app/root/root.component.ts +28 -0
- package/examples/app2/src/app/shared.module.ts +59 -0
- package/examples/app2/src/assets/.gitkeep +0 -0
- package/examples/app2/src/environments/environment.prod.ts +3 -0
- package/examples/app2/src/environments/environment.ts +16 -0
- package/examples/app2/src/favicon.ico +0 -0
- package/examples/app2/src/index.html +14 -0
- package/examples/app2/src/main.ts +36 -0
- package/examples/app2/src/polyfills.ts +84 -0
- package/examples/app2/src/styles.scss +28 -0
- package/examples/app2/src/test.ts +14 -0
- package/examples/app2/tsconfig.app.json +10 -0
- package/examples/app2/tsconfig.spec.json +18 -0
- package/examples/app2/tslint.json +7 -0
- package/examples/app2/webpack.config.js +92 -0
- package/examples/common/app-root-context.ts +10 -0
- package/examples/common/cache.ts +82 -0
- package/examples/common/index.ts +13 -0
- package/examples/common/module.ts +10 -0
- package/examples/common/overlay-container.service.ts +28 -0
- package/examples/common/section-card/section-card.component.html +5 -0
- package/examples/common/section-card/section-card.component.scss +15 -0
- package/examples/common/section-card/section-card.component.ts +11 -0
- package/examples/common/utils.ts +0 -0
- package/examples/portal/src/app/a-detail/a-detail.component.html +8 -0
- package/examples/portal/src/app/a-detail/a-detail.component.ts +18 -0
- package/examples/portal/src/app/about/about.component.html +27 -0
- package/examples/portal/src/app/about/about.component.scss +0 -0
- package/examples/portal/src/app/about/about.component.spec.ts +26 -0
- package/examples/portal/src/app/about/about.component.ts +26 -0
- package/examples/portal/src/app/app-routing.module.ts +57 -0
- package/examples/portal/src/app/app.component.html +73 -0
- package/examples/portal/src/app/app.component.scss +58 -0
- package/examples/portal/src/app/app.component.spec.ts +33 -0
- package/examples/portal/src/app/app.component.ts +111 -0
- package/examples/portal/src/app/app.module.ts +64 -0
- package/examples/portal/src/app/custom-settings.service.ts +44 -0
- package/examples/portal/src/app/overlay.ts +26 -0
- package/examples/portal/src/app/settings/settings.component.html +31 -0
- package/examples/portal/src/app/settings/settings.component.scss +3 -0
- package/examples/portal/src/app/settings/settings.component.ts +43 -0
- package/examples/portal/src/assets/.gitkeep +0 -0
- package/examples/portal/src/assets/apps.json +29 -0
- package/examples/portal/src/assets/icons/sprite.defs.svg +1 -0
- package/examples/portal/src/assets/images/logo.svg +16 -0
- package/examples/portal/src/assets/ngx-planet-micro-front-end.gif +0 -0
- package/examples/portal/src/browserslist +11 -0
- package/examples/portal/src/environments/environment.prod.ts +3 -0
- package/examples/portal/src/environments/environment.ts +16 -0
- package/examples/portal/src/extra-webpack.config.js +32 -0
- package/examples/portal/src/favicon.ico +0 -0
- package/examples/portal/src/index.html +14 -0
- package/examples/portal/src/karma.conf.js +31 -0
- package/examples/portal/src/main.ts +18 -0
- package/examples/portal/src/polyfills.ts +84 -0
- package/examples/portal/src/reboot.scss +14 -0
- package/examples/portal/src/styles.scss +14 -0
- package/examples/portal/src/test.ts +14 -0
- package/examples/portal/src/tsconfig.app.json +10 -0
- package/examples/portal/src/tsconfig.spec.json +9 -0
- package/examples/portal/src/tslint.json +7 -0
- package/extra-webpack.config.js +5 -0
- package/nginx.conf +17 -0
- package/package.json +120 -15
- package/packages/planet/karma.conf.js +37 -0
- package/packages/planet/ng-package.json +7 -0
- package/packages/planet/package.json +10 -0
- package/packages/planet/src/application/planet-application-loader.spec.ts +1102 -0
- package/packages/planet/src/application/planet-application-loader.ts +549 -0
- package/packages/planet/src/application/planet-application-ref.spec.ts +233 -0
- package/packages/planet/src/application/planet-application-ref.ts +131 -0
- package/packages/planet/src/application/planet-application.service.spec.ts +145 -0
- package/packages/planet/src/application/planet-application.service.ts +88 -0
- package/packages/planet/src/application/portal-application.spec.ts +53 -0
- package/packages/planet/src/application/portal-application.ts +28 -0
- package/packages/planet/src/assets-loader.spec.ts +689 -0
- package/packages/planet/src/assets-loader.ts +247 -0
- package/packages/planet/src/component/planet-component-loader.spec.ts +187 -0
- package/packages/planet/src/component/planet-component-loader.ts +173 -0
- package/{component/planet-component-ref.d.ts → packages/planet/src/component/planet-component-ref.ts} +3 -2
- package/{component/plant-component.config.d.ts → packages/planet/src/component/plant-component.config.ts} +4 -3
- package/packages/planet/src/debug.spec.ts +58 -0
- package/packages/planet/src/debug.ts +66 -0
- package/packages/planet/src/empty/empty.component.spec.ts +34 -0
- package/packages/planet/src/empty/empty.component.ts +7 -0
- package/packages/planet/src/global-event-dispatcher.spec.ts +81 -0
- package/packages/planet/src/global-event-dispatcher.ts +82 -0
- package/packages/planet/src/global-planet.spec.ts +39 -0
- package/packages/planet/src/global-planet.ts +73 -0
- package/packages/planet/src/helpers.spec.ts +242 -0
- package/packages/planet/src/helpers.ts +125 -0
- package/packages/planet/src/module.spec.ts +79 -0
- package/packages/planet/src/module.ts +25 -0
- package/packages/planet/src/planet.class.ts +59 -0
- package/packages/planet/src/planet.spec.ts +226 -0
- package/packages/planet/src/planet.ts +113 -0
- package/{public-api.d.ts → packages/planet/src/public-api.ts} +4 -0
- package/packages/planet/src/sandbox/constants.ts +6 -0
- package/packages/planet/src/sandbox/exec.ts +22 -0
- package/packages/planet/src/sandbox/index.ts +24 -0
- package/packages/planet/src/sandbox/proxy/patches/document.ts +13 -0
- package/packages/planet/src/sandbox/proxy/patches/eventListener.ts +49 -0
- package/packages/planet/src/sandbox/proxy/patches/index.ts +13 -0
- package/packages/planet/src/sandbox/proxy/patches/storage.ts +53 -0
- package/packages/planet/src/sandbox/proxy/patches/timer.ts +50 -0
- package/packages/planet/src/sandbox/proxy/proxies/common.ts +137 -0
- package/packages/planet/src/sandbox/proxy/proxies/document.ts +140 -0
- package/packages/planet/src/sandbox/proxy/proxies/window.ts +176 -0
- package/packages/planet/src/sandbox/proxy/proxy-sandbox.ts +59 -0
- package/packages/planet/src/sandbox/proxy/types.ts +20 -0
- package/packages/planet/src/sandbox/sandbox.ts +20 -0
- package/packages/planet/src/sandbox/snapshot/snapshot-sandbox.ts +12 -0
- package/packages/planet/src/sandbox/types.ts +1 -0
- package/packages/planet/src/test.ts +16 -0
- package/packages/planet/src/testing/app1.module.ts +34 -0
- package/packages/planet/src/testing/app2.module.ts +24 -0
- package/packages/planet/src/testing/applications.ts +58 -0
- package/packages/planet/src/testing/index.ts +2 -0
- package/packages/planet/src/testing/utils.ts +31 -0
- package/packages/planet/tsconfig.lib.json +27 -0
- package/packages/planet/tsconfig.lib.prod.json +9 -0
- package/packages/planet/tsconfig.spec.json +17 -0
- package/packages/planet/tslint.json +7 -0
- package/postcss.config.js +3 -0
- package/proxy.conf.js +15 -0
- package/tsconfig.json +23 -0
- package/tslint.json +80 -0
- package/application/planet-application-loader.d.ts +0 -68
- package/application/planet-application-ref.d.ts +0 -32
- package/application/planet-application.service.d.ts +0 -18
- package/application/portal-application.d.ts +0 -14
- package/assets-loader.d.ts +0 -23
- package/bundles/worktile-planet.umd.js +0 -1670
- package/bundles/worktile-planet.umd.js.map +0 -1
- package/bundles/worktile-planet.umd.min.js +0 -16
- package/bundles/worktile-planet.umd.min.js.map +0 -1
- package/component/planet-component-loader.d.ts +0 -27
- package/empty/empty.component.d.ts +0 -2
- package/esm2015/application/planet-application-loader.js +0 -417
- package/esm2015/application/planet-application-ref.js +0 -86
- package/esm2015/application/planet-application.service.js +0 -87
- package/esm2015/application/portal-application.js +0 -16
- package/esm2015/assets-loader.js +0 -165
- package/esm2015/component/planet-component-loader.js +0 -157
- package/esm2015/component/planet-component-ref.js +0 -3
- package/esm2015/component/plant-component.config.js +0 -7
- package/esm2015/empty/empty.component.js +0 -10
- package/esm2015/global-event-dispatcher.js +0 -71
- package/esm2015/global-planet.js +0 -51
- package/esm2015/helpers.js +0 -116
- package/esm2015/module.js +0 -27
- package/esm2015/planet.class.js +0 -9
- package/esm2015/planet.js +0 -86
- package/esm2015/public-api.js +0 -18
- package/esm2015/worktile-planet.js +0 -6
- package/fesm2015/worktile-planet.js +0 -1257
- package/fesm2015/worktile-planet.js.map +0 -1
- package/global-event-dispatcher.d.ts +0 -19
- package/global-planet.d.ts +0 -22
- package/helpers.d.ts +0 -37
- package/module.d.ts +0 -5
- package/planet.class.d.ts +0 -34
- package/planet.d.ts +0 -24
- package/worktile-planet.d.ts +0 -5
- package/worktile-planet.metadata.json +0 -1
|
@@ -0,0 +1,689 @@
|
|
|
1
|
+
import { TestBed, fakeAsync, waitForAsync } from '@angular/core/testing';
|
|
2
|
+
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
|
|
3
|
+
import { AssetsLoader, AssetsLoadResult } from './assets-loader';
|
|
4
|
+
import { hashCode } from './helpers';
|
|
5
|
+
import { Subject, of, observable, Observable, BehaviorSubject } from 'rxjs';
|
|
6
|
+
import { HttpClient } from '@angular/common/http';
|
|
7
|
+
|
|
8
|
+
describe('assets-loader', () => {
|
|
9
|
+
let assetsLoader: AssetsLoader;
|
|
10
|
+
const mockScript: {
|
|
11
|
+
onload: () => void;
|
|
12
|
+
onerror: (error: string | Event) => void;
|
|
13
|
+
} = { onload: () => {}, onerror: null };
|
|
14
|
+
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
TestBed.configureTestingModule({
|
|
17
|
+
imports: [HttpClientTestingModule],
|
|
18
|
+
providers: []
|
|
19
|
+
});
|
|
20
|
+
assetsLoader = TestBed.inject(AssetsLoader);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
describe('loadScript', () => {
|
|
24
|
+
it('should load script success when not in IE', fakeAsync(() => {
|
|
25
|
+
const src = 'assets/main.js';
|
|
26
|
+
const createElementSpy: jasmine.Spy = spyOn(document, 'createElement');
|
|
27
|
+
const appendChildSpy = spyOn(document.body, 'appendChild');
|
|
28
|
+
|
|
29
|
+
// 返回 mock script
|
|
30
|
+
createElementSpy.and.returnValue(mockScript);
|
|
31
|
+
// 没有调用
|
|
32
|
+
expect(appendChildSpy).not.toHaveBeenCalled();
|
|
33
|
+
expect(createElementSpy).not.toHaveBeenCalled();
|
|
34
|
+
|
|
35
|
+
const scriptLoaded = jasmine.createSpy('load script');
|
|
36
|
+
assetsLoader.loadScript(src).subscribe(scriptLoaded, error => {
|
|
37
|
+
console.error(error);
|
|
38
|
+
});
|
|
39
|
+
// 已经被调用
|
|
40
|
+
expect(appendChildSpy).toHaveBeenCalledTimes(1);
|
|
41
|
+
expect(createElementSpy).toHaveBeenCalledTimes(1);
|
|
42
|
+
|
|
43
|
+
// scriptLoaded 没有加载完毕
|
|
44
|
+
expect(scriptLoaded).toHaveBeenCalledTimes(0);
|
|
45
|
+
|
|
46
|
+
// 手动调用使其加载完毕
|
|
47
|
+
mockScript.onload();
|
|
48
|
+
|
|
49
|
+
// // scriptLoaded 加载完毕
|
|
50
|
+
expect(scriptLoaded).toHaveBeenCalledTimes(1);
|
|
51
|
+
expect(scriptLoaded).toHaveBeenCalledWith({
|
|
52
|
+
src: src,
|
|
53
|
+
hashCode: hashCode(src),
|
|
54
|
+
loaded: true,
|
|
55
|
+
status: 'Loaded'
|
|
56
|
+
});
|
|
57
|
+
}));
|
|
58
|
+
|
|
59
|
+
it('should load script success when in IE and readyState is loaded', fakeAsync(() => {
|
|
60
|
+
const mockScriptInIE: { readyState: string; onreadystatechange: () => void } = {
|
|
61
|
+
readyState: 'uninitialized',
|
|
62
|
+
onreadystatechange: () => {
|
|
63
|
+
console.log('loaded script state change');
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const src = 'assets/main.js';
|
|
67
|
+
const createElementSpy: jasmine.Spy = spyOn(document, 'createElement');
|
|
68
|
+
const appendChildSpy = spyOn(document.body, 'appendChild');
|
|
69
|
+
|
|
70
|
+
// 返回 mock script
|
|
71
|
+
createElementSpy.and.returnValue(mockScriptInIE);
|
|
72
|
+
// 没有调用
|
|
73
|
+
expect(appendChildSpy).not.toHaveBeenCalled();
|
|
74
|
+
expect(createElementSpy).not.toHaveBeenCalled();
|
|
75
|
+
|
|
76
|
+
const scriptLoaded = jasmine.createSpy('load script');
|
|
77
|
+
assetsLoader.loadScript(src).subscribe(scriptLoaded, error => {
|
|
78
|
+
console.error(error);
|
|
79
|
+
});
|
|
80
|
+
// 已经被调用
|
|
81
|
+
expect(appendChildSpy).toHaveBeenCalledTimes(1);
|
|
82
|
+
expect(createElementSpy).toHaveBeenCalledTimes(1);
|
|
83
|
+
|
|
84
|
+
// scriptLoaded 没有加载完毕
|
|
85
|
+
expect(scriptLoaded).toHaveBeenCalledTimes(0);
|
|
86
|
+
|
|
87
|
+
// 手动调用使其加载完毕
|
|
88
|
+
mockScriptInIE.readyState = 'loaded';
|
|
89
|
+
mockScriptInIE.onreadystatechange();
|
|
90
|
+
|
|
91
|
+
// // scriptLoaded 加载完毕
|
|
92
|
+
expect(scriptLoaded).toHaveBeenCalledTimes(1);
|
|
93
|
+
expect(mockScriptInIE.onreadystatechange).toBeNull();
|
|
94
|
+
expect(scriptLoaded).toHaveBeenCalledWith({
|
|
95
|
+
src: src,
|
|
96
|
+
hashCode: hashCode(src),
|
|
97
|
+
loaded: true,
|
|
98
|
+
status: 'Loaded'
|
|
99
|
+
});
|
|
100
|
+
}));
|
|
101
|
+
|
|
102
|
+
it('should load script success when in IE and readyState is complete or loaded', fakeAsync(() => {
|
|
103
|
+
const mockScriptInIE: { readyState: string; onreadystatechange: () => void } = {
|
|
104
|
+
readyState: 'uninitialized',
|
|
105
|
+
onreadystatechange: () => {
|
|
106
|
+
console.log('loaded script state change');
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
const src = 'assets/main.js';
|
|
110
|
+
const createElementSpy: jasmine.Spy = spyOn(document, 'createElement');
|
|
111
|
+
const appendChildSpy = spyOn(document.body, 'appendChild');
|
|
112
|
+
|
|
113
|
+
// 返回 mock script
|
|
114
|
+
createElementSpy.and.returnValue(mockScriptInIE);
|
|
115
|
+
// 没有调用
|
|
116
|
+
expect(appendChildSpy).not.toHaveBeenCalled();
|
|
117
|
+
expect(createElementSpy).not.toHaveBeenCalled();
|
|
118
|
+
|
|
119
|
+
const scriptLoaded = jasmine.createSpy('load script');
|
|
120
|
+
assetsLoader.loadScript(src).subscribe(scriptLoaded, error => {
|
|
121
|
+
console.error(error);
|
|
122
|
+
});
|
|
123
|
+
// 已经被调用
|
|
124
|
+
expect(appendChildSpy).toHaveBeenCalledTimes(1);
|
|
125
|
+
expect(createElementSpy).toHaveBeenCalledTimes(1);
|
|
126
|
+
|
|
127
|
+
// scriptLoaded 没有加载完毕
|
|
128
|
+
expect(scriptLoaded).toHaveBeenCalledTimes(0);
|
|
129
|
+
|
|
130
|
+
// 手动调用使其加载完毕
|
|
131
|
+
mockScriptInIE.readyState = 'complete';
|
|
132
|
+
mockScriptInIE.onreadystatechange();
|
|
133
|
+
|
|
134
|
+
// // scriptLoaded 加载完毕
|
|
135
|
+
expect(scriptLoaded).toHaveBeenCalledTimes(1);
|
|
136
|
+
expect(mockScriptInIE.onreadystatechange).toBeNull();
|
|
137
|
+
expect(scriptLoaded).toHaveBeenCalledWith({
|
|
138
|
+
src: src,
|
|
139
|
+
hashCode: hashCode(src),
|
|
140
|
+
loaded: true,
|
|
141
|
+
status: 'Loaded'
|
|
142
|
+
});
|
|
143
|
+
}));
|
|
144
|
+
|
|
145
|
+
it('should load script success when in IE and readyState is not complete or loaded', fakeAsync(() => {
|
|
146
|
+
const mockScriptInIE: { readyState: string; onreadystatechange: () => void } = {
|
|
147
|
+
readyState: 'uninitialized',
|
|
148
|
+
onreadystatechange: () => {
|
|
149
|
+
console.log('loaded script state change');
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
const src = 'assets/main.js';
|
|
153
|
+
const createElementSpy: jasmine.Spy = spyOn(document, 'createElement');
|
|
154
|
+
const appendChildSpy = spyOn(document.body, 'appendChild');
|
|
155
|
+
|
|
156
|
+
// 返回 mock script
|
|
157
|
+
createElementSpy.and.returnValue(mockScriptInIE);
|
|
158
|
+
// 没有调用
|
|
159
|
+
expect(appendChildSpy).not.toHaveBeenCalled();
|
|
160
|
+
expect(createElementSpy).not.toHaveBeenCalled();
|
|
161
|
+
|
|
162
|
+
const scriptLoaded = jasmine.createSpy('load script');
|
|
163
|
+
assetsLoader.loadScript(src).subscribe(scriptLoaded, error => {
|
|
164
|
+
console.error(error);
|
|
165
|
+
});
|
|
166
|
+
// 已经被调用
|
|
167
|
+
expect(appendChildSpy).toHaveBeenCalledTimes(1);
|
|
168
|
+
expect(createElementSpy).toHaveBeenCalledTimes(1);
|
|
169
|
+
|
|
170
|
+
// scriptLoaded 没有加载完毕
|
|
171
|
+
expect(scriptLoaded).toHaveBeenCalledTimes(0);
|
|
172
|
+
|
|
173
|
+
// 手动调用使其加载完毕
|
|
174
|
+
mockScriptInIE.readyState = 'any status';
|
|
175
|
+
mockScriptInIE.onreadystatechange();
|
|
176
|
+
|
|
177
|
+
// // scriptLoaded 加载完毕
|
|
178
|
+
expect(scriptLoaded).not.toHaveBeenCalled();
|
|
179
|
+
expect(mockScriptInIE.onreadystatechange).not.toBeNull();
|
|
180
|
+
}));
|
|
181
|
+
|
|
182
|
+
it('should not load script which has been loaded', fakeAsync(() => {
|
|
183
|
+
const src = 'assets/main.js';
|
|
184
|
+
const createElementSpy: jasmine.Spy = spyOn(document, 'createElement');
|
|
185
|
+
const appendChildSpy = spyOn(document.body, 'appendChild');
|
|
186
|
+
|
|
187
|
+
createElementSpy.and.returnValue(mockScript);
|
|
188
|
+
|
|
189
|
+
const scriptLoaded = jasmine.createSpy('load script');
|
|
190
|
+
assetsLoader.loadScript(src).subscribe(scriptLoaded, error => {
|
|
191
|
+
console.error(error);
|
|
192
|
+
});
|
|
193
|
+
mockScript.onload();
|
|
194
|
+
|
|
195
|
+
const scriptLoaded2 = jasmine.createSpy('load script');
|
|
196
|
+
assetsLoader.loadScript(src).subscribe(scriptLoaded2, error => {
|
|
197
|
+
console.error(error);
|
|
198
|
+
});
|
|
199
|
+
expect(appendChildSpy).toHaveBeenCalledTimes(1);
|
|
200
|
+
expect(createElementSpy).toHaveBeenCalledTimes(1);
|
|
201
|
+
expect(scriptLoaded2).toHaveBeenCalledTimes(1);
|
|
202
|
+
expect(scriptLoaded2).toHaveBeenCalledWith({
|
|
203
|
+
src: src,
|
|
204
|
+
hashCode: hashCode(src),
|
|
205
|
+
loaded: true,
|
|
206
|
+
status: 'Loaded'
|
|
207
|
+
});
|
|
208
|
+
}));
|
|
209
|
+
|
|
210
|
+
it('should get error when load script fail', fakeAsync(() => {
|
|
211
|
+
const src = 'assets/main.js';
|
|
212
|
+
const createElementSpy: jasmine.Spy = spyOn(document, 'createElement');
|
|
213
|
+
const appendChildSpy = spyOn(document.body, 'appendChild');
|
|
214
|
+
|
|
215
|
+
// 返回 mock script
|
|
216
|
+
createElementSpy.and.returnValue(mockScript);
|
|
217
|
+
// 没有调用
|
|
218
|
+
expect(appendChildSpy).not.toHaveBeenCalled();
|
|
219
|
+
expect(createElementSpy).not.toHaveBeenCalled();
|
|
220
|
+
|
|
221
|
+
const scriptLoaded = jasmine.createSpy('load script');
|
|
222
|
+
const scriptLoadedError = jasmine.createSpy('load script error');
|
|
223
|
+
assetsLoader.loadScript(src).subscribe(scriptLoaded, scriptLoadedError);
|
|
224
|
+
|
|
225
|
+
// 已经被调用
|
|
226
|
+
expect(appendChildSpy).toHaveBeenCalledTimes(1);
|
|
227
|
+
expect(createElementSpy).toHaveBeenCalledTimes(1);
|
|
228
|
+
|
|
229
|
+
// scriptLoaded 没有加载完毕
|
|
230
|
+
expect(scriptLoaded).not.toHaveBeenCalled();
|
|
231
|
+
|
|
232
|
+
// 手动调用使其加载完毕
|
|
233
|
+
mockScript.onerror('load js error');
|
|
234
|
+
|
|
235
|
+
expect(scriptLoaded).not.toHaveBeenCalled();
|
|
236
|
+
|
|
237
|
+
expect(scriptLoadedError).toHaveBeenCalled();
|
|
238
|
+
expect(scriptLoadedError).toHaveBeenCalledWith({
|
|
239
|
+
src: src,
|
|
240
|
+
hashCode: hashCode(src),
|
|
241
|
+
loaded: false,
|
|
242
|
+
status: 'Error',
|
|
243
|
+
error: 'load js error'
|
|
244
|
+
});
|
|
245
|
+
}));
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
describe('loadScripts', () => {
|
|
249
|
+
it('should return null when sources is []', fakeAsync(() => {
|
|
250
|
+
const loadScriptSpy = spyOn(assetsLoader, 'loadScript');
|
|
251
|
+
|
|
252
|
+
expect(loadScriptSpy).not.toHaveBeenCalled();
|
|
253
|
+
|
|
254
|
+
const loadedScripts = jasmine.createSpy('loaded scripts success');
|
|
255
|
+
const loadedScriptsFail = jasmine.createSpy('loaded scripts fail');
|
|
256
|
+
assetsLoader.loadStyles([]).subscribe(loadedScripts, loadedScriptsFail);
|
|
257
|
+
|
|
258
|
+
expect(loadScriptSpy).not.toHaveBeenCalled();
|
|
259
|
+
expect(loadedScripts).toHaveBeenCalledTimes(1);
|
|
260
|
+
expect(loadedScripts).toHaveBeenCalledWith(null);
|
|
261
|
+
expect(loadedScriptsFail).not.toHaveBeenCalled();
|
|
262
|
+
}));
|
|
263
|
+
|
|
264
|
+
it('should return null when sources is null', fakeAsync(() => {
|
|
265
|
+
const loadScriptSpy = spyOn(assetsLoader, 'loadScript');
|
|
266
|
+
|
|
267
|
+
expect(loadScriptSpy).not.toHaveBeenCalled();
|
|
268
|
+
|
|
269
|
+
const loadedScripts = jasmine.createSpy('loaded scripts success');
|
|
270
|
+
const loadedScriptsFail = jasmine.createSpy('loaded scripts fail');
|
|
271
|
+
assetsLoader.loadStyles(null).subscribe(loadedScripts, loadedScriptsFail);
|
|
272
|
+
|
|
273
|
+
expect(loadScriptSpy).not.toHaveBeenCalled();
|
|
274
|
+
expect(loadedScripts).toHaveBeenCalledTimes(1);
|
|
275
|
+
expect(loadedScripts).toHaveBeenCalledWith(null);
|
|
276
|
+
expect(loadedScriptsFail).not.toHaveBeenCalled();
|
|
277
|
+
}));
|
|
278
|
+
|
|
279
|
+
it('should load scripts success', () => {
|
|
280
|
+
const src1 = 'assets/vendor.js';
|
|
281
|
+
const src2 = 'assets/main.js';
|
|
282
|
+
|
|
283
|
+
const loadScriptSpy = spyOn(assetsLoader, 'loadScript');
|
|
284
|
+
const loadScriptObservable1 = new Subject<AssetsLoadResult>();
|
|
285
|
+
const loadScriptObservable2 = new Subject<AssetsLoadResult>();
|
|
286
|
+
loadScriptSpy.and.returnValues(loadScriptObservable1, loadScriptObservable2);
|
|
287
|
+
|
|
288
|
+
const result1 = {
|
|
289
|
+
src: src1,
|
|
290
|
+
hashCode: hashCode(src1),
|
|
291
|
+
loaded: true,
|
|
292
|
+
status: 'Loaded'
|
|
293
|
+
};
|
|
294
|
+
const result2 = {
|
|
295
|
+
src: src2,
|
|
296
|
+
hashCode: hashCode(src2),
|
|
297
|
+
loaded: true,
|
|
298
|
+
status: 'Loaded'
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
const loadScriptsSpy = jasmine.createSpy('load scripts spy');
|
|
302
|
+
assetsLoader.loadScripts([src1, src2]).subscribe(loadScriptsSpy);
|
|
303
|
+
|
|
304
|
+
loadScriptObservable2.next(result2);
|
|
305
|
+
loadScriptObservable2.complete();
|
|
306
|
+
loadScriptObservable1.next(result1);
|
|
307
|
+
loadScriptObservable1.complete();
|
|
308
|
+
|
|
309
|
+
expect(loadScriptsSpy).toHaveBeenCalled();
|
|
310
|
+
expect(loadScriptsSpy).toHaveBeenCalledWith([result1, result2]);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
it('should load scripts success when serial is true', () => {
|
|
314
|
+
const src1 = 'assets/vendor.js';
|
|
315
|
+
const src2 = 'assets/main.js';
|
|
316
|
+
|
|
317
|
+
const loadScriptSpy = spyOn(assetsLoader, 'loadScript');
|
|
318
|
+
const loadScriptObservable1 = new Subject<AssetsLoadResult>();
|
|
319
|
+
const loadScriptObservable2 = new Subject<AssetsLoadResult>();
|
|
320
|
+
loadScriptSpy.and.returnValues(loadScriptObservable1, loadScriptObservable2);
|
|
321
|
+
|
|
322
|
+
const result1 = {
|
|
323
|
+
src: src1,
|
|
324
|
+
hashCode: hashCode(src1),
|
|
325
|
+
loaded: true,
|
|
326
|
+
status: 'Loaded'
|
|
327
|
+
};
|
|
328
|
+
const result2 = {
|
|
329
|
+
src: src2,
|
|
330
|
+
hashCode: hashCode(src2),
|
|
331
|
+
loaded: true,
|
|
332
|
+
status: 'Loaded'
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
const loadScriptsSpy = jasmine.createSpy('load scripts spy');
|
|
336
|
+
assetsLoader.loadScripts([src1, src2], { serial: true }).subscribe(loadScriptsSpy);
|
|
337
|
+
|
|
338
|
+
loadScriptObservable1.next(result1);
|
|
339
|
+
loadScriptObservable1.complete();
|
|
340
|
+
loadScriptObservable2.next(result2);
|
|
341
|
+
loadScriptObservable2.complete();
|
|
342
|
+
|
|
343
|
+
expect(loadScriptsSpy).toHaveBeenCalled();
|
|
344
|
+
expect(loadScriptsSpy.calls.count()).toEqual(2);
|
|
345
|
+
expect(loadScriptsSpy.calls.argsFor(0)).toEqual([[result1]]);
|
|
346
|
+
expect(loadScriptsSpy.calls.argsFor(1)).toEqual([[result2]]);
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
describe('loadManifest', () => {
|
|
351
|
+
let httpClient: HttpClient;
|
|
352
|
+
let httpTestingController: HttpTestingController;
|
|
353
|
+
beforeEach(() => {
|
|
354
|
+
httpClient = TestBed.inject(HttpClient);
|
|
355
|
+
httpTestingController = TestBed.inject(HttpTestingController);
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
afterEach(() => {
|
|
359
|
+
// After every test, assert that there are no more pending requests.
|
|
360
|
+
httpTestingController.verify();
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
it(
|
|
364
|
+
'should load manifest success',
|
|
365
|
+
waitForAsync(() => {
|
|
366
|
+
const testData = {
|
|
367
|
+
'main.js': 'main1.js'
|
|
368
|
+
};
|
|
369
|
+
const loadManifestSpy = jasmine.createSpy('load manifest spy');
|
|
370
|
+
assetsLoader.loadManifest('/static/assets/manifest.json').subscribe(loadManifestSpy);
|
|
371
|
+
const req = httpTestingController.expectOne('/static/assets/manifest.json');
|
|
372
|
+
|
|
373
|
+
// Assert that the request is a GET.
|
|
374
|
+
expect(req.request.method).toEqual('GET');
|
|
375
|
+
expect(loadManifestSpy).not.toHaveBeenCalled();
|
|
376
|
+
|
|
377
|
+
// Respond with mock data, causing Observable to resolve.
|
|
378
|
+
// Subscribe callback asserts that correct data was returned.
|
|
379
|
+
req.flush(testData);
|
|
380
|
+
|
|
381
|
+
expect(loadManifestSpy).toHaveBeenCalled();
|
|
382
|
+
expect(loadManifestSpy).toHaveBeenCalledWith(testData);
|
|
383
|
+
})
|
|
384
|
+
);
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
describe('loadAppAssets', () => {
|
|
388
|
+
const app1 = {
|
|
389
|
+
name: 'app1',
|
|
390
|
+
hostParent: '.host-selector',
|
|
391
|
+
selector: 'app1-root',
|
|
392
|
+
routerPathPrefix: '/app1',
|
|
393
|
+
hostClass: 'app1-host',
|
|
394
|
+
preload: false,
|
|
395
|
+
resourcePathPrefix: '/static/app1/',
|
|
396
|
+
styles: ['styles/main.css'],
|
|
397
|
+
scripts: ['vendor.js', 'main.js'],
|
|
398
|
+
sandbox: false,
|
|
399
|
+
loadSerial: false,
|
|
400
|
+
manifest: '',
|
|
401
|
+
extra: {
|
|
402
|
+
appName: '应用1'
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
it('load assets success without manifest', () => {
|
|
407
|
+
const loadScriptsAndStyles$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
408
|
+
const loadScriptsAndStylesSpy = spyOn(assetsLoader, 'loadScriptsAndStyles');
|
|
409
|
+
loadScriptsAndStylesSpy.and.returnValue(loadScriptsAndStyles$);
|
|
410
|
+
|
|
411
|
+
const loadAssetsSpy = jasmine.createSpy('load assets spy');
|
|
412
|
+
assetsLoader.loadAppAssets(app1).subscribe(loadAssetsSpy);
|
|
413
|
+
|
|
414
|
+
expect(loadAssetsSpy).not.toHaveBeenCalled();
|
|
415
|
+
expect(loadScriptsAndStylesSpy).toHaveBeenCalled();
|
|
416
|
+
expect(loadScriptsAndStylesSpy).toHaveBeenCalledWith(
|
|
417
|
+
['/static/app1/vendor.js', '/static/app1/main.js'],
|
|
418
|
+
['/static/app1/styles/main.css'],
|
|
419
|
+
{
|
|
420
|
+
app: 'app1',
|
|
421
|
+
sandbox: false,
|
|
422
|
+
serial: app1.loadSerial
|
|
423
|
+
}
|
|
424
|
+
);
|
|
425
|
+
|
|
426
|
+
loadScriptsAndStyles$.next('load success' as any);
|
|
427
|
+
expect(loadAssetsSpy).toHaveBeenCalled();
|
|
428
|
+
expect(loadAssetsSpy).toHaveBeenCalledWith('load success');
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
it('load assets success with manifest', () => {
|
|
432
|
+
const loadScriptsAndStyles$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
433
|
+
const loadScriptsAndStylesSpy = spyOn(assetsLoader, 'loadScriptsAndStyles');
|
|
434
|
+
loadScriptsAndStylesSpy.and.returnValue(loadScriptsAndStyles$);
|
|
435
|
+
|
|
436
|
+
const loadManifestSpy = spyOn(assetsLoader, 'loadManifest');
|
|
437
|
+
const manifestResult = {
|
|
438
|
+
'main.js': 'main.123455.js',
|
|
439
|
+
'vendor.js': 'vendor.23221.js',
|
|
440
|
+
'main.css': 'main.s1223.css'
|
|
441
|
+
};
|
|
442
|
+
loadManifestSpy.and.returnValue(of(manifestResult));
|
|
443
|
+
|
|
444
|
+
const loadAssetsSpy = jasmine.createSpy('load assets spy');
|
|
445
|
+
assetsLoader
|
|
446
|
+
.loadAppAssets({
|
|
447
|
+
...app1,
|
|
448
|
+
manifest: '/app1/manifest.json'
|
|
449
|
+
})
|
|
450
|
+
.subscribe(loadAssetsSpy);
|
|
451
|
+
|
|
452
|
+
expect(loadAssetsSpy).not.toHaveBeenCalled();
|
|
453
|
+
expect(loadScriptsAndStylesSpy).toHaveBeenCalled();
|
|
454
|
+
expect(loadScriptsAndStylesSpy).toHaveBeenCalledWith(
|
|
455
|
+
[`/static/app1/${manifestResult['vendor.js']}`, `/static/app1/${manifestResult['main.js']}`],
|
|
456
|
+
[`/static/app1/styles/${manifestResult['main.css']}`],
|
|
457
|
+
{
|
|
458
|
+
app: 'app1',
|
|
459
|
+
sandbox: false,
|
|
460
|
+
serial: app1.loadSerial
|
|
461
|
+
}
|
|
462
|
+
);
|
|
463
|
+
|
|
464
|
+
loadScriptsAndStyles$.next('load success' as any);
|
|
465
|
+
expect(loadAssetsSpy).toHaveBeenCalled();
|
|
466
|
+
expect(loadAssetsSpy).toHaveBeenCalledWith('load success');
|
|
467
|
+
});
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
describe('loadStyle', () => {
|
|
471
|
+
let src, createElementSpy, getElementsByTagNameSpy, appendChildSpy, styleLoaded, styleLoadedFail;
|
|
472
|
+
const heads: { appendChild: () => void }[] = [{ appendChild: null }];
|
|
473
|
+
beforeEach(() => {
|
|
474
|
+
src = 'css/style.css';
|
|
475
|
+
createElementSpy = spyOn(document, 'createElement');
|
|
476
|
+
getElementsByTagNameSpy = spyOn(document, 'getElementsByTagName');
|
|
477
|
+
|
|
478
|
+
createElementSpy.and.returnValue(mockScript);
|
|
479
|
+
getElementsByTagNameSpy.and.returnValue(heads);
|
|
480
|
+
|
|
481
|
+
expect(createElementSpy).not.toHaveBeenCalled();
|
|
482
|
+
expect(getElementsByTagNameSpy).not.toHaveBeenCalled();
|
|
483
|
+
appendChildSpy = spyOn(heads[0], 'appendChild');
|
|
484
|
+
expect(appendChildSpy).not.toHaveBeenCalled();
|
|
485
|
+
|
|
486
|
+
styleLoaded = jasmine.createSpy('style loaded');
|
|
487
|
+
styleLoadedFail = jasmine.createSpy('load style error');
|
|
488
|
+
assetsLoader.loadStyle(src).subscribe(styleLoaded, styleLoadedFail);
|
|
489
|
+
|
|
490
|
+
expect(createElementSpy).toHaveBeenCalledTimes(1);
|
|
491
|
+
expect(getElementsByTagNameSpy).toHaveBeenCalledTimes(1);
|
|
492
|
+
expect(appendChildSpy).toHaveBeenCalledTimes(1);
|
|
493
|
+
expect(styleLoaded).toHaveBeenCalledTimes(0);
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
it('should load style success', fakeAsync(() => {
|
|
497
|
+
mockScript.onload();
|
|
498
|
+
|
|
499
|
+
expect(styleLoaded).toHaveBeenCalledTimes(1);
|
|
500
|
+
expect(styleLoadedFail).toHaveBeenCalledTimes(0);
|
|
501
|
+
expect(styleLoaded).toHaveBeenCalledWith({
|
|
502
|
+
src: src,
|
|
503
|
+
hashCode: hashCode(src),
|
|
504
|
+
loaded: true,
|
|
505
|
+
status: 'Loaded'
|
|
506
|
+
});
|
|
507
|
+
}));
|
|
508
|
+
|
|
509
|
+
it('should not load style when style has been loaded', fakeAsync(() => {
|
|
510
|
+
mockScript.onload();
|
|
511
|
+
|
|
512
|
+
const styleLoaded2 = jasmine.createSpy('load style');
|
|
513
|
+
assetsLoader.loadStyle(src).subscribe(styleLoaded2, error => {
|
|
514
|
+
console.error(error);
|
|
515
|
+
});
|
|
516
|
+
expect(createElementSpy).toHaveBeenCalledTimes(1);
|
|
517
|
+
expect(getElementsByTagNameSpy).toHaveBeenCalledTimes(1);
|
|
518
|
+
|
|
519
|
+
expect(styleLoaded2).toHaveBeenCalledWith({
|
|
520
|
+
src: src,
|
|
521
|
+
hashCode: hashCode(src),
|
|
522
|
+
loaded: true,
|
|
523
|
+
status: 'Loaded'
|
|
524
|
+
});
|
|
525
|
+
}));
|
|
526
|
+
|
|
527
|
+
it('should get error when load style fail', fakeAsync(() => {
|
|
528
|
+
mockScript.onerror('load style error');
|
|
529
|
+
|
|
530
|
+
expect(styleLoaded).toHaveBeenCalledTimes(0);
|
|
531
|
+
expect(styleLoadedFail).toHaveBeenCalledTimes(1);
|
|
532
|
+
expect(styleLoadedFail).toHaveBeenCalledWith({
|
|
533
|
+
src: src,
|
|
534
|
+
hashCode: hashCode(src),
|
|
535
|
+
loaded: true,
|
|
536
|
+
status: 'Loaded',
|
|
537
|
+
error: 'load style error'
|
|
538
|
+
});
|
|
539
|
+
}));
|
|
540
|
+
});
|
|
541
|
+
|
|
542
|
+
describe('loadStyles', () => {
|
|
543
|
+
it('should return null when sources is empty', fakeAsync(() => {
|
|
544
|
+
const loadStyletSpy = spyOn(assetsLoader, 'loadStyle');
|
|
545
|
+
|
|
546
|
+
expect(loadStyletSpy).not.toHaveBeenCalled();
|
|
547
|
+
|
|
548
|
+
const loadedStyles = jasmine.createSpy('loaded styles success');
|
|
549
|
+
const loadedStylesFail = jasmine.createSpy('loaded styles fail');
|
|
550
|
+
assetsLoader.loadStyles([]).subscribe(loadedStyles, loadedStylesFail);
|
|
551
|
+
|
|
552
|
+
expect(loadStyletSpy).not.toHaveBeenCalled();
|
|
553
|
+
expect(loadedStyles).toHaveBeenCalledTimes(1);
|
|
554
|
+
expect(loadedStyles).toHaveBeenCalledWith(null);
|
|
555
|
+
}));
|
|
556
|
+
|
|
557
|
+
it('should return load styles', fakeAsync(() => {
|
|
558
|
+
const stylesSrc = ['css/style1.css', 'css/style2.css'];
|
|
559
|
+
const loadStyletSpy = spyOn(assetsLoader, 'loadStyle');
|
|
560
|
+
|
|
561
|
+
expect(loadStyletSpy).not.toHaveBeenCalled();
|
|
562
|
+
|
|
563
|
+
const loadStyleObservable1: Subject<AssetsLoadResult> = new Subject<AssetsLoadResult>();
|
|
564
|
+
const loadStyleObservable2: Subject<AssetsLoadResult> = new Subject<AssetsLoadResult>();
|
|
565
|
+
|
|
566
|
+
const loadStyleObservable1Value = {
|
|
567
|
+
src: stylesSrc[0],
|
|
568
|
+
hashCode: hashCode(stylesSrc[0]),
|
|
569
|
+
loaded: true,
|
|
570
|
+
status: 'Loaded'
|
|
571
|
+
};
|
|
572
|
+
const loadStyleObservable2Value = {
|
|
573
|
+
src: stylesSrc[1],
|
|
574
|
+
hashCode: hashCode(stylesSrc[1]),
|
|
575
|
+
loaded: true,
|
|
576
|
+
status: 'Loaded'
|
|
577
|
+
};
|
|
578
|
+
|
|
579
|
+
loadStyletSpy.and.returnValues(loadStyleObservable1, loadStyleObservable2);
|
|
580
|
+
|
|
581
|
+
const loadedStyles = jasmine.createSpy('loaded styles success');
|
|
582
|
+
const loadedStylesFail = jasmine.createSpy('loaded styles fail');
|
|
583
|
+
assetsLoader.loadStyles(stylesSrc).subscribe(loadedStyles, loadedStylesFail);
|
|
584
|
+
|
|
585
|
+
expect(loadStyletSpy).toHaveBeenCalledTimes(2);
|
|
586
|
+
expect(loadedStyles).not.toHaveBeenCalled();
|
|
587
|
+
|
|
588
|
+
loadStyleObservable1.next(loadStyleObservable1Value);
|
|
589
|
+
loadStyleObservable1.complete();
|
|
590
|
+
loadStyleObservable2.next(loadStyleObservable2Value);
|
|
591
|
+
loadStyleObservable2.complete();
|
|
592
|
+
|
|
593
|
+
expect(loadedStyles).toHaveBeenCalledTimes(1);
|
|
594
|
+
expect(loadedStyles).toHaveBeenCalledWith([loadStyleObservable1Value, loadStyleObservable2Value]);
|
|
595
|
+
}));
|
|
596
|
+
});
|
|
597
|
+
|
|
598
|
+
describe('loadScriptsAndStyles', () => {
|
|
599
|
+
it('should load scripts and styles success', fakeAsync(() => {
|
|
600
|
+
const scripts = ['assert/main.js', 'assert/main1.js'];
|
|
601
|
+
const styles = ['css/style.css', 'css/style1.css'];
|
|
602
|
+
const loadScriptsSpy = spyOn(assetsLoader, 'loadScripts');
|
|
603
|
+
const loadStylesSpy = spyOn(assetsLoader, 'loadStyles');
|
|
604
|
+
const loadScriptsObservable = new Subject<AssetsLoadResult[]>();
|
|
605
|
+
const loadStylesObservable = new Subject<AssetsLoadResult[]>();
|
|
606
|
+
const loadScriptsValues = [
|
|
607
|
+
{
|
|
608
|
+
src: scripts[0],
|
|
609
|
+
hashCode: hashCode(scripts[0]),
|
|
610
|
+
loaded: true,
|
|
611
|
+
status: 'Loaded'
|
|
612
|
+
},
|
|
613
|
+
{
|
|
614
|
+
src: scripts[1],
|
|
615
|
+
hashCode: hashCode(scripts[1]),
|
|
616
|
+
loaded: true,
|
|
617
|
+
status: 'Loaded'
|
|
618
|
+
}
|
|
619
|
+
];
|
|
620
|
+
const loadStylesValues = [
|
|
621
|
+
{
|
|
622
|
+
src: styles[0],
|
|
623
|
+
hashCode: hashCode(styles[0]),
|
|
624
|
+
loaded: true,
|
|
625
|
+
status: 'Loaded'
|
|
626
|
+
},
|
|
627
|
+
{
|
|
628
|
+
src: styles[1],
|
|
629
|
+
hashCode: hashCode(styles[1]),
|
|
630
|
+
loaded: true,
|
|
631
|
+
status: 'Loaded'
|
|
632
|
+
}
|
|
633
|
+
];
|
|
634
|
+
|
|
635
|
+
loadScriptsSpy.and.returnValue(loadScriptsObservable);
|
|
636
|
+
loadStylesSpy.and.returnValue(loadStylesObservable);
|
|
637
|
+
|
|
638
|
+
expect(loadScriptsSpy).not.toHaveBeenCalled();
|
|
639
|
+
expect(loadStylesSpy).not.toHaveBeenCalled();
|
|
640
|
+
|
|
641
|
+
const loadedSuccess = jasmine.createSpy('loaded scripts and styles success');
|
|
642
|
+
const loadedFail = jasmine.createSpy('loaded scripts and styles fail');
|
|
643
|
+
assetsLoader.loadScriptsAndStyles(scripts, styles).subscribe(loadedSuccess, loadedFail);
|
|
644
|
+
|
|
645
|
+
expect(loadScriptsSpy).toHaveBeenCalledTimes(1);
|
|
646
|
+
expect(loadStylesSpy).toHaveBeenCalledTimes(1);
|
|
647
|
+
expect(loadedSuccess).not.toHaveBeenCalled();
|
|
648
|
+
|
|
649
|
+
loadScriptsObservable.next(loadScriptsValues);
|
|
650
|
+
loadScriptsObservable.complete();
|
|
651
|
+
loadStylesObservable.next(loadStylesValues);
|
|
652
|
+
loadStylesObservable.complete();
|
|
653
|
+
|
|
654
|
+
expect(loadedSuccess).toHaveBeenCalledTimes(1);
|
|
655
|
+
expect(loadedSuccess).toHaveBeenCalledWith([loadScriptsValues, loadStylesValues]);
|
|
656
|
+
}));
|
|
657
|
+
|
|
658
|
+
it('should return null when scripts and styles is []', fakeAsync(() => {
|
|
659
|
+
const scripts = [];
|
|
660
|
+
const styles = [];
|
|
661
|
+
const loadScriptsSpy = spyOn(assetsLoader, 'loadScripts');
|
|
662
|
+
const loadStylesSpy = spyOn(assetsLoader, 'loadStyles');
|
|
663
|
+
const loadScriptsObservable = new Subject<AssetsLoadResult[]>();
|
|
664
|
+
const loadStylesObservable = new Subject<AssetsLoadResult[]>();
|
|
665
|
+
|
|
666
|
+
loadScriptsSpy.and.returnValue(loadScriptsObservable);
|
|
667
|
+
loadStylesSpy.and.returnValue(loadStylesObservable);
|
|
668
|
+
|
|
669
|
+
expect(loadScriptsSpy).not.toHaveBeenCalled();
|
|
670
|
+
expect(loadStylesSpy).not.toHaveBeenCalled();
|
|
671
|
+
|
|
672
|
+
const loadedSuccess = jasmine.createSpy('loaded scripts and styles success');
|
|
673
|
+
const loadedFail = jasmine.createSpy('loaded scripts and styles fail');
|
|
674
|
+
assetsLoader.loadScriptsAndStyles(scripts, styles).subscribe(loadedSuccess, loadedFail);
|
|
675
|
+
|
|
676
|
+
expect(loadScriptsSpy).toHaveBeenCalledTimes(1);
|
|
677
|
+
expect(loadStylesSpy).toHaveBeenCalledTimes(1);
|
|
678
|
+
expect(loadedSuccess).not.toHaveBeenCalled();
|
|
679
|
+
|
|
680
|
+
loadScriptsObservable.next(null);
|
|
681
|
+
loadScriptsObservable.complete();
|
|
682
|
+
loadStylesObservable.next(null);
|
|
683
|
+
loadStylesObservable.complete();
|
|
684
|
+
|
|
685
|
+
expect(loadedSuccess).toHaveBeenCalledTimes(1);
|
|
686
|
+
expect(loadedSuccess).toHaveBeenCalledWith([null, null]);
|
|
687
|
+
}));
|
|
688
|
+
});
|
|
689
|
+
});
|