| 
									
										
										
										
											2016-10-19 21:41:04 +01:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright Google Inc. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-24 22:48:03 +00:00
										 |  |  | import {InjectionToken, Injector, NgModule, destroyPlatform} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2016-10-19 21:41:04 +01:00
										 |  |  | import {async} from '@angular/core/testing'; | 
					
						
							|  |  |  | import {BrowserModule} from '@angular/platform-browser'; | 
					
						
							|  |  |  | import {platformBrowserDynamic} from '@angular/platform-browser-dynamic'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-22 09:42:52 +00:00
										 |  |  | import * as angular from '../../../src/common/src/angular1'; | 
					
						
							|  |  |  | import {$INJECTOR, INJECTOR_KEY} from '../../../src/common/src/constants'; | 
					
						
							|  |  |  | import {html, withEachNg1Version} from '../../../src/common/test/helpers/common_test_helpers'; | 
					
						
							|  |  |  | import {UpgradeModule, downgradeInjectable, getAngularJSGlobal, setAngularJSGlobal} from '../../index'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import {bootstrap} from './static_test_helpers'; | 
					
						
							| 
									
										
										
										
											2016-10-19 21:41:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-15 19:21:18 +02:00
										 |  |  | withEachNg1Version(() => { | 
					
						
							| 
									
										
										
										
											2016-10-19 21:41:04 +01:00
										 |  |  |   describe('injection', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     beforeEach(() => destroyPlatform()); | 
					
						
							|  |  |  |     afterEach(() => destroyPlatform()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should downgrade ng2 service to ng1', async(() => { | 
					
						
							|  |  |  |          // Tokens used in ng2 to identify services
 | 
					
						
							| 
									
										
										
										
											2017-01-03 16:54:46 -08:00
										 |  |  |          const Ng2Service = new InjectionToken('ng2-service'); | 
					
						
							| 
									
										
										
										
											2016-10-19 21:41:04 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |          // Sample ng1 NgModule for tests
 | 
					
						
							|  |  |  |          @NgModule({ | 
					
						
							|  |  |  |            imports: [BrowserModule, UpgradeModule], | 
					
						
							|  |  |  |            providers: [ | 
					
						
							|  |  |  |              {provide: Ng2Service, useValue: 'ng2 service value'}, | 
					
						
							|  |  |  |            ] | 
					
						
							|  |  |  |          }) | 
					
						
							|  |  |  |          class Ng2Module { | 
					
						
							|  |  |  |            ngDoBootstrap() {} | 
					
						
							|  |  |  |          } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          // create the ng1 module that will import an ng2 service
 | 
					
						
							| 
									
										
										
										
											2019-04-23 18:00:04 +03:00
										 |  |  |          const ng1Module = angular.module_('ng1Module', []) | 
					
						
							|  |  |  |                                .factory('ng2Service', downgradeInjectable(Ng2Service)); | 
					
						
							| 
									
										
										
										
											2016-10-19 21:41:04 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |          bootstrap(platformBrowserDynamic(), Ng2Module, html('<div>'), ng1Module) | 
					
						
							|  |  |  |              .then((upgrade) => { | 
					
						
							|  |  |  |                const ng1Injector = upgrade.$injector; | 
					
						
							|  |  |  |                expect(ng1Injector.get('ng2Service')).toBe('ng2 service value'); | 
					
						
							|  |  |  |              }); | 
					
						
							|  |  |  |        })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should upgrade ng1 service to ng2', async(() => { | 
					
						
							|  |  |  |          // Tokens used in ng2 to identify services
 | 
					
						
							| 
									
										
										
										
											2017-01-03 16:54:46 -08:00
										 |  |  |          const Ng1Service = new InjectionToken('ng1-service'); | 
					
						
							| 
									
										
										
										
											2016-10-19 21:41:04 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |          // Sample ng1 NgModule for tests
 | 
					
						
							|  |  |  |          @NgModule({ | 
					
						
							|  |  |  |            imports: [BrowserModule, UpgradeModule], | 
					
						
							|  |  |  |            providers: [ | 
					
						
							| 
									
										
										
										
											2017-01-26 22:30:42 -08:00
										 |  |  |              // the following line is the "upgrade" of an AngularJS service
 | 
					
						
							| 
									
										
										
										
											2016-10-19 21:41:04 +01:00
										 |  |  |              { | 
					
						
							|  |  |  |                provide: Ng1Service, | 
					
						
							|  |  |  |                useFactory: (i: angular.IInjectorService) => i.get('ng1Service'), | 
					
						
							|  |  |  |                deps: ['$injector'] | 
					
						
							|  |  |  |              } | 
					
						
							|  |  |  |            ] | 
					
						
							|  |  |  |          }) | 
					
						
							|  |  |  |          class Ng2Module { | 
					
						
							|  |  |  |            ngDoBootstrap() {} | 
					
						
							|  |  |  |          } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          // create the ng1 module that will import an ng2 service
 | 
					
						
							| 
									
										
										
										
											2019-04-23 18:00:04 +03:00
										 |  |  |          const ng1Module = | 
					
						
							|  |  |  |              angular.module_('ng1Module', []).value('ng1Service', 'ng1 service value'); | 
					
						
							| 
									
										
										
										
											2016-10-19 21:41:04 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |          bootstrap(platformBrowserDynamic(), Ng2Module, html('<div>'), ng1Module) | 
					
						
							|  |  |  |              .then((upgrade) => { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |                const ng2Injector = upgrade.injector; | 
					
						
							| 
									
										
										
										
											2016-10-19 21:41:04 +01:00
										 |  |  |                expect(ng2Injector.get(Ng1Service)).toBe('ng1 service value'); | 
					
						
							|  |  |  |              }); | 
					
						
							|  |  |  |        })); | 
					
						
							| 
									
										
										
										
											2017-01-24 22:48:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should initialize the upgraded injector before application run blocks are executed', | 
					
						
							|  |  |  |        async(() => { | 
					
						
							|  |  |  |          let runBlockTriggered = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-23 18:00:04 +03:00
										 |  |  |          const ng1Module = angular.module_('ng1Module', []).run([ | 
					
						
							| 
									
										
										
										
											2017-01-24 22:48:03 +00:00
										 |  |  |            INJECTOR_KEY, | 
					
						
							|  |  |  |            function(injector: Injector) { | 
					
						
							|  |  |  |              runBlockTriggered = true; | 
					
						
							|  |  |  |              expect(injector.get($INJECTOR)).toBeDefined(); | 
					
						
							|  |  |  |            } | 
					
						
							|  |  |  |          ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          @NgModule({imports: [BrowserModule, UpgradeModule]}) | 
					
						
							|  |  |  |          class Ng2Module { | 
					
						
							|  |  |  |            ngDoBootstrap() {} | 
					
						
							|  |  |  |          } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          bootstrap(platformBrowserDynamic(), Ng2Module, html('<div>'), ng1Module).then(() => { | 
					
						
							|  |  |  |            expect(runBlockTriggered).toBeTruthy(); | 
					
						
							|  |  |  |          }); | 
					
						
							|  |  |  |        })); | 
					
						
							| 
									
										
										
										
											2017-04-14 11:25:56 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should allow resetting angular at runtime', async(() => { | 
					
						
							| 
									
										
										
										
											2018-02-15 19:21:18 +02:00
										 |  |  |          let wrappedBootstrapCalled = false; | 
					
						
							| 
									
										
										
										
											2017-04-14 11:25:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-09 13:55:38 -04:00
										 |  |  |          const n: any = getAngularJSGlobal(); | 
					
						
							| 
									
										
										
										
											2017-04-14 11:25:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-09 13:55:38 -04:00
										 |  |  |          setAngularJSGlobal({ | 
					
						
							| 
									
										
										
										
											2017-04-14 11:25:56 -07:00
										 |  |  |            bootstrap: (...args: any[]) => { | 
					
						
							| 
									
										
										
										
											2018-02-15 19:21:18 +02:00
										 |  |  |              wrappedBootstrapCalled = true; | 
					
						
							| 
									
										
										
										
											2017-04-14 11:25:56 -07:00
										 |  |  |              n.bootstrap(...args); | 
					
						
							|  |  |  |            }, | 
					
						
							|  |  |  |            module: n.module, | 
					
						
							|  |  |  |            element: n.element, | 
					
						
							|  |  |  |            version: n.version, | 
					
						
							|  |  |  |            resumeBootstrap: n.resumeBootstrap, | 
					
						
							|  |  |  |            getTestability: n.getTestability | 
					
						
							|  |  |  |          }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          @NgModule({imports: [BrowserModule, UpgradeModule]}) | 
					
						
							|  |  |  |          class Ng2Module { | 
					
						
							|  |  |  |            ngDoBootstrap() {} | 
					
						
							|  |  |  |          } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-23 18:00:04 +03:00
										 |  |  |          const ng1Module = angular.module_('ng1Module', []); | 
					
						
							| 
									
										
										
										
											2017-04-14 11:25:56 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |          bootstrap(platformBrowserDynamic(), Ng2Module, html('<div>'), ng1Module) | 
					
						
							| 
									
										
										
										
											2018-02-15 19:21:18 +02:00
										 |  |  |              .then(upgrade => expect(wrappedBootstrapCalled).toBe(true)) | 
					
						
							|  |  |  |              .then(() => setAngularJSGlobal(n));  // Reset the AngularJS global.
 | 
					
						
							| 
									
										
										
										
											2017-04-14 11:25:56 -07:00
										 |  |  |        })); | 
					
						
							| 
									
										
										
										
											2016-10-19 21:41:04 +01:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2018-02-15 19:21:18 +02:00
										 |  |  | }); |