karma.conf.js 3.9 KB
Newer Older
B
bryk 已提交
1
// Copyright 2015 Google Inc. All Rights Reserved.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4 5 6
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
B
bryk 已提交
7
//     http://www.apache.org/licenses/LICENSE-2.0
8 9
//
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/**
 * @fileoverview Configuration file for Karma test runner.
 *
 * Specification of Karma config file can be found at:
 * http://karma-runner.github.io/latest/config/configuration-file.html
 */
import path from 'path';
import wiredep from 'wiredep';

import conf from './conf';

/**
 * Returns an array of files required by Karma to run the tests.
 *
 * @return {!Array<string>}
 */
function getFileList() {
  // All app dependencies are required for tests. Include them.
  let wiredepOptions = {
    dependencies: true,
35
    devDependencies: true,
36 37
  };

38 39 40 41 42
  return wiredep(wiredepOptions).js.concat([
    path.join(conf.paths.frontendTest, '**/*.js'),
    path.join(conf.paths.frontendSrc, '**/*.js'),
    path.join(conf.paths.frontendSrc, '**/*.html'),
  ]);
43 44 45 46 47 48 49
}

/**
 * Exported default function which sets Karma configuration. Required by the framework.
 *
 * @param {!Object} config
 */
50
module.exports = function(config) {
51 52 53 54 55 56 57 58 59 60 61
  let configuration = {
    basePath: conf.paths.base,

    files: getFileList(),

    logLevel: 'WARN',

    frameworks: ['jasmine', 'browserify'],

    browsers: ['Chrome'],

B
bryk 已提交
62 63
    browserNoActivityTimeout: 60 * 1000,  // 60 seconds.

64 65 66 67 68 69 70 71 72
    customLaunchers: {
      // Custom launcher for Travis CI. It is required because Travis environment cannot use
      // sandbox.
      chromeTravis: {
        base: 'Chrome',
        flags: ['--no-sandbox'],
      },
    },

S
Sebastian Florek 已提交
73 74 75
    reporters: ['progress', 'coverage'],

    coverageReporter: {
B
bryk 已提交
76
      dir: conf.paths.coverage,
S
Sebastian Florek 已提交
77 78 79 80 81
      reporters: [
        {type: 'html', subdir: 'html'},
        {type: 'lcovonly', subdir: 'lcov'},
      ],
    },
82

83
    preprocessors: {},  // This field is filled with values later.
84 85 86 87

    plugins: [
      'karma-chrome-launcher',
      'karma-jasmine',
S
Sebastian Florek 已提交
88
      'karma-coverage',
89 90
      'karma-ng-html2js-preprocessor',
      'karma-sourcemap-loader',
91
      'karma-browserify',
92 93 94 95 96 97 98 99 100
    ],

    // karma-browserify plugin config.
    browserify: {
      // Add source maps to outpus bundles.
      debug: true,
      // Make 'import ...' statements relative to the following paths.
      paths: [conf.paths.frontendSrc, conf.paths.frontendTest],
      transform: [
S
Sebastian Florek 已提交
101 102 103
        // Browserify transform for the istanbul code coverage tool. Isparta istrumenter for ES6
        // code coverage. TODO(floreks): try to make import work instead of require
        ['browserify-istanbul', {'instrumenter': require('isparta')}],
104
        // Transform ES6 code into ES5 so that browsers can digest it.
B
bryk 已提交
105
        ['babelify'],
106
      ],
107 108 109 110
    },

    // karma-ng-html2js-preprocessor plugin config.
    ngHtml2JsPreprocessor: {
111
      stripPrefix: `${conf.paths.frontendSrc}/`,
112 113
      moduleName: conf.frontend.moduleName,
    },
114 115
  };

116 117 118 119 120
  // Use custom browser configuration when running on Travis CI.
  if (process.env.TRAVIS) {
    configuration.browsers = ['chromeTravis'];
  }

121 122 123 124 125 126 127 128
  // Convert all JS code written ES6 with modules to ES5 bundles that browsers can digest.
  configuration.preprocessors[path.join(conf.paths.frontendTest, '**/*.js')] = ['browserify'];
  configuration.preprocessors[path.join(conf.paths.frontendSrc, '**/*.js')] = ['browserify'];

  // Convert HTML templates into JS files that serve code through $templateCache.
  configuration.preprocessors[path.join(conf.paths.frontendSrc, '**/*.html')] = ['ng-html2js'];

  config.set(configuration);
129
};