diff --git a/packages/angular-cli/plugins/karma.js b/packages/angular-cli/plugins/karma.js index 1448b2bb4408..a1ebc214c1dc 100644 --- a/packages/angular-cli/plugins/karma.js +++ b/packages/angular-cli/plugins/karma.js @@ -9,6 +9,7 @@ const init = (config) => { } const angularCliConfig = require(path.join(config.basePath, config.angularCli.config)); const appConfig = angularCliConfig.apps[0]; + const appRoot = path.join(config.basePath, appConfig.root); const environment = config.angularCli.environment || 'dev'; const testConfig = { codeCoverage: config.angularCli.codeCoverage || false, @@ -43,6 +44,25 @@ const init = (config) => { .filter((file) => config.preprocessors[file].indexOf('angular-cli') !== -1) .map((file) => config.preprocessors[file]) .map((arr) => arr.splice(arr.indexOf('angular-cli'), 1, 'webpack', 'sourcemap')); + + // Add global scripts + if (appConfig.scripts || appConfig.scripts.length > 0) { + const globalScriptPatterns = appConfig.scripts + .map(script => typeof script === 'string' ? { input: script } : script) + // Neither renamed nor lazy scripts are currently supported + .filter(script => !(script.output || script.lazy)) + .map(script => ({ + pattern: path.resolve(appRoot, script.input), + included: true, + served: true, + watched: true + })); + + // Unshift elements onto the beginning of the files array. + // It's important to not replace the array, because + // karma already has a reference to the existing array. + Array.prototype.unshift.apply(config.files, globalScriptPatterns); + } } init.$inject = ['config']; diff --git a/tests/e2e/tests/test/test.ts b/tests/e2e/tests/test/test.ts index c64a17088ada..e8b938f76646 100644 --- a/tests/e2e/tests/test/test.ts +++ b/tests/e2e/tests/test/test.ts @@ -1,8 +1,71 @@ -import {ng} from '../../utils/process'; +import { writeMultipleFiles } from '../../utils/fs'; +import { ng } from '../../utils/process'; +import { updateJsonFile } from '../../utils/project'; +import { expectToFail } from '../../utils/utils'; +import { stripIndent } from 'common-tags'; - -export default function() { +export default function () { // make sure both --watch=false and --single-run work return ng('test', '--single-run') - .then(() => ng('test', '--watch=false')); + .then(() => ng('test', '--watch=false')) + // prepare global scripts test files + .then(() => writeMultipleFiles({ + 'src/string-script.js': `stringScriptGlobal = 'string-scripts.js';`, + 'src/input-script.js': `inputScriptGlobal = 'input-scripts.js';`, + 'src/typings.d.ts': stripIndent` + declare var stringScriptGlobal: any; + declare var inputScriptGlobal: any; + `, + 'src/app/app.component.ts': stripIndent` + import { Component } from '@angular/core'; + + @Component({ selector: 'app-root', template: '' }) + export class AppComponent { + stringScriptGlobalProp = stringScriptGlobal; + inputScriptGlobalProp = inputScriptGlobal; + } + `, + 'src/app/app.component.spec.ts': stripIndent` + import { TestBed, async } from '@angular/core/testing'; + import { AppComponent } from './app.component'; + + describe('AppComponent', () => { + beforeEach(() => { + TestBed.configureTestingModule({ declarations: [ AppComponent ] }); + TestBed.compileComponents(); + }); + + it('should have access to string-script.js', async(() => { + let app = TestBed.createComponent(AppComponent).debugElement.componentInstance; + expect(app.stringScriptGlobalProp).toEqual('string-scripts.js'); + })); + + it('should have access to input-script.js', async(() => { + let app = TestBed.createComponent(AppComponent).debugElement.componentInstance; + expect(app.inputScriptGlobalProp).toEqual('input-scripts.js'); + })); + }); + + describe('Spec', () => { + it('should have access to string-script.js', async(() => { + expect(stringScriptGlobal).toBe('string-scripts.js'); + })); + + it('should have access to input-script.js', async(() => { + expect(inputScriptGlobal).toBe('input-scripts.js'); + })); + }); + ` + })) + // should fail because the global scripts were not added to scripts array + .then(() => expectToFail(() => ng('test', '--single-run'))) + .then(() => updateJsonFile('angular-cli.json', configJson => { + const app = configJson['apps'][0]; + app['scripts'] = [ + 'string-script.js', + { input: 'input-script.js' } + ]; + })) + // should pass now + .then(() => ng('test', '--single-run')); }