@worktile/planet 12.1.1 → 12.1.2
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/application/planet-application-loader.d.ts +70 -0
- package/application/planet-application-loader.d.ts.map +1 -0
- package/application/planet-application-loader.ngfactory.d.ts.map +1 -0
- package/application/planet-application-ref.d.ts +36 -0
- package/application/planet-application-ref.d.ts.map +1 -0
- package/application/planet-application.service.d.ts +19 -0
- package/application/planet-application.service.d.ts.map +1 -0
- package/application/planet-application.service.ngfactory.d.ts.map +1 -0
- package/{packages/planet/src/application/portal-application.ts → application/portal-application.d.ts} +5 -18
- package/application/portal-application.d.ts.map +1 -0
- package/assets-loader.d.ts +33 -0
- package/assets-loader.d.ts.map +1 -0
- package/assets-loader.ngfactory.d.ts.map +1 -0
- package/bundles/worktile-planet.umd.js +2564 -0
- package/bundles/worktile-planet.umd.js.map +1 -0
- package/component/planet-component-loader.d.ts +28 -0
- package/component/planet-component-loader.d.ts.map +1 -0
- package/component/planet-component-loader.ngfactory.d.ts.map +1 -0
- package/component/planet-component-ref.d.ts +8 -0
- package/component/planet-component-ref.d.ts.map +1 -0
- package/{packages/planet/src/component/plant-component.config.ts → component/plant-component.config.d.ts} +4 -4
- package/component/plant-component.config.d.ts.map +1 -0
- package/debug.d.ts +22 -0
- package/debug.d.ts.map +1 -0
- package/empty/empty.component.d.ts +3 -0
- package/empty/empty.component.d.ts.map +1 -0
- package/empty/empty.component.ngfactory.d.ts.map +1 -0
- package/esm2015/application/planet-application-loader.js +457 -0
- package/esm2015/application/planet-application-ref.js +97 -0
- package/esm2015/application/planet-application.service.js +87 -0
- package/esm2015/application/portal-application.js +16 -0
- package/esm2015/assets-loader.js +217 -0
- package/esm2015/component/planet-component-loader.js +155 -0
- package/esm2015/component/planet-component-ref.js +3 -0
- package/esm2015/component/plant-component.config.js +7 -0
- package/esm2015/debug.js +33 -0
- package/esm2015/empty/empty.component.js +10 -0
- package/esm2015/global-event-dispatcher.js +71 -0
- package/esm2015/global-planet.js +54 -0
- package/esm2015/helpers.js +119 -0
- package/esm2015/module.js +27 -0
- package/esm2015/planet.class.js +9 -0
- package/esm2015/planet.js +91 -0
- package/esm2015/public-api.js +18 -0
- package/esm2015/sandbox/constants.js +7 -0
- package/esm2015/sandbox/exec.js +15 -0
- package/esm2015/sandbox/index.js +20 -0
- package/esm2015/sandbox/proxy/patches/document.js +12 -0
- package/esm2015/sandbox/proxy/patches/eventListener.js +41 -0
- package/esm2015/sandbox/proxy/patches/index.js +11 -0
- package/esm2015/sandbox/proxy/patches/storage.js +40 -0
- package/esm2015/sandbox/proxy/patches/timer.js +43 -0
- package/esm2015/sandbox/proxy/proxies/common.js +132 -0
- package/esm2015/sandbox/proxy/proxies/document.js +126 -0
- package/esm2015/sandbox/proxy/proxies/window.js +155 -0
- package/esm2015/sandbox/proxy/proxy-sandbox.js +49 -0
- package/esm2015/sandbox/proxy/types.js +2 -0
- package/esm2015/sandbox/sandbox.js +7 -0
- package/esm2015/sandbox/snapshot/snapshot-sandbox.js +12 -0
- package/esm2015/sandbox/types.js +2 -0
- package/esm2015/worktile-planet.js +6 -0
- package/fesm2015/worktile-planet.js +2048 -0
- package/fesm2015/worktile-planet.js.map +1 -0
- package/global-event-dispatcher.d.ts +20 -0
- package/global-event-dispatcher.d.ts.map +1 -0
- package/global-event-dispatcher.ngfactory.d.ts.map +1 -0
- package/global-planet.d.ts +23 -0
- package/global-planet.d.ts.map +1 -0
- package/helpers.d.ts +39 -0
- package/helpers.d.ts.map +1 -0
- package/module.d.ts +6 -0
- package/module.d.ts.map +1 -0
- package/module.ngfactory.d.ts.map +1 -0
- package/package.json +16 -121
- package/{packages/planet/src/planet.class.ts → planet.class.d.ts} +5 -26
- package/planet.class.d.ts.map +1 -0
- package/planet.d.ts +25 -0
- package/planet.d.ts.map +1 -0
- package/planet.ngfactory.d.ts.map +1 -0
- package/{packages/planet/src/public-api.ts → public-api.d.ts} +1 -4
- package/public-api.d.ts.map +1 -0
- package/sandbox/constants.d.ts +7 -0
- package/sandbox/constants.d.ts.map +1 -0
- package/sandbox/exec.d.ts +3 -0
- package/sandbox/exec.d.ts.map +1 -0
- package/sandbox/index.d.ts +7 -0
- package/sandbox/index.d.ts.map +1 -0
- package/sandbox/proxy/patches/document.d.ts +3 -0
- package/sandbox/proxy/patches/document.d.ts.map +1 -0
- package/sandbox/proxy/patches/eventListener.d.ts +3 -0
- package/sandbox/proxy/patches/eventListener.d.ts.map +1 -0
- package/sandbox/proxy/patches/index.d.ts +3 -0
- package/sandbox/proxy/patches/index.d.ts.map +1 -0
- package/sandbox/proxy/patches/storage.d.ts +15 -0
- package/sandbox/proxy/patches/storage.d.ts.map +1 -0
- package/sandbox/proxy/patches/timer.d.ts +3 -0
- package/sandbox/proxy/patches/timer.d.ts.map +1 -0
- package/sandbox/proxy/proxies/common.d.ts +13 -0
- package/sandbox/proxy/proxies/common.d.ts.map +1 -0
- package/sandbox/proxy/proxies/document.d.ts +14 -0
- package/sandbox/proxy/proxies/document.d.ts.map +1 -0
- package/sandbox/proxy/proxies/window.d.ts +13 -0
- package/sandbox/proxy/proxies/window.d.ts.map +1 -0
- package/sandbox/proxy/proxy-sandbox.d.ts +16 -0
- package/sandbox/proxy/proxy-sandbox.d.ts.map +1 -0
- package/{packages/planet/src/sandbox/proxy/types.ts → sandbox/proxy/types.d.ts} +2 -8
- package/sandbox/proxy/types.d.ts.map +1 -0
- package/sandbox/sandbox.d.ts +12 -0
- package/sandbox/sandbox.d.ts.map +1 -0
- package/sandbox/snapshot/snapshot-sandbox.d.ts +9 -0
- package/sandbox/snapshot/snapshot-sandbox.d.ts.map +1 -0
- package/sandbox/types.d.ts +2 -0
- package/sandbox/types.d.ts.map +1 -0
- package/worktile-planet.d.ts +6 -0
- package/worktile-planet.d.ts.map +1 -0
- package/worktile-planet.metadata.json +1 -0
- package/.all-contributorsrc +0 -84
- package/.circleci/config.yml +0 -17
- package/.coveralls.yml +0 -1
- package/.docgeni/public/assets/favicon.ico +0 -0
- package/.docgeni/public/index.html +0 -13
- package/.docgenirc.js +0 -35
- package/.dockerignore +0 -1
- package/.editorconfig +0 -22
- package/.github/FUNDING.yml +0 -12
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- package/.prettierignore +0 -7
- package/.prettierrc +0 -28
- package/.travis.yml +0 -26
- package/.wpmrc.js +0 -11
- package/CHANGELOG.md +0 -391
- package/CODE_OF_CONDUCT.md +0 -76
- package/Dockerfile +0 -11
- package/LICENSE +0 -21
- package/README.md +0 -348
- package/README.zh-CN.md +0 -307
- package/SECURITY.md +0 -21
- package/angular.json +0 -373
- package/commitlint.config.js +0 -6
- package/docs/api/defineApplication.md +0 -46
- package/docs/api/globalEventDispatcher.md +0 -51
- package/docs/api/index.md +0 -5
- package/docs/api/planet.md +0 -117
- package/docs/guides/getting-started.md +0 -174
- package/docs/guides/index.md +0 -5
- package/docs/guides/intro.md +0 -216
- package/examples/app1/browserslist +0 -11
- package/examples/app1/extra-webpack.config.js +0 -33
- package/examples/app1/karma.conf.js +0 -31
- package/examples/app1/postcss.config.js +0 -1
- package/examples/app1/src/app/app.module.ts +0 -44
- package/examples/app1/src/app/app.routing.ts +0 -49
- package/examples/app1/src/app/counter.service.ts +0 -16
- package/examples/app1/src/app/dashboard/dashboard.component.html +0 -51
- package/examples/app1/src/app/dashboard/dashboard.component.ts +0 -70
- package/examples/app1/src/app/detail/detail.component.html +0 -8
- package/examples/app1/src/app/detail/detail.component.ts +0 -18
- package/examples/app1/src/app/overlay.ts +0 -26
- package/examples/app1/src/app/projects/dialog/projects-dialog.component.html +0 -10
- package/examples/app1/src/app/projects/dialog/projects-dialog.component.ts +0 -41
- package/examples/app1/src/app/projects/projects.component.ts +0 -33
- package/examples/app1/src/app/root/root.component.css +0 -3
- package/examples/app1/src/app/root/root.component.html +0 -16
- package/examples/app1/src/app/root/root.component.ts +0 -35
- package/examples/app1/src/app/services/initialized-data.resolver.ts +0 -15
- package/examples/app1/src/app/shared.module.ts +0 -57
- package/examples/app1/src/app/user/detail/user-detail.component.html +0 -5
- package/examples/app1/src/app/user/detail/user-detail.component.ts +0 -20
- package/examples/app1/src/app/user/user-list.component.html +0 -7
- package/examples/app1/src/app/user/user-list.component.ts +0 -20
- package/examples/app1/src/app/user/user.module.ts +0 -31
- package/examples/app1/src/assets/.gitkeep +0 -0
- package/examples/app1/src/assets/github.png +0 -0
- package/examples/app1/src/assets/main.css +0 -3
- package/examples/app1/src/environments/environment.prod.ts +0 -3
- package/examples/app1/src/environments/environment.ts +0 -16
- package/examples/app1/src/favicon.ico +0 -0
- package/examples/app1/src/index.html +0 -14
- package/examples/app1/src/main.ts +0 -35
- package/examples/app1/src/polyfills.ts +0 -84
- package/examples/app1/src/styles.scss +0 -35
- package/examples/app1/src/test.ts +0 -14
- package/examples/app1/temp.js +0 -221
- package/examples/app1/tsconfig.app.json +0 -10
- package/examples/app1/tsconfig.spec.json +0 -18
- package/examples/app1/tslint.json +0 -17
- package/examples/app1/webpack.config.js +0 -127
- package/examples/app2/browserslist +0 -11
- package/examples/app2/extra-webpack.config.js +0 -32
- package/examples/app2/karma.conf.js +0 -31
- package/examples/app2/src/app/app.module.ts +0 -90
- package/examples/app2/src/app/dashboard/dashboard.component.html +0 -21
- package/examples/app2/src/app/dashboard/dashboard.component.ts +0 -27
- package/examples/app2/src/app/overlay.ts +0 -26
- package/examples/app2/src/app/projects/detail/detail.component.html +0 -16
- package/examples/app2/src/app/projects/detail/detail.component.ts +0 -21
- package/examples/app2/src/app/projects/project-list.component.html +0 -29
- package/examples/app2/src/app/projects/project-list.component.ts +0 -58
- package/examples/app2/src/app/projects/project.resolver.ts +0 -15
- package/examples/app2/src/app/projects/projects.service.ts +0 -28
- package/examples/app2/src/app/projects/tasks/tasks.component.html +0 -10
- package/examples/app2/src/app/projects/tasks/tasks.component.ts +0 -16
- package/examples/app2/src/app/projects/view/view.component.html +0 -1
- package/examples/app2/src/app/projects/view/view.component.ts +0 -20
- package/examples/app2/src/app/root/root.component.html +0 -14
- package/examples/app2/src/app/root/root.component.scss +0 -12
- package/examples/app2/src/app/root/root.component.ts +0 -28
- package/examples/app2/src/app/shared.module.ts +0 -59
- package/examples/app2/src/assets/.gitkeep +0 -0
- package/examples/app2/src/environments/environment.prod.ts +0 -3
- package/examples/app2/src/environments/environment.ts +0 -16
- package/examples/app2/src/favicon.ico +0 -0
- package/examples/app2/src/index.html +0 -14
- package/examples/app2/src/main.ts +0 -36
- package/examples/app2/src/polyfills.ts +0 -84
- package/examples/app2/src/styles.scss +0 -28
- package/examples/app2/src/test.ts +0 -14
- package/examples/app2/tsconfig.app.json +0 -10
- package/examples/app2/tsconfig.spec.json +0 -18
- package/examples/app2/tslint.json +0 -7
- package/examples/app2/webpack.config.js +0 -92
- package/examples/common/app-root-context.ts +0 -10
- package/examples/common/cache.ts +0 -82
- package/examples/common/index.ts +0 -13
- package/examples/common/module.ts +0 -10
- package/examples/common/overlay-container.service.ts +0 -28
- package/examples/common/section-card/section-card.component.html +0 -5
- package/examples/common/section-card/section-card.component.scss +0 -15
- package/examples/common/section-card/section-card.component.ts +0 -11
- package/examples/common/utils.ts +0 -0
- package/examples/portal/src/app/a-detail/a-detail.component.html +0 -8
- package/examples/portal/src/app/a-detail/a-detail.component.ts +0 -18
- package/examples/portal/src/app/about/about.component.html +0 -27
- package/examples/portal/src/app/about/about.component.scss +0 -0
- package/examples/portal/src/app/about/about.component.spec.ts +0 -26
- package/examples/portal/src/app/about/about.component.ts +0 -26
- package/examples/portal/src/app/app-routing.module.ts +0 -57
- package/examples/portal/src/app/app.component.html +0 -73
- package/examples/portal/src/app/app.component.scss +0 -58
- package/examples/portal/src/app/app.component.spec.ts +0 -33
- package/examples/portal/src/app/app.component.ts +0 -111
- package/examples/portal/src/app/app.module.ts +0 -64
- package/examples/portal/src/app/custom-settings.service.ts +0 -44
- package/examples/portal/src/app/overlay.ts +0 -26
- package/examples/portal/src/app/settings/settings.component.html +0 -31
- package/examples/portal/src/app/settings/settings.component.scss +0 -3
- package/examples/portal/src/app/settings/settings.component.ts +0 -43
- package/examples/portal/src/assets/.gitkeep +0 -0
- package/examples/portal/src/assets/apps.json +0 -29
- package/examples/portal/src/assets/icons/sprite.defs.svg +0 -1
- package/examples/portal/src/assets/images/logo.svg +0 -16
- package/examples/portal/src/assets/ngx-planet-micro-front-end.gif +0 -0
- package/examples/portal/src/browserslist +0 -11
- package/examples/portal/src/environments/environment.prod.ts +0 -3
- package/examples/portal/src/environments/environment.ts +0 -16
- package/examples/portal/src/extra-webpack.config.js +0 -32
- package/examples/portal/src/favicon.ico +0 -0
- package/examples/portal/src/index.html +0 -14
- package/examples/portal/src/karma.conf.js +0 -31
- package/examples/portal/src/main.ts +0 -18
- package/examples/portal/src/polyfills.ts +0 -84
- package/examples/portal/src/reboot.scss +0 -14
- package/examples/portal/src/styles.scss +0 -14
- package/examples/portal/src/test.ts +0 -14
- package/examples/portal/src/tsconfig.app.json +0 -10
- package/examples/portal/src/tsconfig.spec.json +0 -9
- package/examples/portal/src/tslint.json +0 -7
- package/extra-webpack.config.js +0 -5
- package/nginx.conf +0 -17
- package/packages/planet/karma.conf.js +0 -37
- package/packages/planet/ng-package.json +0 -7
- package/packages/planet/package.json +0 -10
- package/packages/planet/src/application/planet-application-loader.spec.ts +0 -1102
- package/packages/planet/src/application/planet-application-loader.ts +0 -549
- package/packages/planet/src/application/planet-application-ref.spec.ts +0 -233
- package/packages/planet/src/application/planet-application-ref.ts +0 -131
- package/packages/planet/src/application/planet-application.service.spec.ts +0 -145
- package/packages/planet/src/application/planet-application.service.ts +0 -88
- package/packages/planet/src/application/portal-application.spec.ts +0 -53
- package/packages/planet/src/assets-loader.spec.ts +0 -689
- package/packages/planet/src/assets-loader.ts +0 -247
- package/packages/planet/src/component/planet-component-loader.spec.ts +0 -187
- package/packages/planet/src/component/planet-component-loader.ts +0 -173
- package/packages/planet/src/component/planet-component-ref.ts +0 -8
- package/packages/planet/src/debug.spec.ts +0 -58
- package/packages/planet/src/debug.ts +0 -66
- package/packages/planet/src/empty/empty.component.spec.ts +0 -34
- package/packages/planet/src/empty/empty.component.ts +0 -7
- package/packages/planet/src/global-event-dispatcher.spec.ts +0 -81
- package/packages/planet/src/global-event-dispatcher.ts +0 -82
- package/packages/planet/src/global-planet.spec.ts +0 -39
- package/packages/planet/src/global-planet.ts +0 -73
- package/packages/planet/src/helpers.spec.ts +0 -242
- package/packages/planet/src/helpers.ts +0 -125
- package/packages/planet/src/module.spec.ts +0 -79
- package/packages/planet/src/module.ts +0 -25
- package/packages/planet/src/planet.spec.ts +0 -226
- package/packages/planet/src/planet.ts +0 -113
- package/packages/planet/src/sandbox/constants.ts +0 -6
- package/packages/planet/src/sandbox/exec.ts +0 -22
- package/packages/planet/src/sandbox/index.ts +0 -24
- package/packages/planet/src/sandbox/proxy/patches/document.ts +0 -13
- package/packages/planet/src/sandbox/proxy/patches/eventListener.ts +0 -49
- package/packages/planet/src/sandbox/proxy/patches/index.ts +0 -13
- package/packages/planet/src/sandbox/proxy/patches/storage.ts +0 -53
- package/packages/planet/src/sandbox/proxy/patches/timer.ts +0 -50
- package/packages/planet/src/sandbox/proxy/proxies/common.ts +0 -137
- package/packages/planet/src/sandbox/proxy/proxies/document.ts +0 -140
- package/packages/planet/src/sandbox/proxy/proxies/window.ts +0 -176
- package/packages/planet/src/sandbox/proxy/proxy-sandbox.ts +0 -59
- package/packages/planet/src/sandbox/sandbox.ts +0 -20
- package/packages/planet/src/sandbox/snapshot/snapshot-sandbox.ts +0 -12
- package/packages/planet/src/sandbox/types.ts +0 -1
- package/packages/planet/src/test.ts +0 -16
- package/packages/planet/src/testing/app1.module.ts +0 -34
- package/packages/planet/src/testing/app2.module.ts +0 -24
- package/packages/planet/src/testing/applications.ts +0 -58
- package/packages/planet/src/testing/index.ts +0 -2
- package/packages/planet/src/testing/utils.ts +0 -31
- package/packages/planet/tsconfig.lib.json +0 -27
- package/packages/planet/tsconfig.lib.prod.json +0 -9
- package/packages/planet/tsconfig.spec.json +0 -17
- package/packages/planet/tslint.json +0 -7
- package/postcss.config.js +0 -3
- package/proxy.conf.js +0 -15
- package/tsconfig.json +0 -23
- package/tslint.json +0 -80
|
@@ -1,1102 +0,0 @@
|
|
|
1
|
-
import { Subject } from 'rxjs';
|
|
2
|
-
import { Router } from '@angular/router';
|
|
3
|
-
import { TestBed, fakeAsync, tick, flush } from '@angular/core/testing';
|
|
4
|
-
import { HttpClientTestingModule } from '@angular/common/http/testing';
|
|
5
|
-
import { PlanetApplicationLoader, ApplicationStatus } from './planet-application-loader';
|
|
6
|
-
import { AssetsLoader, AssetsLoadResult } from '../assets-loader';
|
|
7
|
-
import { SwitchModes, PlanetApplication } from '../planet.class';
|
|
8
|
-
import { PlanetApplicationService } from './planet-application.service';
|
|
9
|
-
import { NgZone, Injector, ApplicationRef } from '@angular/core';
|
|
10
|
-
import { BootstrapOptions, PlanetApplicationRef } from './planet-application-ref';
|
|
11
|
-
import { app1, app2 } from '../testing/applications';
|
|
12
|
-
import { Planet } from 'ngx-planet/planet';
|
|
13
|
-
import { getApplicationLoader, getApplicationService, clearGlobalPlanet } from 'ngx-planet/global-planet';
|
|
14
|
-
import { RouterTestingModule } from '@angular/router/testing';
|
|
15
|
-
import { sample } from '../testing/utils';
|
|
16
|
-
|
|
17
|
-
class PlanetApplicationRefFaker {
|
|
18
|
-
planetAppRef: PlanetApplicationRef;
|
|
19
|
-
destroySpy: jasmine.Spy;
|
|
20
|
-
bootstrapSpy: jasmine.Spy;
|
|
21
|
-
navigateByUrlSpy: jasmine.Spy;
|
|
22
|
-
getCurrentRouterStateUrlSpy: jasmine.Spy;
|
|
23
|
-
bootstrap$: Subject<PlanetApplicationRef>;
|
|
24
|
-
|
|
25
|
-
constructor(appName: string, options?: BootstrapOptions) {
|
|
26
|
-
this.planetAppRef = new PlanetApplicationRef(appName, options);
|
|
27
|
-
this.bootstrapSpy = spyOn(this.planetAppRef, 'bootstrap');
|
|
28
|
-
this.bootstrap$ = new Subject<PlanetApplicationRef>();
|
|
29
|
-
this.bootstrapSpy.and.returnValues(this.bootstrap$, this.bootstrap$);
|
|
30
|
-
this.destroySpy = spyOn(this.planetAppRef, 'destroy');
|
|
31
|
-
this.navigateByUrlSpy = spyOn(this.planetAppRef, 'navigateByUrl');
|
|
32
|
-
|
|
33
|
-
this.getCurrentRouterStateUrlSpy = spyOn(this.planetAppRef, 'getCurrentRouterStateUrl');
|
|
34
|
-
|
|
35
|
-
(window as any).planet.apps[appName] = this.planetAppRef;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
static create(appName: string, options?: BootstrapOptions) {
|
|
39
|
-
return new PlanetApplicationRefFaker(appName, options);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
bootstrap() {
|
|
43
|
-
this.bootstrap$.next();
|
|
44
|
-
this.bootstrap$.complete();
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
haveBeenBootstrap() {
|
|
48
|
-
expect(this.bootstrapSpy).toHaveBeenCalled();
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
haveNotBeenBootstrap() {
|
|
52
|
-
expect(this.bootstrapSpy).not.toHaveBeenCalled();
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
class AppStatusChangeFaker {
|
|
57
|
-
spy: jasmine.Spy;
|
|
58
|
-
planetApplicationLoader: PlanetApplicationLoader;
|
|
59
|
-
|
|
60
|
-
status = new Map<string, ApplicationStatus>();
|
|
61
|
-
|
|
62
|
-
constructor(planetApplicationLoader: PlanetApplicationLoader) {
|
|
63
|
-
this.planetApplicationLoader = planetApplicationLoader;
|
|
64
|
-
this.spy = jasmine.createSpy('app status change spy');
|
|
65
|
-
planetApplicationLoader.appStatusChange.subscribe(data => {
|
|
66
|
-
this.spy(data);
|
|
67
|
-
this.status.set(data.app.name, data.status);
|
|
68
|
-
});
|
|
69
|
-
expect(this.spy).not.toHaveBeenCalled();
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
static create(planetApplicationLoader: PlanetApplicationLoader) {
|
|
73
|
-
return new AppStatusChangeFaker(planetApplicationLoader);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
expectHaveBeenCalledWith(...params: any[]) {
|
|
77
|
-
expect(this.spy).toHaveBeenCalled();
|
|
78
|
-
expect(this.spy).toHaveBeenCalledWith(...params);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// 封装从资源加载完毕到应用的启动和激活过程,简化每个测试用例重复写很多逻辑
|
|
82
|
-
expectFromAssetsLoadedToActive(
|
|
83
|
-
fromCalledTimes: number,
|
|
84
|
-
appRefFaker: PlanetApplicationRefFaker,
|
|
85
|
-
expectedApp: PlanetApplication
|
|
86
|
-
) {
|
|
87
|
-
appRefFaker.haveNotBeenBootstrap();
|
|
88
|
-
flush();
|
|
89
|
-
appRefFaker.haveBeenBootstrap();
|
|
90
|
-
expect(this.spy).toHaveBeenCalledTimes(fromCalledTimes + 1);
|
|
91
|
-
expect(this.spy).toHaveBeenCalledWith({ app: expectedApp, status: ApplicationStatus.bootstrapping });
|
|
92
|
-
expect(this.planetApplicationLoader.loadingDone).toBe(false);
|
|
93
|
-
appRefFaker.bootstrap();
|
|
94
|
-
expect(this.planetApplicationLoader.loadingDone).toBe(true);
|
|
95
|
-
expect(this.spy).toHaveBeenCalledTimes(fromCalledTimes + 3);
|
|
96
|
-
|
|
97
|
-
expect(this.spy).toHaveBeenCalledWith({ app: expectedApp, status: ApplicationStatus.bootstrapped });
|
|
98
|
-
expect(this.spy).toHaveBeenCalledWith({ app: expectedApp, status: ApplicationStatus.active });
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
expectAppStatus(appName: string, expectedStatus: ApplicationStatus) {
|
|
102
|
-
const status = this.status.get(appName);
|
|
103
|
-
expect(status).toEqual(expectedStatus, `${appName} status is ${status}`);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
describe('PlanetApplicationLoader', () => {
|
|
108
|
-
let planetApplicationLoader: PlanetApplicationLoader;
|
|
109
|
-
let planetApplicationService: PlanetApplicationService;
|
|
110
|
-
let assetsLoader: AssetsLoader;
|
|
111
|
-
let ngZone: NgZone;
|
|
112
|
-
let planet: Planet;
|
|
113
|
-
|
|
114
|
-
function expectApp1Element(classesStr = 'app1-host app1-prefix') {
|
|
115
|
-
const app1Host = document.querySelector(app1.selector);
|
|
116
|
-
expect(app1Host).toBeTruthy();
|
|
117
|
-
expect(app1Host.outerHTML).toEqual(`<app1-root class="${classesStr}"></app1-root>`);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
function expectApp2Element() {
|
|
121
|
-
const app2Host = document.querySelector(app2.selector);
|
|
122
|
-
expect(app2Host).toBeTruthy();
|
|
123
|
-
expect(app2Host.outerHTML).toEqual(`<app2-root class="app2-host"></app2-root>`);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
beforeEach(() => {
|
|
127
|
-
TestBed.configureTestingModule({
|
|
128
|
-
imports: [HttpClientTestingModule, RouterTestingModule.withRoutes([])]
|
|
129
|
-
});
|
|
130
|
-
planet = TestBed.inject(Planet);
|
|
131
|
-
planetApplicationLoader = getApplicationLoader();
|
|
132
|
-
planetApplicationService = getApplicationService();
|
|
133
|
-
assetsLoader = TestBed.inject(AssetsLoader);
|
|
134
|
-
ngZone = TestBed.inject(NgZone);
|
|
135
|
-
|
|
136
|
-
planetApplicationService.register(app1);
|
|
137
|
-
planetApplicationService.register(app2);
|
|
138
|
-
|
|
139
|
-
// 创建宿主容器
|
|
140
|
-
const hostContainer = document.createElement('DIV');
|
|
141
|
-
hostContainer.classList.add('host-selector');
|
|
142
|
-
document.body.appendChild(hostContainer);
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
afterEach(() => {
|
|
146
|
-
clearGlobalPlanet();
|
|
147
|
-
planetApplicationLoader['destroyApp'](app1);
|
|
148
|
-
planetApplicationLoader['destroyApp'](app2);
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
it(`should throw error for PlanetApplicationLoader guard when has multiple instances`, () => {
|
|
152
|
-
expect(() => {
|
|
153
|
-
return new PlanetApplicationLoader(
|
|
154
|
-
TestBed.inject(AssetsLoader),
|
|
155
|
-
TestBed.inject(PlanetApplicationService),
|
|
156
|
-
TestBed.inject(NgZone),
|
|
157
|
-
TestBed.inject(Router),
|
|
158
|
-
TestBed.inject(Injector),
|
|
159
|
-
TestBed.inject(ApplicationRef)
|
|
160
|
-
);
|
|
161
|
-
}).toThrowError('PlanetApplicationLoader has been injected in the portal, repeated injection is not allowed');
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
it(`should load (load assets and bootstrap) app1 success for legacy selector`, fakeAsync(() => {
|
|
165
|
-
const loadAppAssets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
166
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
167
|
-
assetsLoaderSpy.and.returnValue(loadAppAssets$);
|
|
168
|
-
|
|
169
|
-
const app1RefFaker = PlanetApplicationRefFaker.create(app1.name);
|
|
170
|
-
|
|
171
|
-
// App state change
|
|
172
|
-
const appStatusChangeFaker = AppStatusChangeFaker.create(planetApplicationLoader);
|
|
173
|
-
|
|
174
|
-
// Apps loading start
|
|
175
|
-
const appsLoadingStartSpy = jasmine.createSpy('apps loading start spy');
|
|
176
|
-
planetApplicationLoader.appsLoadingStart.subscribe(appsLoadingStartSpy);
|
|
177
|
-
expect(appsLoadingStartSpy).not.toHaveBeenCalled();
|
|
178
|
-
|
|
179
|
-
planetApplicationLoader.reroute({ url: '/app1/dashboard' });
|
|
180
|
-
|
|
181
|
-
appStatusChangeFaker.expectHaveBeenCalledWith({ app: app1, status: ApplicationStatus.assetsLoading });
|
|
182
|
-
|
|
183
|
-
expect(appsLoadingStartSpy).toHaveBeenCalled();
|
|
184
|
-
expect(appsLoadingStartSpy).toHaveBeenCalledWith({
|
|
185
|
-
shouldLoadApps: [app1],
|
|
186
|
-
shouldUnloadApps: []
|
|
187
|
-
});
|
|
188
|
-
loadAppAssets$.next();
|
|
189
|
-
loadAppAssets$.complete();
|
|
190
|
-
|
|
191
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(2);
|
|
192
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({ app: app1, status: ApplicationStatus.assetsLoaded });
|
|
193
|
-
|
|
194
|
-
appStatusChangeFaker.expectFromAssetsLoadedToActive(2, app1RefFaker, app1);
|
|
195
|
-
|
|
196
|
-
// 判断是否在宿主元素中创建了应用根节点
|
|
197
|
-
expectApp1Element();
|
|
198
|
-
|
|
199
|
-
tick();
|
|
200
|
-
}));
|
|
201
|
-
|
|
202
|
-
it(`should load (load assets and bootstrap) app1 success use template`, fakeAsync(() => {
|
|
203
|
-
const loadAppAssets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
204
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
205
|
-
assetsLoaderSpy.and.returnValue(loadAppAssets$);
|
|
206
|
-
const app1RefFaker = PlanetApplicationRefFaker.create(app1.name, {
|
|
207
|
-
template: `<app1-root class="app1-root"></app1-root>`,
|
|
208
|
-
bootstrap: null
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
// App state change
|
|
212
|
-
const appStatusChangeFaker = AppStatusChangeFaker.create(planetApplicationLoader);
|
|
213
|
-
|
|
214
|
-
// Apps loading start
|
|
215
|
-
const appsLoadingStartSpy = jasmine.createSpy('apps loading start spy');
|
|
216
|
-
planetApplicationLoader.appsLoadingStart.subscribe(appsLoadingStartSpy);
|
|
217
|
-
planetApplicationLoader.reroute({ url: '/app1/dashboard' });
|
|
218
|
-
loadAppAssets$.next();
|
|
219
|
-
loadAppAssets$.complete();
|
|
220
|
-
appStatusChangeFaker.expectFromAssetsLoadedToActive(2, app1RefFaker, app1);
|
|
221
|
-
|
|
222
|
-
// 判断是否在宿主元素中创建了应用根节点
|
|
223
|
-
expectApp1Element(`app1-root app1-host app1-prefix`);
|
|
224
|
-
|
|
225
|
-
tick();
|
|
226
|
-
}));
|
|
227
|
-
|
|
228
|
-
it(`should load empty apps when route navigate to '/app-not-found/dashboard'`, fakeAsync(() => {
|
|
229
|
-
const loadAppAssets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
230
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
231
|
-
assetsLoaderSpy.and.returnValue(loadAppAssets$);
|
|
232
|
-
|
|
233
|
-
// Apps loading start
|
|
234
|
-
const appsLoadingStartSpy = jasmine.createSpy('apps loading start spy');
|
|
235
|
-
planetApplicationLoader.appsLoadingStart.subscribe(appsLoadingStartSpy);
|
|
236
|
-
planetApplicationLoader.reroute({ url: '/app-not-found/dashboard' });
|
|
237
|
-
|
|
238
|
-
expect(appsLoadingStartSpy).toHaveBeenCalledTimes(1);
|
|
239
|
-
expect(appsLoadingStartSpy).toHaveBeenCalledWith({
|
|
240
|
-
shouldLoadApps: [],
|
|
241
|
-
shouldUnloadApps: []
|
|
242
|
-
});
|
|
243
|
-
expect(planetApplicationLoader.loadingDone).toEqual(true);
|
|
244
|
-
|
|
245
|
-
loadAppAssets$.next();
|
|
246
|
-
loadAppAssets$.complete();
|
|
247
|
-
|
|
248
|
-
expect(planetApplicationLoader.loadingDone).toEqual(true);
|
|
249
|
-
expect(appsLoadingStartSpy).toHaveBeenCalledTimes(1);
|
|
250
|
-
|
|
251
|
-
flush();
|
|
252
|
-
}));
|
|
253
|
-
|
|
254
|
-
it(`should not update loadingDone to false when app1 url navigate and app1 has been active`, fakeAsync(() => {
|
|
255
|
-
const loadAppAssets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
256
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
257
|
-
assetsLoaderSpy.and.returnValue(loadAppAssets$);
|
|
258
|
-
|
|
259
|
-
const appStatusChangeFaker = AppStatusChangeFaker.create(planetApplicationLoader);
|
|
260
|
-
const app1RefFaker = PlanetApplicationRefFaker.create(app1.name);
|
|
261
|
-
|
|
262
|
-
planetApplicationLoader.reroute({ url: '/app1/dashboard' });
|
|
263
|
-
loadAppAssets$.next();
|
|
264
|
-
loadAppAssets$.complete();
|
|
265
|
-
flush();
|
|
266
|
-
app1RefFaker.haveBeenBootstrap();
|
|
267
|
-
app1RefFaker.bootstrap();
|
|
268
|
-
|
|
269
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(5);
|
|
270
|
-
expect(app1RefFaker.navigateByUrlSpy).not.toHaveBeenCalled();
|
|
271
|
-
planetApplicationLoader.reroute({ url: '/app1/dashboard2' });
|
|
272
|
-
|
|
273
|
-
// app1 has been loaded
|
|
274
|
-
expect(planetApplicationLoader.loadingDone).toEqual(true);
|
|
275
|
-
flush();
|
|
276
|
-
|
|
277
|
-
// app2 has been not loaded
|
|
278
|
-
planetApplicationLoader.reroute({ url: '/app2/dashboard1' });
|
|
279
|
-
expect(planetApplicationLoader.loadingDone).toEqual(false);
|
|
280
|
-
flush();
|
|
281
|
-
}));
|
|
282
|
-
|
|
283
|
-
it(`should not bootstrap app1 when app1 is active`, fakeAsync(() => {
|
|
284
|
-
const loadAppAssets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
285
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
286
|
-
assetsLoaderSpy.and.returnValue(loadAppAssets$);
|
|
287
|
-
|
|
288
|
-
const appStatusChangeFaker = AppStatusChangeFaker.create(planetApplicationLoader);
|
|
289
|
-
const app1RefFaker = PlanetApplicationRefFaker.create(app1.name);
|
|
290
|
-
|
|
291
|
-
planetApplicationLoader.reroute({ url: '/app1/dashboard' });
|
|
292
|
-
|
|
293
|
-
loadAppAssets$.next();
|
|
294
|
-
loadAppAssets$.complete();
|
|
295
|
-
|
|
296
|
-
flush();
|
|
297
|
-
|
|
298
|
-
app1RefFaker.haveBeenBootstrap();
|
|
299
|
-
app1RefFaker.bootstrap();
|
|
300
|
-
|
|
301
|
-
// 判断是否在宿主元素中创建了应用根节点
|
|
302
|
-
expectApp1Element();
|
|
303
|
-
|
|
304
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(5);
|
|
305
|
-
planetApplicationLoader.reroute({ url: '/app1/dashboard2' });
|
|
306
|
-
|
|
307
|
-
flush();
|
|
308
|
-
|
|
309
|
-
expect(app1RefFaker.bootstrapSpy).toHaveBeenCalledTimes(1);
|
|
310
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(5);
|
|
311
|
-
|
|
312
|
-
tick();
|
|
313
|
-
|
|
314
|
-
expect(app1RefFaker.bootstrapSpy).toHaveBeenCalledTimes(1);
|
|
315
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(5);
|
|
316
|
-
}));
|
|
317
|
-
|
|
318
|
-
it(`should call app1 navigateByUrl when app1 is active`, fakeAsync(() => {
|
|
319
|
-
const loadAppAssets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
320
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
321
|
-
assetsLoaderSpy.and.returnValue(loadAppAssets$);
|
|
322
|
-
|
|
323
|
-
const appStatusChangeFaker = AppStatusChangeFaker.create(planetApplicationLoader);
|
|
324
|
-
const app1RefFaker = PlanetApplicationRefFaker.create(app1.name);
|
|
325
|
-
|
|
326
|
-
planetApplicationLoader.reroute({ url: '/app1/dashboard' });
|
|
327
|
-
loadAppAssets$.next();
|
|
328
|
-
loadAppAssets$.complete();
|
|
329
|
-
|
|
330
|
-
flush();
|
|
331
|
-
|
|
332
|
-
app1RefFaker.haveBeenBootstrap();
|
|
333
|
-
app1RefFaker.bootstrap();
|
|
334
|
-
|
|
335
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(5);
|
|
336
|
-
expect(app1RefFaker.navigateByUrlSpy).not.toHaveBeenCalled();
|
|
337
|
-
|
|
338
|
-
planetApplicationLoader.reroute({ url: '/app1/dashboard2' });
|
|
339
|
-
|
|
340
|
-
flush();
|
|
341
|
-
|
|
342
|
-
expect(app1RefFaker.navigateByUrlSpy).toHaveBeenCalledTimes(1);
|
|
343
|
-
expect(app1RefFaker.navigateByUrlSpy).toHaveBeenCalledWith('/app1/dashboard2');
|
|
344
|
-
}));
|
|
345
|
-
|
|
346
|
-
it(`should hide app1 success when app1 is not match and switch mode is default`, fakeAsync(() => {
|
|
347
|
-
const loadAppAssets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
348
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
349
|
-
assetsLoaderSpy.and.returnValue(loadAppAssets$);
|
|
350
|
-
|
|
351
|
-
const app1RefFaker = PlanetApplicationRefFaker.create(app1.name);
|
|
352
|
-
|
|
353
|
-
// App state change
|
|
354
|
-
const appStatusChangeFaker = AppStatusChangeFaker.create(planetApplicationLoader);
|
|
355
|
-
|
|
356
|
-
// Apps loading start
|
|
357
|
-
const appsLoadingStartSpy = jasmine.createSpy('apps loading start spy');
|
|
358
|
-
planetApplicationLoader.appsLoadingStart.subscribe(appsLoadingStartSpy);
|
|
359
|
-
expect(appsLoadingStartSpy).not.toHaveBeenCalled();
|
|
360
|
-
|
|
361
|
-
planetApplicationLoader.reroute({ url: '/app1/dashboard' });
|
|
362
|
-
|
|
363
|
-
loadAppAssets$.next();
|
|
364
|
-
loadAppAssets$.complete();
|
|
365
|
-
|
|
366
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(2);
|
|
367
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({ app: app1, status: ApplicationStatus.assetsLoaded });
|
|
368
|
-
|
|
369
|
-
appStatusChangeFaker.expectFromAssetsLoadedToActive(2, app1RefFaker, app1);
|
|
370
|
-
|
|
371
|
-
tick();
|
|
372
|
-
const app1Host = document.querySelector(app1.selector);
|
|
373
|
-
planetApplicationLoader.reroute({ url: '/app2/dashboard' });
|
|
374
|
-
expect(app1Host.getAttribute('style')).toContain('display:none;');
|
|
375
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(7);
|
|
376
|
-
tick();
|
|
377
|
-
// restore status to assetsLoaded when switch mode is default
|
|
378
|
-
appStatusChangeFaker.expectAppStatus(app1.name, ApplicationStatus.assetsLoaded);
|
|
379
|
-
expect(document.querySelector(app1.selector)).toBeFalsy();
|
|
380
|
-
}));
|
|
381
|
-
|
|
382
|
-
it(`should destroy app1 success when app1 is not match and switch mode is coexist`, fakeAsync(() => {
|
|
383
|
-
const loadAppAssets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
384
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
385
|
-
assetsLoaderSpy.and.returnValue(loadAppAssets$);
|
|
386
|
-
app1.switchMode = SwitchModes.coexist;
|
|
387
|
-
const app1RefFaker = PlanetApplicationRefFaker.create(app1.name);
|
|
388
|
-
|
|
389
|
-
// App state change
|
|
390
|
-
const appStatusChangeFaker = AppStatusChangeFaker.create(planetApplicationLoader);
|
|
391
|
-
|
|
392
|
-
// Apps loading start
|
|
393
|
-
const appsLoadingStartSpy = jasmine.createSpy('apps loading start spy');
|
|
394
|
-
planetApplicationLoader.appsLoadingStart.subscribe(appsLoadingStartSpy);
|
|
395
|
-
expect(appsLoadingStartSpy).not.toHaveBeenCalled();
|
|
396
|
-
|
|
397
|
-
planetApplicationLoader.reroute({ url: '/app1/dashboard' });
|
|
398
|
-
|
|
399
|
-
loadAppAssets$.next();
|
|
400
|
-
loadAppAssets$.complete();
|
|
401
|
-
|
|
402
|
-
appStatusChangeFaker.expectFromAssetsLoadedToActive(2, app1RefFaker, app1);
|
|
403
|
-
|
|
404
|
-
tick();
|
|
405
|
-
|
|
406
|
-
const app1Host = document.querySelector(app1.selector);
|
|
407
|
-
planetApplicationLoader.reroute({ url: '/app2/dashboard' });
|
|
408
|
-
expect(app1Host!.getAttribute('style')).toContain('display:none;');
|
|
409
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(7);
|
|
410
|
-
|
|
411
|
-
tick();
|
|
412
|
-
|
|
413
|
-
// restore status to bootstrapped when switch mode is coexist
|
|
414
|
-
appStatusChangeFaker.expectAppStatus(app1.name, ApplicationStatus.bootstrapped);
|
|
415
|
-
app1.switchMode = SwitchModes.default;
|
|
416
|
-
expect(document.querySelector(app1.selector)).toBeTruthy();
|
|
417
|
-
}));
|
|
418
|
-
|
|
419
|
-
it(`should not call app1 navigateByUrl when app1 is active and url is same`, fakeAsync(() => {
|
|
420
|
-
const loadAppAssets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
421
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
422
|
-
assetsLoaderSpy.and.returnValue(loadAppAssets$);
|
|
423
|
-
|
|
424
|
-
const appStatusChangeFaker = AppStatusChangeFaker.create(planetApplicationLoader);
|
|
425
|
-
const app1RefFaker = PlanetApplicationRefFaker.create(app1.name);
|
|
426
|
-
planetApplicationLoader.reroute({ url: '/app1/dashboard' });
|
|
427
|
-
loadAppAssets$.next();
|
|
428
|
-
loadAppAssets$.complete();
|
|
429
|
-
flush();
|
|
430
|
-
app1RefFaker.haveBeenBootstrap();
|
|
431
|
-
app1RefFaker.bootstrap();
|
|
432
|
-
|
|
433
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(5);
|
|
434
|
-
expect(app1RefFaker.navigateByUrlSpy).not.toHaveBeenCalled();
|
|
435
|
-
app1RefFaker.getCurrentRouterStateUrlSpy.and.returnValue('/app1/dashboard2');
|
|
436
|
-
planetApplicationLoader.reroute({ url: '/app1/dashboard2' });
|
|
437
|
-
flush();
|
|
438
|
-
expect(app1RefFaker.navigateByUrlSpy).not.toHaveBeenCalled();
|
|
439
|
-
tick();
|
|
440
|
-
}));
|
|
441
|
-
|
|
442
|
-
it(`should start load app1 once when reroute same url: /app1/dashboard`, fakeAsync(() => {
|
|
443
|
-
const loadAppAssets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
444
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
445
|
-
assetsLoaderSpy.and.returnValue(loadAppAssets$);
|
|
446
|
-
|
|
447
|
-
// Apps loading start
|
|
448
|
-
const appsLoadingStartSpy = jasmine.createSpy('apps loading start spy');
|
|
449
|
-
planetApplicationLoader.appsLoadingStart.subscribe(appsLoadingStartSpy);
|
|
450
|
-
expect(appsLoadingStartSpy).not.toHaveBeenCalled();
|
|
451
|
-
|
|
452
|
-
planetApplicationLoader.reroute({ url: '/app1/dashboard' });
|
|
453
|
-
expect(appsLoadingStartSpy).toHaveBeenCalledTimes(1);
|
|
454
|
-
expect(appsLoadingStartSpy).toHaveBeenCalled();
|
|
455
|
-
expect(appsLoadingStartSpy).toHaveBeenCalledWith({
|
|
456
|
-
shouldLoadApps: [app1],
|
|
457
|
-
shouldUnloadApps: []
|
|
458
|
-
});
|
|
459
|
-
planetApplicationLoader.reroute({ url: '/app1/dashboard' });
|
|
460
|
-
expect(appsLoadingStartSpy).toHaveBeenCalledTimes(1);
|
|
461
|
-
tick();
|
|
462
|
-
}));
|
|
463
|
-
|
|
464
|
-
it(`should cancel load app1 which assets has not loaded when next route (app2) change`, fakeAsync(() => {
|
|
465
|
-
const loadApp1Assets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
466
|
-
const loadApp2Assets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
467
|
-
|
|
468
|
-
const app1RefFaker = PlanetApplicationRefFaker.create(app1.name);
|
|
469
|
-
const app2RefFaker = PlanetApplicationRefFaker.create(app2.name);
|
|
470
|
-
|
|
471
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
472
|
-
assetsLoaderSpy.and.returnValues(loadApp1Assets$, loadApp2Assets$);
|
|
473
|
-
|
|
474
|
-
const appStatusChangeFaker = AppStatusChangeFaker.create(planetApplicationLoader);
|
|
475
|
-
|
|
476
|
-
expect(appStatusChangeFaker.spy).not.toHaveBeenCalled();
|
|
477
|
-
planetApplicationLoader.reroute({ url: '/app1' });
|
|
478
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalled();
|
|
479
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({ app: app1, status: ApplicationStatus.assetsLoading });
|
|
480
|
-
|
|
481
|
-
planetApplicationLoader.reroute({ url: '/app2' });
|
|
482
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(2);
|
|
483
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({ app: app2, status: ApplicationStatus.assetsLoading });
|
|
484
|
-
loadApp1Assets$.next();
|
|
485
|
-
loadApp1Assets$.complete();
|
|
486
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(2);
|
|
487
|
-
loadApp2Assets$.next();
|
|
488
|
-
loadApp2Assets$.complete();
|
|
489
|
-
|
|
490
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(3);
|
|
491
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({ app: app2, status: ApplicationStatus.assetsLoaded });
|
|
492
|
-
|
|
493
|
-
appStatusChangeFaker.expectFromAssetsLoadedToActive(3, app2RefFaker, app2);
|
|
494
|
-
app1RefFaker.haveNotBeenBootstrap();
|
|
495
|
-
app2RefFaker.haveBeenBootstrap();
|
|
496
|
-
|
|
497
|
-
tick();
|
|
498
|
-
}));
|
|
499
|
-
|
|
500
|
-
it(`should cancel load app1 which has not bootstrapped when next route (app2) change`, fakeAsync(() => {
|
|
501
|
-
const loadApp1Assets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
502
|
-
const loadApp2Assets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
503
|
-
|
|
504
|
-
const app1RefFaker = PlanetApplicationRefFaker.create(app1.name);
|
|
505
|
-
const app2RefFaker = PlanetApplicationRefFaker.create(app2.name);
|
|
506
|
-
|
|
507
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
508
|
-
assetsLoaderSpy.and.returnValues(loadApp1Assets$, loadApp2Assets$);
|
|
509
|
-
|
|
510
|
-
const appStatusChangeFaker = AppStatusChangeFaker.create(planetApplicationLoader);
|
|
511
|
-
|
|
512
|
-
expect(appStatusChangeFaker.spy).not.toHaveBeenCalled();
|
|
513
|
-
planetApplicationLoader.reroute({ url: '/app1' });
|
|
514
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalled();
|
|
515
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({ app: app1, status: ApplicationStatus.assetsLoading });
|
|
516
|
-
|
|
517
|
-
loadApp1Assets$.next();
|
|
518
|
-
loadApp1Assets$.complete();
|
|
519
|
-
|
|
520
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(2);
|
|
521
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({ app: app1, status: ApplicationStatus.assetsLoaded });
|
|
522
|
-
|
|
523
|
-
planetApplicationLoader.reroute({ url: '/app2' });
|
|
524
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(3);
|
|
525
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({ app: app2, status: ApplicationStatus.assetsLoading });
|
|
526
|
-
|
|
527
|
-
loadApp2Assets$.next();
|
|
528
|
-
loadApp2Assets$.complete();
|
|
529
|
-
|
|
530
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(4);
|
|
531
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({ app: app2, status: ApplicationStatus.assetsLoaded });
|
|
532
|
-
|
|
533
|
-
appStatusChangeFaker.expectFromAssetsLoadedToActive(4, app2RefFaker, app2);
|
|
534
|
-
app1RefFaker.haveNotBeenBootstrap();
|
|
535
|
-
app2RefFaker.haveBeenBootstrap();
|
|
536
|
-
|
|
537
|
-
tick();
|
|
538
|
-
}));
|
|
539
|
-
|
|
540
|
-
it(`should reload sub app when sub app is bootstrapped`, fakeAsync(() => {
|
|
541
|
-
const loadAppAssets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
542
|
-
|
|
543
|
-
const appRefFaker = PlanetApplicationRefFaker.create(app2.name);
|
|
544
|
-
|
|
545
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
546
|
-
assetsLoaderSpy.and.returnValues(loadAppAssets$);
|
|
547
|
-
|
|
548
|
-
const appStatusChangeFaker = AppStatusChangeFaker.create(planetApplicationLoader);
|
|
549
|
-
|
|
550
|
-
planetApplicationLoader.reroute({ url: '/app2' });
|
|
551
|
-
|
|
552
|
-
loadAppAssets$.next();
|
|
553
|
-
loadAppAssets$.complete();
|
|
554
|
-
|
|
555
|
-
appStatusChangeFaker.expectFromAssetsLoadedToActive(2, appRefFaker, app2);
|
|
556
|
-
|
|
557
|
-
tick();
|
|
558
|
-
|
|
559
|
-
appStatusChangeFaker.expectAppStatus(app2.name, ApplicationStatus.active);
|
|
560
|
-
planetApplicationLoader.reroute({ url: '/dashboard' });
|
|
561
|
-
|
|
562
|
-
tick();
|
|
563
|
-
|
|
564
|
-
appStatusChangeFaker.expectAppStatus(app2.name, ApplicationStatus.bootstrapped);
|
|
565
|
-
planetApplicationLoader.reroute({ url: '/app2' });
|
|
566
|
-
|
|
567
|
-
tick();
|
|
568
|
-
|
|
569
|
-
appStatusChangeFaker.expectAppStatus(app2.name, ApplicationStatus.active);
|
|
570
|
-
}));
|
|
571
|
-
|
|
572
|
-
it(`should load next app(app2) when last app(app1) load error`, fakeAsync(() => {
|
|
573
|
-
const loadApp1Assets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
574
|
-
const loadApp2Assets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
575
|
-
|
|
576
|
-
const errorHandlerSpy = jasmine.createSpy(`error handler spy`);
|
|
577
|
-
planetApplicationLoader.setOptions({
|
|
578
|
-
errorHandler: errorHandlerSpy
|
|
579
|
-
});
|
|
580
|
-
|
|
581
|
-
const app1RefFaker = PlanetApplicationRefFaker.create(app1.name);
|
|
582
|
-
const app2RefFaker = PlanetApplicationRefFaker.create(app2.name);
|
|
583
|
-
|
|
584
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
585
|
-
assetsLoaderSpy.and.returnValues(loadApp1Assets$, loadApp2Assets$);
|
|
586
|
-
|
|
587
|
-
const appStatusChangeSpy = jasmine.createSpy('app status change spy');
|
|
588
|
-
planetApplicationLoader.appStatusChange.subscribe(appStatusChangeSpy);
|
|
589
|
-
|
|
590
|
-
expect(appStatusChangeSpy).not.toHaveBeenCalled();
|
|
591
|
-
planetApplicationLoader.reroute({ url: '/app1' });
|
|
592
|
-
expect(appStatusChangeSpy).toHaveBeenCalled();
|
|
593
|
-
expect(appStatusChangeSpy).toHaveBeenCalledWith({ app: app1, status: ApplicationStatus.assetsLoading });
|
|
594
|
-
|
|
595
|
-
expect(errorHandlerSpy).not.toHaveBeenCalled();
|
|
596
|
-
|
|
597
|
-
// Load Error
|
|
598
|
-
loadApp1Assets$.error(new Error(`load app1 assets error`));
|
|
599
|
-
loadApp1Assets$.complete();
|
|
600
|
-
|
|
601
|
-
expect(errorHandlerSpy).toHaveBeenCalled();
|
|
602
|
-
expect(errorHandlerSpy).toHaveBeenCalledWith(new Error(`load app1 assets error`));
|
|
603
|
-
|
|
604
|
-
planetApplicationLoader.reroute({ url: '/app2' });
|
|
605
|
-
expect(appStatusChangeSpy).toHaveBeenCalledTimes(3);
|
|
606
|
-
expect(appStatusChangeSpy).toHaveBeenCalledWith({ app: app2, status: ApplicationStatus.assetsLoading });
|
|
607
|
-
|
|
608
|
-
loadApp2Assets$.next();
|
|
609
|
-
loadApp2Assets$.complete();
|
|
610
|
-
|
|
611
|
-
expect(appStatusChangeSpy).toHaveBeenCalledTimes(4);
|
|
612
|
-
expect(appStatusChangeSpy).toHaveBeenCalledWith({ app: app2, status: ApplicationStatus.assetsLoaded });
|
|
613
|
-
|
|
614
|
-
flush();
|
|
615
|
-
app2RefFaker.bootstrap();
|
|
616
|
-
|
|
617
|
-
expect(appStatusChangeSpy).toHaveBeenCalledTimes(7);
|
|
618
|
-
expect(appStatusChangeSpy).toHaveBeenCalledWith({ app: app2, status: ApplicationStatus.bootstrapping });
|
|
619
|
-
expect(appStatusChangeSpy).toHaveBeenCalledWith({ app: app2, status: ApplicationStatus.bootstrapped });
|
|
620
|
-
expect(appStatusChangeSpy).toHaveBeenCalledWith({ app: app2, status: ApplicationStatus.active });
|
|
621
|
-
|
|
622
|
-
app1RefFaker.haveNotBeenBootstrap();
|
|
623
|
-
app2RefFaker.haveBeenBootstrap();
|
|
624
|
-
|
|
625
|
-
// 判断是否在宿主元素中创建了应用根节点
|
|
626
|
-
expectApp2Element();
|
|
627
|
-
tick();
|
|
628
|
-
}));
|
|
629
|
-
|
|
630
|
-
it(`should reload app(app1) when before app(app1) load error`, fakeAsync(() => {
|
|
631
|
-
const loadApp1Assets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
632
|
-
const loadApp1AginAssets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
633
|
-
|
|
634
|
-
const errorHandlerSpy = jasmine.createSpy(`error handler spy`);
|
|
635
|
-
planetApplicationLoader.setOptions({
|
|
636
|
-
errorHandler: errorHandlerSpy
|
|
637
|
-
});
|
|
638
|
-
|
|
639
|
-
const app1RefFaker = PlanetApplicationRefFaker.create(app1.name);
|
|
640
|
-
|
|
641
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
642
|
-
assetsLoaderSpy.and.returnValues(loadApp1Assets$, loadApp1AginAssets$);
|
|
643
|
-
|
|
644
|
-
const appStatusChangeFaker = AppStatusChangeFaker.create(planetApplicationLoader);
|
|
645
|
-
|
|
646
|
-
expect(appStatusChangeFaker.spy).not.toHaveBeenCalled();
|
|
647
|
-
planetApplicationLoader.reroute({ url: '/app1' });
|
|
648
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalled();
|
|
649
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({ app: app1, status: ApplicationStatus.assetsLoading });
|
|
650
|
-
|
|
651
|
-
expect(errorHandlerSpy).not.toHaveBeenCalled();
|
|
652
|
-
|
|
653
|
-
// Load Error
|
|
654
|
-
loadApp1Assets$.error(new Error(`load app1 assets error`));
|
|
655
|
-
loadApp1Assets$.complete();
|
|
656
|
-
|
|
657
|
-
expect(errorHandlerSpy).toHaveBeenCalled();
|
|
658
|
-
expect(errorHandlerSpy).toHaveBeenCalledWith(new Error(`load app1 assets error`));
|
|
659
|
-
|
|
660
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(2);
|
|
661
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({ app: app1, status: ApplicationStatus.loadError });
|
|
662
|
-
|
|
663
|
-
planetApplicationLoader.reroute({ url: '/app1/hello' });
|
|
664
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(3);
|
|
665
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({ app: app1, status: ApplicationStatus.assetsLoading });
|
|
666
|
-
|
|
667
|
-
loadApp1AginAssets$.next();
|
|
668
|
-
loadApp1AginAssets$.complete();
|
|
669
|
-
|
|
670
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(4);
|
|
671
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({ app: app1, status: ApplicationStatus.assetsLoaded });
|
|
672
|
-
|
|
673
|
-
appStatusChangeFaker.expectFromAssetsLoadedToActive(4, app1RefFaker, app1);
|
|
674
|
-
|
|
675
|
-
app1RefFaker.haveBeenBootstrap();
|
|
676
|
-
|
|
677
|
-
// 判断是否在宿主元素中创建了应用根节点
|
|
678
|
-
expectApp1Element();
|
|
679
|
-
|
|
680
|
-
tick();
|
|
681
|
-
}));
|
|
682
|
-
|
|
683
|
-
it(`should throw specify error when sub app not found in bootstrapApp`, () => {
|
|
684
|
-
const appNotFound = 'app100';
|
|
685
|
-
expect(() => {
|
|
686
|
-
planetApplicationLoader['bootstrapApp']({ name: appNotFound, routerPathPrefix: 'app100', hostParent: '' });
|
|
687
|
-
}).toThrowError(
|
|
688
|
-
`[${appNotFound}] not found, make sure that the app has the correct name defined use defineApplication(${appNotFound}) and runtimeChunk and vendorChunk are set to true, details see https://github.com/worktile/ngx-planet#throw-error-cannot-read-property-call-of-undefined-at-__webpack_require__-bootstrap79`
|
|
689
|
-
);
|
|
690
|
-
});
|
|
691
|
-
|
|
692
|
-
describe('error handler', () => {
|
|
693
|
-
it(`default error handler`, () => {
|
|
694
|
-
const loadAppAssets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
695
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
696
|
-
assetsLoaderSpy.and.returnValue(loadAppAssets$);
|
|
697
|
-
|
|
698
|
-
planetApplicationLoader.reroute({ url: '/app1/dashboard' });
|
|
699
|
-
|
|
700
|
-
loadAppAssets$.error('load app assets error');
|
|
701
|
-
});
|
|
702
|
-
|
|
703
|
-
it(`custom error handler`, () => {
|
|
704
|
-
const loadAppAssets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
705
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
706
|
-
assetsLoaderSpy.and.returnValue(loadAppAssets$);
|
|
707
|
-
|
|
708
|
-
planetApplicationLoader.reroute({ url: '/app1/dashboard' });
|
|
709
|
-
|
|
710
|
-
const errorHandlerSpy = jasmine.createSpy(`error handler spy`);
|
|
711
|
-
planetApplicationLoader.setOptions({
|
|
712
|
-
errorHandler: errorHandlerSpy
|
|
713
|
-
});
|
|
714
|
-
|
|
715
|
-
const error = new Error(`load app assets error`);
|
|
716
|
-
loadAppAssets$.error(error);
|
|
717
|
-
loadAppAssets$.complete();
|
|
718
|
-
|
|
719
|
-
expect(errorHandlerSpy).toHaveBeenCalled();
|
|
720
|
-
expect(errorHandlerSpy).toHaveBeenCalledWith(error);
|
|
721
|
-
});
|
|
722
|
-
});
|
|
723
|
-
|
|
724
|
-
describe('switchModeIsCoexist', () => {
|
|
725
|
-
it('default switchModeIsCoexist = false', () => {
|
|
726
|
-
const result = planetApplicationLoader['switchModeIsCoexist'](undefined);
|
|
727
|
-
expect(result).toEqual(false);
|
|
728
|
-
});
|
|
729
|
-
|
|
730
|
-
it('default switchModeIsCoexist = true', () => {
|
|
731
|
-
const result = planetApplicationLoader['switchModeIsCoexist']({
|
|
732
|
-
name: 'app100',
|
|
733
|
-
switchMode: SwitchModes.coexist,
|
|
734
|
-
routerPathPrefix: '',
|
|
735
|
-
hostParent: ''
|
|
736
|
-
});
|
|
737
|
-
expect(result).toEqual(true);
|
|
738
|
-
});
|
|
739
|
-
|
|
740
|
-
it('default switchModeIsCoexist = true', () => {
|
|
741
|
-
planetApplicationLoader.setOptions({
|
|
742
|
-
switchMode: SwitchModes.coexist
|
|
743
|
-
});
|
|
744
|
-
const result = planetApplicationLoader['switchModeIsCoexist'](undefined);
|
|
745
|
-
expect(result).toEqual(true);
|
|
746
|
-
});
|
|
747
|
-
});
|
|
748
|
-
|
|
749
|
-
describe('preload', () => {
|
|
750
|
-
it(`should auto preload load app2 when after loaded app1`, fakeAsync(() => {
|
|
751
|
-
const newApp2 = {
|
|
752
|
-
...app2,
|
|
753
|
-
preload: true
|
|
754
|
-
};
|
|
755
|
-
|
|
756
|
-
planetApplicationService.unregister(app2.name);
|
|
757
|
-
planetApplicationService.register(newApp2);
|
|
758
|
-
|
|
759
|
-
const loadApp1Assets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
760
|
-
const loadApp2Assets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
761
|
-
|
|
762
|
-
const app1RefFaker = PlanetApplicationRefFaker.create(app1.name);
|
|
763
|
-
const app2RefFaker = PlanetApplicationRefFaker.create(newApp2.name);
|
|
764
|
-
|
|
765
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
766
|
-
assetsLoaderSpy.and.returnValues(loadApp1Assets$, loadApp2Assets$);
|
|
767
|
-
|
|
768
|
-
const appStatusChangeFaker = AppStatusChangeFaker.create(planetApplicationLoader);
|
|
769
|
-
|
|
770
|
-
expect(appStatusChangeFaker.spy).not.toHaveBeenCalled();
|
|
771
|
-
planetApplicationLoader.reroute({ url: '/app1' });
|
|
772
|
-
|
|
773
|
-
// Start load app1 assets
|
|
774
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(1);
|
|
775
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({
|
|
776
|
-
app: app1,
|
|
777
|
-
status: ApplicationStatus.assetsLoading
|
|
778
|
-
});
|
|
779
|
-
|
|
780
|
-
loadApp1Assets$.next();
|
|
781
|
-
loadApp1Assets$.complete();
|
|
782
|
-
|
|
783
|
-
// App1 assets loaded
|
|
784
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(2);
|
|
785
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({
|
|
786
|
-
app: app1,
|
|
787
|
-
status: ApplicationStatus.assetsLoaded
|
|
788
|
-
});
|
|
789
|
-
|
|
790
|
-
// bootstrap app1 in setTimeout
|
|
791
|
-
flush();
|
|
792
|
-
|
|
793
|
-
// Start bootstrap app1
|
|
794
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(3);
|
|
795
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({
|
|
796
|
-
app: app1,
|
|
797
|
-
status: ApplicationStatus.bootstrapping
|
|
798
|
-
});
|
|
799
|
-
expect(planetApplicationLoader.loadingDone).toBe(false);
|
|
800
|
-
|
|
801
|
-
// App1 Ref Faker spy bootstrap
|
|
802
|
-
app1RefFaker.bootstrap();
|
|
803
|
-
|
|
804
|
-
// App1 bootstrapped
|
|
805
|
-
expect(planetApplicationLoader.loadingDone).toBe(true);
|
|
806
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(5);
|
|
807
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({
|
|
808
|
-
app: app1,
|
|
809
|
-
status: ApplicationStatus.bootstrapped
|
|
810
|
-
});
|
|
811
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({ app: app1, status: ApplicationStatus.active });
|
|
812
|
-
|
|
813
|
-
app2RefFaker.haveNotBeenBootstrap();
|
|
814
|
-
|
|
815
|
-
// Preload app2 in setTimeout
|
|
816
|
-
tick();
|
|
817
|
-
|
|
818
|
-
// 已经开始加载 App2 静态资源
|
|
819
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(6);
|
|
820
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({
|
|
821
|
-
app: newApp2,
|
|
822
|
-
status: ApplicationStatus.assetsLoading
|
|
823
|
-
});
|
|
824
|
-
|
|
825
|
-
// App2 静态资源加载完毕
|
|
826
|
-
loadApp2Assets$.next();
|
|
827
|
-
loadApp2Assets$.complete();
|
|
828
|
-
|
|
829
|
-
// App2 's assets loaded and bootstrapped
|
|
830
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(8);
|
|
831
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({
|
|
832
|
-
app: newApp2,
|
|
833
|
-
status: ApplicationStatus.assetsLoaded
|
|
834
|
-
});
|
|
835
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({
|
|
836
|
-
app: newApp2,
|
|
837
|
-
status: ApplicationStatus.bootstrapping
|
|
838
|
-
});
|
|
839
|
-
|
|
840
|
-
// App2 bootstrapped
|
|
841
|
-
app2RefFaker.bootstrap();
|
|
842
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(9);
|
|
843
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({
|
|
844
|
-
app: newApp2,
|
|
845
|
-
status: ApplicationStatus.bootstrapped
|
|
846
|
-
});
|
|
847
|
-
tick();
|
|
848
|
-
}));
|
|
849
|
-
|
|
850
|
-
it(`should active app1 success when app1 is bootstrapping by preload`, fakeAsync(() => {
|
|
851
|
-
const newApp1 = {
|
|
852
|
-
...app1,
|
|
853
|
-
preload: true
|
|
854
|
-
};
|
|
855
|
-
|
|
856
|
-
planetApplicationService.unregister(app1.name);
|
|
857
|
-
planetApplicationService.register(newApp1);
|
|
858
|
-
|
|
859
|
-
const loadApp1Assets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
860
|
-
const loadApp2Assets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
861
|
-
|
|
862
|
-
const app1RefFaker = PlanetApplicationRefFaker.create(app1.name);
|
|
863
|
-
|
|
864
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
865
|
-
assetsLoaderSpy.and.returnValues(loadApp1Assets$, loadApp2Assets$);
|
|
866
|
-
|
|
867
|
-
const appStatusChangeFaker = AppStatusChangeFaker.create(planetApplicationLoader);
|
|
868
|
-
|
|
869
|
-
expect(appStatusChangeFaker.spy).not.toHaveBeenCalled();
|
|
870
|
-
planetApplicationLoader.reroute({ url: '/dashboard' });
|
|
871
|
-
|
|
872
|
-
flush();
|
|
873
|
-
loadApp1Assets$.next();
|
|
874
|
-
loadApp1Assets$.complete();
|
|
875
|
-
|
|
876
|
-
planetApplicationLoader.reroute({ url: '/app1' });
|
|
877
|
-
|
|
878
|
-
flush();
|
|
879
|
-
|
|
880
|
-
// 测试在 app1 被预加载处于 bootstrapping 状态,然后路由跳转加载 app1 订阅 bootstrapped 事件后激活应用
|
|
881
|
-
app1RefFaker.bootstrap();
|
|
882
|
-
|
|
883
|
-
appStatusChangeFaker.expectAppStatus('app1', ApplicationStatus.active);
|
|
884
|
-
}));
|
|
885
|
-
|
|
886
|
-
it(`should active app1 success when app1 is bootstrapping by preload and bootstrapped in setTimeout`, fakeAsync(() => {
|
|
887
|
-
const newApp1 = {
|
|
888
|
-
...app1,
|
|
889
|
-
preload: true
|
|
890
|
-
};
|
|
891
|
-
|
|
892
|
-
planetApplicationService.unregister(app1.name);
|
|
893
|
-
planetApplicationService.register(newApp1);
|
|
894
|
-
|
|
895
|
-
const loadApp1Assets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
896
|
-
const loadApp2Assets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
897
|
-
|
|
898
|
-
const app1RefFaker = PlanetApplicationRefFaker.create(app1.name);
|
|
899
|
-
|
|
900
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
901
|
-
assetsLoaderSpy.and.returnValues(loadApp1Assets$, loadApp2Assets$);
|
|
902
|
-
|
|
903
|
-
const appStatusChangeFaker = AppStatusChangeFaker.create(planetApplicationLoader);
|
|
904
|
-
|
|
905
|
-
expect(appStatusChangeFaker.spy).not.toHaveBeenCalled();
|
|
906
|
-
planetApplicationLoader.reroute({ url: '/dashboard' });
|
|
907
|
-
|
|
908
|
-
flush();
|
|
909
|
-
loadApp1Assets$.next();
|
|
910
|
-
loadApp1Assets$.complete();
|
|
911
|
-
|
|
912
|
-
planetApplicationLoader.reroute({ url: '/app1' });
|
|
913
|
-
// It must be bootstrap first and then flush (setTimeout)
|
|
914
|
-
// Because app1 may be bootstrapping before setTimeout
|
|
915
|
-
// But app1 is bootstrapped after setTimeout, expect to load success in this case
|
|
916
|
-
// 先启用,后 flush,测试在 flush 之前应用是 bootstrapping 状态,但是 flush 之后是 bootstrapped 状态的场景
|
|
917
|
-
app1RefFaker.bootstrap();
|
|
918
|
-
|
|
919
|
-
// start forkJoin(apps$) in setTimeout
|
|
920
|
-
flush();
|
|
921
|
-
|
|
922
|
-
appStatusChangeFaker.expectAppStatus('app1', ApplicationStatus.active);
|
|
923
|
-
}));
|
|
924
|
-
|
|
925
|
-
it('should preload app when status is in assetsLoading, assetsLoaded or bootstrapping', fakeAsync(() => {
|
|
926
|
-
[ApplicationStatus.assetsLoading, ApplicationStatus.assetsLoaded, ApplicationStatus.bootstrapping].forEach(
|
|
927
|
-
status => {
|
|
928
|
-
const preloadAppSpy = jasmine.createSpy('preload app spy');
|
|
929
|
-
planetApplicationLoader['setAppStatus'](app1, status);
|
|
930
|
-
const appRefFaker = PlanetApplicationRefFaker.create(app1.name);
|
|
931
|
-
|
|
932
|
-
planetApplicationLoader.preload(app1).subscribe(data => {
|
|
933
|
-
// expect(NgZone.isInAngularZone()).toEqual(true);
|
|
934
|
-
preloadAppSpy(data);
|
|
935
|
-
});
|
|
936
|
-
|
|
937
|
-
expect(preloadAppSpy).not.toHaveBeenCalled();
|
|
938
|
-
planetApplicationLoader['setAppStatus'](app1, ApplicationStatus.bootstrapped);
|
|
939
|
-
expect(preloadAppSpy).toHaveBeenCalled();
|
|
940
|
-
expect(preloadAppSpy).toHaveBeenCalledWith(appRefFaker.planetAppRef);
|
|
941
|
-
expect(NgZone.isInAngularZone()).toEqual(false);
|
|
942
|
-
}
|
|
943
|
-
);
|
|
944
|
-
}));
|
|
945
|
-
|
|
946
|
-
it('should preload app when status is empty or error', fakeAsync(() => {
|
|
947
|
-
const status = sample([ApplicationStatus.loadError, undefined]);
|
|
948
|
-
const loadAppAssets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
949
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
950
|
-
assetsLoaderSpy.and.returnValues(loadAppAssets$);
|
|
951
|
-
|
|
952
|
-
const appRefFaker = PlanetApplicationRefFaker.create(app1.name);
|
|
953
|
-
|
|
954
|
-
const preloadAppSpy = jasmine.createSpy('preload app spy');
|
|
955
|
-
planetApplicationLoader['setAppStatus'](app1, status);
|
|
956
|
-
planetApplicationLoader.preload(app1, true).subscribe(data => {
|
|
957
|
-
// expect(NgZone.isInAngularZone()).toEqual(true);
|
|
958
|
-
preloadAppSpy(data);
|
|
959
|
-
});
|
|
960
|
-
|
|
961
|
-
expect(preloadAppSpy).not.toHaveBeenCalled();
|
|
962
|
-
|
|
963
|
-
loadAppAssets$.next();
|
|
964
|
-
loadAppAssets$.complete();
|
|
965
|
-
|
|
966
|
-
ngZone.run(() => {
|
|
967
|
-
appRefFaker.bootstrap();
|
|
968
|
-
});
|
|
969
|
-
|
|
970
|
-
expect(preloadAppSpy).toHaveBeenCalled();
|
|
971
|
-
expect(preloadAppSpy).toHaveBeenCalledWith(appRefFaker.planetAppRef);
|
|
972
|
-
expect(NgZone.isInAngularZone()).toEqual(false);
|
|
973
|
-
}));
|
|
974
|
-
|
|
975
|
-
it(`should throw error when preload load app2 error`, fakeAsync(() => {
|
|
976
|
-
const newApp2 = {
|
|
977
|
-
...app2,
|
|
978
|
-
preload: true
|
|
979
|
-
};
|
|
980
|
-
|
|
981
|
-
planetApplicationService.unregister(app2.name);
|
|
982
|
-
planetApplicationService.register(newApp2);
|
|
983
|
-
|
|
984
|
-
const loadApp1Assets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
985
|
-
const loadApp2Assets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
986
|
-
|
|
987
|
-
const errorHandlerSpy = jasmine.createSpy(`error handler spy`);
|
|
988
|
-
planetApplicationLoader.setOptions({
|
|
989
|
-
errorHandler: errorHandlerSpy
|
|
990
|
-
});
|
|
991
|
-
|
|
992
|
-
const app1RefFaker = PlanetApplicationRefFaker.create(app1.name);
|
|
993
|
-
const app2RefFaker = PlanetApplicationRefFaker.create(newApp2.name);
|
|
994
|
-
|
|
995
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
996
|
-
assetsLoaderSpy.and.returnValues(loadApp1Assets$, loadApp2Assets$);
|
|
997
|
-
|
|
998
|
-
const appStatusChangeSpy = jasmine.createSpy('app status change spy');
|
|
999
|
-
planetApplicationLoader.appStatusChange.subscribe(appStatusChangeSpy);
|
|
1000
|
-
|
|
1001
|
-
expect(appStatusChangeSpy).not.toHaveBeenCalled();
|
|
1002
|
-
planetApplicationLoader.reroute({ url: '/app1' });
|
|
1003
|
-
expect(appStatusChangeSpy).toHaveBeenCalledTimes(1);
|
|
1004
|
-
expect(appStatusChangeSpy).toHaveBeenCalledWith({ app: app1, status: ApplicationStatus.assetsLoading });
|
|
1005
|
-
|
|
1006
|
-
loadApp1Assets$.next();
|
|
1007
|
-
loadApp1Assets$.complete();
|
|
1008
|
-
|
|
1009
|
-
expect(appStatusChangeSpy).toHaveBeenCalledTimes(2);
|
|
1010
|
-
expect(appStatusChangeSpy).toHaveBeenCalledWith({ app: app1, status: ApplicationStatus.assetsLoaded });
|
|
1011
|
-
|
|
1012
|
-
app1RefFaker.haveNotBeenBootstrap();
|
|
1013
|
-
flush();
|
|
1014
|
-
expect(appStatusChangeSpy).toHaveBeenCalledTimes(3);
|
|
1015
|
-
expect(appStatusChangeSpy).toHaveBeenCalledWith({ app: app1, status: ApplicationStatus.bootstrapping });
|
|
1016
|
-
app1RefFaker.bootstrap();
|
|
1017
|
-
app1RefFaker.haveBeenBootstrap();
|
|
1018
|
-
expect(appStatusChangeSpy).toHaveBeenCalledTimes(5);
|
|
1019
|
-
expect(appStatusChangeSpy).toHaveBeenCalledWith({ app: app1, status: ApplicationStatus.bootstrapped });
|
|
1020
|
-
expect(appStatusChangeSpy).toHaveBeenCalledWith({ app: app1, status: ApplicationStatus.active });
|
|
1021
|
-
|
|
1022
|
-
flush();
|
|
1023
|
-
loadApp2Assets$.error(new Error(`load newApp2 assets error`));
|
|
1024
|
-
loadApp2Assets$.complete();
|
|
1025
|
-
expect(errorHandlerSpy).toHaveBeenCalled();
|
|
1026
|
-
expect(errorHandlerSpy).toHaveBeenCalledWith(new Error(`load newApp2 assets error`));
|
|
1027
|
-
}));
|
|
1028
|
-
|
|
1029
|
-
it(`should bootstrap app1 when app1 app2 preload is 'true' and app2 asset load fail`, fakeAsync(() => {
|
|
1030
|
-
const newApp1 = {
|
|
1031
|
-
...app1,
|
|
1032
|
-
preload: true
|
|
1033
|
-
};
|
|
1034
|
-
const newApp2 = {
|
|
1035
|
-
...app2,
|
|
1036
|
-
preload: true
|
|
1037
|
-
};
|
|
1038
|
-
planetApplicationService.unregister(app1.name);
|
|
1039
|
-
planetApplicationService.unregister(app2.name);
|
|
1040
|
-
planetApplicationService.register(newApp1);
|
|
1041
|
-
planetApplicationService.register(newApp2);
|
|
1042
|
-
|
|
1043
|
-
const loadApp1Assets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
1044
|
-
const loadApp2Assets$ = new Subject<[AssetsLoadResult[], AssetsLoadResult[]]>();
|
|
1045
|
-
const app1RefFaker = PlanetApplicationRefFaker.create(newApp1.name);
|
|
1046
|
-
const app2RefFaker = PlanetApplicationRefFaker.create(newApp2.name);
|
|
1047
|
-
|
|
1048
|
-
planetApplicationLoader.reroute({ url: '/' });
|
|
1049
|
-
const assetsLoaderSpy = spyOn(assetsLoader, 'loadAppAssets');
|
|
1050
|
-
assetsLoaderSpy.and.returnValues(loadApp1Assets$, loadApp2Assets$);
|
|
1051
|
-
const appStatusChangeFaker = AppStatusChangeFaker.create(planetApplicationLoader);
|
|
1052
|
-
|
|
1053
|
-
// Preload app1 and app2
|
|
1054
|
-
tick();
|
|
1055
|
-
|
|
1056
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledTimes(2);
|
|
1057
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({
|
|
1058
|
-
app: newApp1,
|
|
1059
|
-
status: ApplicationStatus.assetsLoading
|
|
1060
|
-
});
|
|
1061
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({
|
|
1062
|
-
app: newApp2,
|
|
1063
|
-
status: ApplicationStatus.assetsLoading
|
|
1064
|
-
});
|
|
1065
|
-
|
|
1066
|
-
// load app1 asset
|
|
1067
|
-
loadApp1Assets$.next();
|
|
1068
|
-
loadApp1Assets$.complete();
|
|
1069
|
-
|
|
1070
|
-
// load app2 asset and fake load fail
|
|
1071
|
-
loadApp2Assets$.error(new Error(`load newApp2 assets error`));
|
|
1072
|
-
loadApp2Assets$.complete();
|
|
1073
|
-
|
|
1074
|
-
// app1 's assets loaded
|
|
1075
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({
|
|
1076
|
-
app: newApp1,
|
|
1077
|
-
status: ApplicationStatus.assetsLoaded
|
|
1078
|
-
});
|
|
1079
|
-
// app2 's assets load error
|
|
1080
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({
|
|
1081
|
-
app: newApp2,
|
|
1082
|
-
status: ApplicationStatus.loadError
|
|
1083
|
-
});
|
|
1084
|
-
|
|
1085
|
-
// app2 bootstrap error
|
|
1086
|
-
app2RefFaker.bootstrap();
|
|
1087
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({
|
|
1088
|
-
app: newApp2,
|
|
1089
|
-
status: ApplicationStatus.loadError
|
|
1090
|
-
});
|
|
1091
|
-
|
|
1092
|
-
// app1 bootstrapped
|
|
1093
|
-
app1RefFaker.bootstrap();
|
|
1094
|
-
expect(appStatusChangeFaker.spy).toHaveBeenCalledWith({
|
|
1095
|
-
app: newApp1,
|
|
1096
|
-
status: ApplicationStatus.bootstrapped
|
|
1097
|
-
});
|
|
1098
|
-
|
|
1099
|
-
tick();
|
|
1100
|
-
}));
|
|
1101
|
-
});
|
|
1102
|
-
});
|