@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.
Files changed (328) hide show
  1. package/application/planet-application-loader.d.ts +70 -0
  2. package/application/planet-application-loader.d.ts.map +1 -0
  3. package/application/planet-application-loader.ngfactory.d.ts.map +1 -0
  4. package/application/planet-application-ref.d.ts +36 -0
  5. package/application/planet-application-ref.d.ts.map +1 -0
  6. package/application/planet-application.service.d.ts +19 -0
  7. package/application/planet-application.service.d.ts.map +1 -0
  8. package/application/planet-application.service.ngfactory.d.ts.map +1 -0
  9. package/{packages/planet/src/application/portal-application.ts → application/portal-application.d.ts} +5 -18
  10. package/application/portal-application.d.ts.map +1 -0
  11. package/assets-loader.d.ts +33 -0
  12. package/assets-loader.d.ts.map +1 -0
  13. package/assets-loader.ngfactory.d.ts.map +1 -0
  14. package/bundles/worktile-planet.umd.js +2564 -0
  15. package/bundles/worktile-planet.umd.js.map +1 -0
  16. package/component/planet-component-loader.d.ts +28 -0
  17. package/component/planet-component-loader.d.ts.map +1 -0
  18. package/component/planet-component-loader.ngfactory.d.ts.map +1 -0
  19. package/component/planet-component-ref.d.ts +8 -0
  20. package/component/planet-component-ref.d.ts.map +1 -0
  21. package/{packages/planet/src/component/plant-component.config.ts → component/plant-component.config.d.ts} +4 -4
  22. package/component/plant-component.config.d.ts.map +1 -0
  23. package/debug.d.ts +22 -0
  24. package/debug.d.ts.map +1 -0
  25. package/empty/empty.component.d.ts +3 -0
  26. package/empty/empty.component.d.ts.map +1 -0
  27. package/empty/empty.component.ngfactory.d.ts.map +1 -0
  28. package/esm2015/application/planet-application-loader.js +457 -0
  29. package/esm2015/application/planet-application-ref.js +97 -0
  30. package/esm2015/application/planet-application.service.js +87 -0
  31. package/esm2015/application/portal-application.js +16 -0
  32. package/esm2015/assets-loader.js +217 -0
  33. package/esm2015/component/planet-component-loader.js +155 -0
  34. package/esm2015/component/planet-component-ref.js +3 -0
  35. package/esm2015/component/plant-component.config.js +7 -0
  36. package/esm2015/debug.js +33 -0
  37. package/esm2015/empty/empty.component.js +10 -0
  38. package/esm2015/global-event-dispatcher.js +71 -0
  39. package/esm2015/global-planet.js +54 -0
  40. package/esm2015/helpers.js +119 -0
  41. package/esm2015/module.js +27 -0
  42. package/esm2015/planet.class.js +9 -0
  43. package/esm2015/planet.js +91 -0
  44. package/esm2015/public-api.js +18 -0
  45. package/esm2015/sandbox/constants.js +7 -0
  46. package/esm2015/sandbox/exec.js +15 -0
  47. package/esm2015/sandbox/index.js +20 -0
  48. package/esm2015/sandbox/proxy/patches/document.js +12 -0
  49. package/esm2015/sandbox/proxy/patches/eventListener.js +41 -0
  50. package/esm2015/sandbox/proxy/patches/index.js +11 -0
  51. package/esm2015/sandbox/proxy/patches/storage.js +40 -0
  52. package/esm2015/sandbox/proxy/patches/timer.js +43 -0
  53. package/esm2015/sandbox/proxy/proxies/common.js +132 -0
  54. package/esm2015/sandbox/proxy/proxies/document.js +126 -0
  55. package/esm2015/sandbox/proxy/proxies/window.js +155 -0
  56. package/esm2015/sandbox/proxy/proxy-sandbox.js +49 -0
  57. package/esm2015/sandbox/proxy/types.js +2 -0
  58. package/esm2015/sandbox/sandbox.js +7 -0
  59. package/esm2015/sandbox/snapshot/snapshot-sandbox.js +12 -0
  60. package/esm2015/sandbox/types.js +2 -0
  61. package/esm2015/worktile-planet.js +6 -0
  62. package/fesm2015/worktile-planet.js +2048 -0
  63. package/fesm2015/worktile-planet.js.map +1 -0
  64. package/global-event-dispatcher.d.ts +20 -0
  65. package/global-event-dispatcher.d.ts.map +1 -0
  66. package/global-event-dispatcher.ngfactory.d.ts.map +1 -0
  67. package/global-planet.d.ts +23 -0
  68. package/global-planet.d.ts.map +1 -0
  69. package/helpers.d.ts +39 -0
  70. package/helpers.d.ts.map +1 -0
  71. package/module.d.ts +6 -0
  72. package/module.d.ts.map +1 -0
  73. package/module.ngfactory.d.ts.map +1 -0
  74. package/package.json +16 -121
  75. package/{packages/planet/src/planet.class.ts → planet.class.d.ts} +5 -26
  76. package/planet.class.d.ts.map +1 -0
  77. package/planet.d.ts +25 -0
  78. package/planet.d.ts.map +1 -0
  79. package/planet.ngfactory.d.ts.map +1 -0
  80. package/{packages/planet/src/public-api.ts → public-api.d.ts} +1 -4
  81. package/public-api.d.ts.map +1 -0
  82. package/sandbox/constants.d.ts +7 -0
  83. package/sandbox/constants.d.ts.map +1 -0
  84. package/sandbox/exec.d.ts +3 -0
  85. package/sandbox/exec.d.ts.map +1 -0
  86. package/sandbox/index.d.ts +7 -0
  87. package/sandbox/index.d.ts.map +1 -0
  88. package/sandbox/proxy/patches/document.d.ts +3 -0
  89. package/sandbox/proxy/patches/document.d.ts.map +1 -0
  90. package/sandbox/proxy/patches/eventListener.d.ts +3 -0
  91. package/sandbox/proxy/patches/eventListener.d.ts.map +1 -0
  92. package/sandbox/proxy/patches/index.d.ts +3 -0
  93. package/sandbox/proxy/patches/index.d.ts.map +1 -0
  94. package/sandbox/proxy/patches/storage.d.ts +15 -0
  95. package/sandbox/proxy/patches/storage.d.ts.map +1 -0
  96. package/sandbox/proxy/patches/timer.d.ts +3 -0
  97. package/sandbox/proxy/patches/timer.d.ts.map +1 -0
  98. package/sandbox/proxy/proxies/common.d.ts +13 -0
  99. package/sandbox/proxy/proxies/common.d.ts.map +1 -0
  100. package/sandbox/proxy/proxies/document.d.ts +14 -0
  101. package/sandbox/proxy/proxies/document.d.ts.map +1 -0
  102. package/sandbox/proxy/proxies/window.d.ts +13 -0
  103. package/sandbox/proxy/proxies/window.d.ts.map +1 -0
  104. package/sandbox/proxy/proxy-sandbox.d.ts +16 -0
  105. package/sandbox/proxy/proxy-sandbox.d.ts.map +1 -0
  106. package/{packages/planet/src/sandbox/proxy/types.ts → sandbox/proxy/types.d.ts} +2 -8
  107. package/sandbox/proxy/types.d.ts.map +1 -0
  108. package/sandbox/sandbox.d.ts +12 -0
  109. package/sandbox/sandbox.d.ts.map +1 -0
  110. package/sandbox/snapshot/snapshot-sandbox.d.ts +9 -0
  111. package/sandbox/snapshot/snapshot-sandbox.d.ts.map +1 -0
  112. package/sandbox/types.d.ts +2 -0
  113. package/sandbox/types.d.ts.map +1 -0
  114. package/worktile-planet.d.ts +6 -0
  115. package/worktile-planet.d.ts.map +1 -0
  116. package/worktile-planet.metadata.json +1 -0
  117. package/.all-contributorsrc +0 -84
  118. package/.circleci/config.yml +0 -17
  119. package/.coveralls.yml +0 -1
  120. package/.docgeni/public/assets/favicon.ico +0 -0
  121. package/.docgeni/public/index.html +0 -13
  122. package/.docgenirc.js +0 -35
  123. package/.dockerignore +0 -1
  124. package/.editorconfig +0 -22
  125. package/.github/FUNDING.yml +0 -12
  126. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
  127. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  128. package/.prettierignore +0 -7
  129. package/.prettierrc +0 -28
  130. package/.travis.yml +0 -26
  131. package/.wpmrc.js +0 -11
  132. package/CHANGELOG.md +0 -391
  133. package/CODE_OF_CONDUCT.md +0 -76
  134. package/Dockerfile +0 -11
  135. package/LICENSE +0 -21
  136. package/README.md +0 -348
  137. package/README.zh-CN.md +0 -307
  138. package/SECURITY.md +0 -21
  139. package/angular.json +0 -373
  140. package/commitlint.config.js +0 -6
  141. package/docs/api/defineApplication.md +0 -46
  142. package/docs/api/globalEventDispatcher.md +0 -51
  143. package/docs/api/index.md +0 -5
  144. package/docs/api/planet.md +0 -117
  145. package/docs/guides/getting-started.md +0 -174
  146. package/docs/guides/index.md +0 -5
  147. package/docs/guides/intro.md +0 -216
  148. package/examples/app1/browserslist +0 -11
  149. package/examples/app1/extra-webpack.config.js +0 -33
  150. package/examples/app1/karma.conf.js +0 -31
  151. package/examples/app1/postcss.config.js +0 -1
  152. package/examples/app1/src/app/app.module.ts +0 -44
  153. package/examples/app1/src/app/app.routing.ts +0 -49
  154. package/examples/app1/src/app/counter.service.ts +0 -16
  155. package/examples/app1/src/app/dashboard/dashboard.component.html +0 -51
  156. package/examples/app1/src/app/dashboard/dashboard.component.ts +0 -70
  157. package/examples/app1/src/app/detail/detail.component.html +0 -8
  158. package/examples/app1/src/app/detail/detail.component.ts +0 -18
  159. package/examples/app1/src/app/overlay.ts +0 -26
  160. package/examples/app1/src/app/projects/dialog/projects-dialog.component.html +0 -10
  161. package/examples/app1/src/app/projects/dialog/projects-dialog.component.ts +0 -41
  162. package/examples/app1/src/app/projects/projects.component.ts +0 -33
  163. package/examples/app1/src/app/root/root.component.css +0 -3
  164. package/examples/app1/src/app/root/root.component.html +0 -16
  165. package/examples/app1/src/app/root/root.component.ts +0 -35
  166. package/examples/app1/src/app/services/initialized-data.resolver.ts +0 -15
  167. package/examples/app1/src/app/shared.module.ts +0 -57
  168. package/examples/app1/src/app/user/detail/user-detail.component.html +0 -5
  169. package/examples/app1/src/app/user/detail/user-detail.component.ts +0 -20
  170. package/examples/app1/src/app/user/user-list.component.html +0 -7
  171. package/examples/app1/src/app/user/user-list.component.ts +0 -20
  172. package/examples/app1/src/app/user/user.module.ts +0 -31
  173. package/examples/app1/src/assets/.gitkeep +0 -0
  174. package/examples/app1/src/assets/github.png +0 -0
  175. package/examples/app1/src/assets/main.css +0 -3
  176. package/examples/app1/src/environments/environment.prod.ts +0 -3
  177. package/examples/app1/src/environments/environment.ts +0 -16
  178. package/examples/app1/src/favicon.ico +0 -0
  179. package/examples/app1/src/index.html +0 -14
  180. package/examples/app1/src/main.ts +0 -35
  181. package/examples/app1/src/polyfills.ts +0 -84
  182. package/examples/app1/src/styles.scss +0 -35
  183. package/examples/app1/src/test.ts +0 -14
  184. package/examples/app1/temp.js +0 -221
  185. package/examples/app1/tsconfig.app.json +0 -10
  186. package/examples/app1/tsconfig.spec.json +0 -18
  187. package/examples/app1/tslint.json +0 -17
  188. package/examples/app1/webpack.config.js +0 -127
  189. package/examples/app2/browserslist +0 -11
  190. package/examples/app2/extra-webpack.config.js +0 -32
  191. package/examples/app2/karma.conf.js +0 -31
  192. package/examples/app2/src/app/app.module.ts +0 -90
  193. package/examples/app2/src/app/dashboard/dashboard.component.html +0 -21
  194. package/examples/app2/src/app/dashboard/dashboard.component.ts +0 -27
  195. package/examples/app2/src/app/overlay.ts +0 -26
  196. package/examples/app2/src/app/projects/detail/detail.component.html +0 -16
  197. package/examples/app2/src/app/projects/detail/detail.component.ts +0 -21
  198. package/examples/app2/src/app/projects/project-list.component.html +0 -29
  199. package/examples/app2/src/app/projects/project-list.component.ts +0 -58
  200. package/examples/app2/src/app/projects/project.resolver.ts +0 -15
  201. package/examples/app2/src/app/projects/projects.service.ts +0 -28
  202. package/examples/app2/src/app/projects/tasks/tasks.component.html +0 -10
  203. package/examples/app2/src/app/projects/tasks/tasks.component.ts +0 -16
  204. package/examples/app2/src/app/projects/view/view.component.html +0 -1
  205. package/examples/app2/src/app/projects/view/view.component.ts +0 -20
  206. package/examples/app2/src/app/root/root.component.html +0 -14
  207. package/examples/app2/src/app/root/root.component.scss +0 -12
  208. package/examples/app2/src/app/root/root.component.ts +0 -28
  209. package/examples/app2/src/app/shared.module.ts +0 -59
  210. package/examples/app2/src/assets/.gitkeep +0 -0
  211. package/examples/app2/src/environments/environment.prod.ts +0 -3
  212. package/examples/app2/src/environments/environment.ts +0 -16
  213. package/examples/app2/src/favicon.ico +0 -0
  214. package/examples/app2/src/index.html +0 -14
  215. package/examples/app2/src/main.ts +0 -36
  216. package/examples/app2/src/polyfills.ts +0 -84
  217. package/examples/app2/src/styles.scss +0 -28
  218. package/examples/app2/src/test.ts +0 -14
  219. package/examples/app2/tsconfig.app.json +0 -10
  220. package/examples/app2/tsconfig.spec.json +0 -18
  221. package/examples/app2/tslint.json +0 -7
  222. package/examples/app2/webpack.config.js +0 -92
  223. package/examples/common/app-root-context.ts +0 -10
  224. package/examples/common/cache.ts +0 -82
  225. package/examples/common/index.ts +0 -13
  226. package/examples/common/module.ts +0 -10
  227. package/examples/common/overlay-container.service.ts +0 -28
  228. package/examples/common/section-card/section-card.component.html +0 -5
  229. package/examples/common/section-card/section-card.component.scss +0 -15
  230. package/examples/common/section-card/section-card.component.ts +0 -11
  231. package/examples/common/utils.ts +0 -0
  232. package/examples/portal/src/app/a-detail/a-detail.component.html +0 -8
  233. package/examples/portal/src/app/a-detail/a-detail.component.ts +0 -18
  234. package/examples/portal/src/app/about/about.component.html +0 -27
  235. package/examples/portal/src/app/about/about.component.scss +0 -0
  236. package/examples/portal/src/app/about/about.component.spec.ts +0 -26
  237. package/examples/portal/src/app/about/about.component.ts +0 -26
  238. package/examples/portal/src/app/app-routing.module.ts +0 -57
  239. package/examples/portal/src/app/app.component.html +0 -73
  240. package/examples/portal/src/app/app.component.scss +0 -58
  241. package/examples/portal/src/app/app.component.spec.ts +0 -33
  242. package/examples/portal/src/app/app.component.ts +0 -111
  243. package/examples/portal/src/app/app.module.ts +0 -64
  244. package/examples/portal/src/app/custom-settings.service.ts +0 -44
  245. package/examples/portal/src/app/overlay.ts +0 -26
  246. package/examples/portal/src/app/settings/settings.component.html +0 -31
  247. package/examples/portal/src/app/settings/settings.component.scss +0 -3
  248. package/examples/portal/src/app/settings/settings.component.ts +0 -43
  249. package/examples/portal/src/assets/.gitkeep +0 -0
  250. package/examples/portal/src/assets/apps.json +0 -29
  251. package/examples/portal/src/assets/icons/sprite.defs.svg +0 -1
  252. package/examples/portal/src/assets/images/logo.svg +0 -16
  253. package/examples/portal/src/assets/ngx-planet-micro-front-end.gif +0 -0
  254. package/examples/portal/src/browserslist +0 -11
  255. package/examples/portal/src/environments/environment.prod.ts +0 -3
  256. package/examples/portal/src/environments/environment.ts +0 -16
  257. package/examples/portal/src/extra-webpack.config.js +0 -32
  258. package/examples/portal/src/favicon.ico +0 -0
  259. package/examples/portal/src/index.html +0 -14
  260. package/examples/portal/src/karma.conf.js +0 -31
  261. package/examples/portal/src/main.ts +0 -18
  262. package/examples/portal/src/polyfills.ts +0 -84
  263. package/examples/portal/src/reboot.scss +0 -14
  264. package/examples/portal/src/styles.scss +0 -14
  265. package/examples/portal/src/test.ts +0 -14
  266. package/examples/portal/src/tsconfig.app.json +0 -10
  267. package/examples/portal/src/tsconfig.spec.json +0 -9
  268. package/examples/portal/src/tslint.json +0 -7
  269. package/extra-webpack.config.js +0 -5
  270. package/nginx.conf +0 -17
  271. package/packages/planet/karma.conf.js +0 -37
  272. package/packages/planet/ng-package.json +0 -7
  273. package/packages/planet/package.json +0 -10
  274. package/packages/planet/src/application/planet-application-loader.spec.ts +0 -1102
  275. package/packages/planet/src/application/planet-application-loader.ts +0 -549
  276. package/packages/planet/src/application/planet-application-ref.spec.ts +0 -233
  277. package/packages/planet/src/application/planet-application-ref.ts +0 -131
  278. package/packages/planet/src/application/planet-application.service.spec.ts +0 -145
  279. package/packages/planet/src/application/planet-application.service.ts +0 -88
  280. package/packages/planet/src/application/portal-application.spec.ts +0 -53
  281. package/packages/planet/src/assets-loader.spec.ts +0 -689
  282. package/packages/planet/src/assets-loader.ts +0 -247
  283. package/packages/planet/src/component/planet-component-loader.spec.ts +0 -187
  284. package/packages/planet/src/component/planet-component-loader.ts +0 -173
  285. package/packages/planet/src/component/planet-component-ref.ts +0 -8
  286. package/packages/planet/src/debug.spec.ts +0 -58
  287. package/packages/planet/src/debug.ts +0 -66
  288. package/packages/planet/src/empty/empty.component.spec.ts +0 -34
  289. package/packages/planet/src/empty/empty.component.ts +0 -7
  290. package/packages/planet/src/global-event-dispatcher.spec.ts +0 -81
  291. package/packages/planet/src/global-event-dispatcher.ts +0 -82
  292. package/packages/planet/src/global-planet.spec.ts +0 -39
  293. package/packages/planet/src/global-planet.ts +0 -73
  294. package/packages/planet/src/helpers.spec.ts +0 -242
  295. package/packages/planet/src/helpers.ts +0 -125
  296. package/packages/planet/src/module.spec.ts +0 -79
  297. package/packages/planet/src/module.ts +0 -25
  298. package/packages/planet/src/planet.spec.ts +0 -226
  299. package/packages/planet/src/planet.ts +0 -113
  300. package/packages/planet/src/sandbox/constants.ts +0 -6
  301. package/packages/planet/src/sandbox/exec.ts +0 -22
  302. package/packages/planet/src/sandbox/index.ts +0 -24
  303. package/packages/planet/src/sandbox/proxy/patches/document.ts +0 -13
  304. package/packages/planet/src/sandbox/proxy/patches/eventListener.ts +0 -49
  305. package/packages/planet/src/sandbox/proxy/patches/index.ts +0 -13
  306. package/packages/planet/src/sandbox/proxy/patches/storage.ts +0 -53
  307. package/packages/planet/src/sandbox/proxy/patches/timer.ts +0 -50
  308. package/packages/planet/src/sandbox/proxy/proxies/common.ts +0 -137
  309. package/packages/planet/src/sandbox/proxy/proxies/document.ts +0 -140
  310. package/packages/planet/src/sandbox/proxy/proxies/window.ts +0 -176
  311. package/packages/planet/src/sandbox/proxy/proxy-sandbox.ts +0 -59
  312. package/packages/planet/src/sandbox/sandbox.ts +0 -20
  313. package/packages/planet/src/sandbox/snapshot/snapshot-sandbox.ts +0 -12
  314. package/packages/planet/src/sandbox/types.ts +0 -1
  315. package/packages/planet/src/test.ts +0 -16
  316. package/packages/planet/src/testing/app1.module.ts +0 -34
  317. package/packages/planet/src/testing/app2.module.ts +0 -24
  318. package/packages/planet/src/testing/applications.ts +0 -58
  319. package/packages/planet/src/testing/index.ts +0 -2
  320. package/packages/planet/src/testing/utils.ts +0 -31
  321. package/packages/planet/tsconfig.lib.json +0 -27
  322. package/packages/planet/tsconfig.lib.prod.json +0 -9
  323. package/packages/planet/tsconfig.spec.json +0 -17
  324. package/packages/planet/tslint.json +0 -7
  325. package/postcss.config.js +0 -3
  326. package/proxy.conf.js +0 -15
  327. package/tsconfig.json +0 -23
  328. 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
- });