const webpackConfig = require('./webpack.config.test')

module.exports = function (config) {
  config.set({
    customLaunchers: {
      ChromeCustom: {
        base: 'ChromeHeadless',
        // We must disable the Chrome sandbox when running Chrome inside Docker
        // (Chrome's sandbox needs more permissions than Docker allows by
        // default)
        flags: ['--no-sandbox']
      }
    },
    browsers: ['ChromeCustom'],
    files: [
      // Import all tests (see comment in the file for why this is necessary)
      'test/karma/import_tests.js'
    ],
    middleware: ['fake-img'],
    preprocessors: {
      // Run files through webpack
      'test/karma/import_tests.js': ['webpack']
    },
    frameworks: ['mocha', 'chai-sinon'],
    // Configure webpack in the tests
    webpack: webpackConfig,
    // Configure the webpack dev server used to serve test files
    webpackMiddleware: {
      // Disable file-watching -- it is of no use in CI, we use single runs.
      // https://webpack.js.org/configuration/watch/
      watch: false,
      // ^ does not work when placed in webpack.config.test.
      // webpack-dev-middleware overrides it :/
      // v seems to be supported, according to
      // https://www.npmjs.com/package/webpack-dev-middleware#watchoptions
      watchOptions: {
        ignored: [/node_modules/, /frontend/, /test/]
      },

      // Disable noisy CLI output
      stats: 'errors-only'
    },
    plugins: [
      require('karma-chrome-launcher'),
      require('karma-mocha'),
      require('karma-chai-sinon'),
      require('karma-webpack'),
      require('karma-mocha-reporter'),
      { 'middleware:fake-img': ['factory', fakeImgMiddlewareFactory] }
    ],
    reporters: ['mocha']
  })
}

/**
 * Handle fake images
 */
function fakeImgMiddlewareFactory() {
  return function (req, res, next) {
    if (req.originalUrl.startsWith('/fake/')) {
      return res.end('fake img response')
    }
    next()
  }
}
