// This is a common configuration for running karma
// tests in your modules, including custom elements.
// To use this, just create a karma.conf.js file in your
// application directory and populate it with:
//
//     module.exports = require('../common/karma.common.js')(__dirname);
//
// Add all the testing packages found in common/packages.json via yarn:
//
//     $ yarn add chai karma karma-chai karma-chrome-launcher \
//       karma-firefox-launcher karma-mocha karma-sinon karma-webpack mocha sinon
//
// Then add this to your Makefile:
//
//     test: build
//         # Run the generated tests just once under Xvfb.
//         xvfb-run --auto-servernum --server-args "-screen 0 1280x1024x24" npx karma start --single-run
//
// You can always run:
//
//     $ npx karma start
//
// if you need to debug tests using your desktop browser.
const path = require('path');

module.exports = function(dirname) {
  return function(config) {

    let webpackConfig = require(path.resolve(dirname, 'webpack.config.js'));
    // Webpack 3+ configs can be either objects or functions that produce the
    // config object. Karma currently doesn't handle the latter, so do it
    // ourselves here.
    if (typeof webpackConfig === 'function') {
      webpackConfig = webpackConfig({}, {mode: 'development'});
    }
    webpackConfig.entry = null;
    webpackConfig.mode = 'development';

    // Work-around for karma-webpack issues:
    // https://github.com/webpack-contrib/karma-webpack/issues/322#issuecomment-417862717
    webpackConfig.output= {
      filename: '[name]',
    };

    config.set({

      // base path, that will be used to resolve files and exclude
      basePath: '',


      // frameworks to use
      frameworks: ['mocha', 'chai', 'sinon'],

      plugins: [
        'karma-chrome-launcher',
        'karma-firefox-launcher',
        'karma-webpack',
        'karma-sinon',
        'karma-mocha',
        'karma-chai',
      ],

      // list of files / patterns to load in the browser
      files: [
        'node_modules/@webcomponents/custom-elements/custom-elements.min.js',
        'modules/*_test.js',
        'modules/**/*_test.js',
      ],

      preprocessors: {
        // add webpack as preprocessor
        'modules/*_test.js': [ 'webpack' ],
        'modules/**/*_test.js': [ 'webpack' ],
      },

      // list of files to exclude
      exclude: [
      ],


      // test results reporter to use
      // possible values: 'dots', 'progress', 'junit', 'growl', 'coverage'
      reporters: ['dots'],


      // Get the port from KARMA_PORT if it is set.
      port: parseInt(process.env.KARMA_PORT || "9876"),


      // enable / disable colors in the output (reporters and logs)
      colors: false,


      // level of logging
      // possible values: config.LOG_DISABLE || config.LOG_ERROR ||
      // config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
      logLevel: config.LOG_INFO,


      // enable / disable watching file and executing tests whenever any file changes
      autoWatch: true,


      // Start these browsers.
      browsers: ['Chrome'],


      // If browser does not capture in given timeout [ms], kill it
      captureTimeout: 60000,


      // Continuous Integration mode
      // if true, it capture browsers, run tests and exit
      //
      // This can be over-ridden by command-line flag when running Karma. I.e.:
      //
      //    ./node_modules/karma/bin/karma --no-single-run start
      //
      singleRun: true,

      webpack: webpackConfig,
    });
  }
};
