169 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			169 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @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
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {HostTree} from '@angular-devkit/schematics';
							 | 
						||
| 
								 | 
							
								import {SchematicTestRunner, UnitTestTree} from '@angular-devkit/schematics/testing';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {localizePolyfill} from './index';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								describe('ng-add schematic', () => {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const countInstances = (str: string, substr: string) => str.split(substr).length - 1;
							 | 
						||
| 
								 | 
							
								  const defaultOptions = {name: 'demo'};
							 | 
						||
| 
								 | 
							
								  let host: UnitTestTree;
							 | 
						||
| 
								 | 
							
								  let schematicRunner: SchematicTestRunner;
							 | 
						||
| 
								 | 
							
								  // The real polyfills file is bigger than this, but for the test it shouldn't matter.
							 | 
						||
| 
								 | 
							
								  const polyfillsContent =
							 | 
						||
| 
								 | 
							
								      `/***************************************************************************************************
							 | 
						||
| 
								 | 
							
								 * Zone JS is required by default for Angular itself.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								import 'zone.js/dist/zone';`;
							 | 
						||
| 
								 | 
							
								  const mainServerContent = `import { enableProdMode } from '@angular/core';
							 | 
						||
| 
								 | 
							
								import { environment } from './environments/environment';
							 | 
						||
| 
								 | 
							
								if (environment.production) {
							 | 
						||
| 
								 | 
							
								  enableProdMode();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								export { AppServerModule } from './app/app.server.module';
							 | 
						||
| 
								 | 
							
								export { renderModule, renderModuleFactory } from '@angular/platform-server';`;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  beforeEach(() => {
							 | 
						||
| 
								 | 
							
								    host = new UnitTestTree(new HostTree());
							 | 
						||
| 
								 | 
							
								    host.create('src/polyfills.ts', polyfillsContent);
							 | 
						||
| 
								 | 
							
								    host.create('src/another-polyfills.ts', polyfillsContent);
							 | 
						||
| 
								 | 
							
								    host.create('src/unrelated-polyfills.ts', polyfillsContent);
							 | 
						||
| 
								 | 
							
								    host.create('src/another-unrelated-polyfills.ts', polyfillsContent);
							 | 
						||
| 
								 | 
							
								    host.create('src/main.server.ts', mainServerContent);
							 | 
						||
| 
								 | 
							
								    host.create('src/another-main.server.ts', mainServerContent);
							 | 
						||
| 
								 | 
							
								    host.create('src/unrelated-main.server.ts', mainServerContent);
							 | 
						||
| 
								 | 
							
								    host.create('src/another-unrelated-main.server.ts', mainServerContent);
							 | 
						||
| 
								 | 
							
								    host.create('angular.json', JSON.stringify({
							 | 
						||
| 
								 | 
							
								      projects: {
							 | 
						||
| 
								 | 
							
								        'demo': {
							 | 
						||
| 
								 | 
							
								          architect: {
							 | 
						||
| 
								 | 
							
								            build: {
							 | 
						||
| 
								 | 
							
								              builder: '@angular-devkit/build-angular:browser',
							 | 
						||
| 
								 | 
							
								              options: {
							 | 
						||
| 
								 | 
							
								                polyfills: 'src/polyfills.ts',
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								              configurations: {
							 | 
						||
| 
								 | 
							
								                production: {
							 | 
						||
| 
								 | 
							
								                  polyfills: 'src/another-polyfills.ts',
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            'another-build': {
							 | 
						||
| 
								 | 
							
								              builder: '@angular-devkit/build-angular:browser',
							 | 
						||
| 
								 | 
							
								              options: {
							 | 
						||
| 
								 | 
							
								                polyfills: 'src/polyfills.ts',
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								              configurations: {
							 | 
						||
| 
								 | 
							
								                production: {
							 | 
						||
| 
								 | 
							
								                  polyfills: 'src/another-polyfills.ts',
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            server: {
							 | 
						||
| 
								 | 
							
								              builder: '@angular-devkit/build-angular:server',
							 | 
						||
| 
								 | 
							
								              options: {
							 | 
						||
| 
								 | 
							
								                main: 'src/main.server.ts',
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								              configurations: {
							 | 
						||
| 
								 | 
							
								                production: {
							 | 
						||
| 
								 | 
							
								                  main: 'src/another-main.server.ts',
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            'another-server': {
							 | 
						||
| 
								 | 
							
								              builder: '@angular-devkit/build-angular:server',
							 | 
						||
| 
								 | 
							
								              options: {
							 | 
						||
| 
								 | 
							
								                main: 'src/main.server.ts',
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								              configurations: {
							 | 
						||
| 
								 | 
							
								                production: {
							 | 
						||
| 
								 | 
							
								                  main: 'src/another-main.server.ts',
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            'not-browser-or-server': {
							 | 
						||
| 
								 | 
							
								              builder: '@angular-devkit/build-angular:something-else',
							 | 
						||
| 
								 | 
							
								              options: {
							 | 
						||
| 
								 | 
							
								                polyfills: 'src/unrelated-polyfills.ts',
							 | 
						||
| 
								 | 
							
								                main: 'src/unrelated-main.server.ts',
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								              configurations: {
							 | 
						||
| 
								 | 
							
								                production: {
							 | 
						||
| 
								 | 
							
								                  polyfills: 'src/other-unrelated-polyfills.ts',
							 | 
						||
| 
								 | 
							
								                  main: 'src/another-unrelated-main.server.ts',
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								          },
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      defaultProject: 'demo',
							 | 
						||
| 
								 | 
							
								    }));
							 | 
						||
| 
								 | 
							
								    schematicRunner =
							 | 
						||
| 
								 | 
							
								        new SchematicTestRunner('@angular/localize', require.resolve('../collection.json'));
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should add localize polyfill to polyfill files', async() => {
							 | 
						||
| 
								 | 
							
								    host = await schematicRunner.runSchematicAsync('ng-add', defaultOptions, host).toPromise();
							 | 
						||
| 
								 | 
							
								    expect(host.readContent('/src/polyfills.ts')).toContain(localizePolyfill);
							 | 
						||
| 
								 | 
							
								    expect(host.readContent('/src/another-polyfills.ts')).toContain(localizePolyfill);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should add localize polyfill to server main files', async() => {
							 | 
						||
| 
								 | 
							
								    host = await schematicRunner.runSchematicAsync('ng-add', defaultOptions, host).toPromise();
							 | 
						||
| 
								 | 
							
								    expect(host.readContent('/src/main.server.ts')).toContain(localizePolyfill);
							 | 
						||
| 
								 | 
							
								    expect(host.readContent('/src/another-main.server.ts')).toContain(localizePolyfill);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should add localize polyfill at the start of file', async() => {
							 | 
						||
| 
								 | 
							
								    host = await schematicRunner.runSchematicAsync('ng-add', defaultOptions, host).toPromise();
							 | 
						||
| 
								 | 
							
								    const content = host.readContent('/src/polyfills.ts');
							 | 
						||
| 
								 | 
							
								    expect(content.indexOf(localizePolyfill)).toBeLessThan(content.indexOf(polyfillsContent));
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should not add localize polyfill to files referenced in other targets files', async() => {
							 | 
						||
| 
								 | 
							
								    host = await schematicRunner.runSchematicAsync('ng-add', defaultOptions, host).toPromise();
							 | 
						||
| 
								 | 
							
								    expect(host.readContent('/src/unrelated-polyfills.ts')).not.toContain(localizePolyfill);
							 | 
						||
| 
								 | 
							
								    expect(host.readContent('/src/another-unrelated-polyfills.ts')).not.toContain(localizePolyfill);
							 | 
						||
| 
								 | 
							
								    expect(host.readContent('/src/unrelated-main.server.ts')).not.toContain(localizePolyfill);
							 | 
						||
| 
								 | 
							
								    expect(host.readContent('/src/another-unrelated-main.server.ts'))
							 | 
						||
| 
								 | 
							
								        .not.toContain(localizePolyfill);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should only add localize polyfill once if multiple builds reference it', async() => {
							 | 
						||
| 
								 | 
							
								    host = await schematicRunner.runSchematicAsync('ng-add', defaultOptions, host).toPromise();
							 | 
						||
| 
								 | 
							
								    const content = host.readContent('/src/polyfills.ts');
							 | 
						||
| 
								 | 
							
								    expect(countInstances(content, localizePolyfill)).toBe(1);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should not add localize polyfill if it\'s already there', async() => {
							 | 
						||
| 
								 | 
							
								    const polyfillVariation = localizePolyfill.replace(/'/g, '"');
							 | 
						||
| 
								 | 
							
								    host.overwrite('/src/polyfills.ts', `${localizePolyfill}\n${polyfillsContent}`);
							 | 
						||
| 
								 | 
							
								    host.overwrite('/src/another-polyfills.ts', `${polyfillVariation}\n${polyfillsContent}`);
							 | 
						||
| 
								 | 
							
								    host = await schematicRunner.runSchematicAsync('ng-add', defaultOptions, host).toPromise();
							 | 
						||
| 
								 | 
							
								    expect(countInstances(host.readContent('/src/polyfills.ts'), localizePolyfill)).toBe(1);
							 | 
						||
| 
								 | 
							
								    expect(countInstances(host.readContent('/src/another-polyfills.ts'), localizePolyfill)).toBe(0);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should not break when there are no polyfills', async() => {
							 | 
						||
| 
								 | 
							
								    host.overwrite('angular.json', JSON.stringify({
							 | 
						||
| 
								 | 
							
								      projects: {
							 | 
						||
| 
								 | 
							
								        'demo': {
							 | 
						||
| 
								 | 
							
								          architect: {},
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      defaultProject: 'demo',
							 | 
						||
| 
								 | 
							
								    }));
							 | 
						||
| 
								 | 
							
								    await schematicRunner.runSchematicAsync('ng-add', defaultOptions, host).toPromise();
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 |