From 9efed8252249065b7903731d3a2b578df89d2ce0 Mon Sep 17 00:00:00 2001
From: Johann-S <johann.servoire@gmail.com>
Date: Thu, 13 Sep 2018 09:42:15 +0200
Subject: [PATCH] refactor karma config in one file

---
 js/tests/karma-browserstack.conf.js |  51 --------
 js/tests/karma-bundle.conf.js       |  53 --------
 js/tests/karma.conf.js              | 193 ++++++++++++++++++----------
 package.json                        |   6 +-
 4 files changed, 131 insertions(+), 172 deletions(-)
 delete mode 100644 js/tests/karma-browserstack.conf.js
 delete mode 100644 js/tests/karma-bundle.conf.js

diff --git a/js/tests/karma-browserstack.conf.js b/js/tests/karma-browserstack.conf.js
deleted file mode 100644
index d1c11301be..0000000000
--- a/js/tests/karma-browserstack.conf.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/* eslint-env node */
-/* eslint no-process-env: 0 */
-const ip = require('ip')
-const {
-  browsers,
-  browsersKeys
-} = require('./browsers')
-
-module.exports = (config) => {
-  config.set({
-    hostname: ip.address(),
-    browserStack: {
-      username: process.env.BROWSER_STACK_USERNAME,
-      accessKey: process.env.BROWSER_STACK_ACCESS_KEY,
-      build: `bootstrap-${new Date().toISOString()}`,
-      project: 'Bootstrap',
-      retryLimit: 2
-    },
-    basePath: '../..',
-    frameworks: ['qunit', 'sinon'],
-    plugins: [
-      'karma-qunit',
-      'karma-sinon',
-      'karma-browserstack-launcher'
-    ],
-    // list of files / patterns to load in the browser
-    files: [
-      'site/docs/4.1/assets/js/vendor/jquery-slim.min.js',
-      'site/docs/4.1/assets/js/vendor/popper.min.js',
-      'js/dist/util.js',
-      'js/dist/tooltip.js',
-      'js/dist/!(util|index|tooltip).js', // include all of our js/dist files except util.js, index.js and tooltip.js
-      'js/tests/unit/*.js'
-    ],
-    customLaunchers: browsers,
-    browsers: browsersKeys,
-    reporters: ['dots', 'BrowserStack'],
-    port: 9876,
-    colors: true,
-    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
-    logLevel: config.LOG_ERROR || config.LOG_WARN,
-    autoWatch: false,
-    singleRun: true,
-    concurrency: Infinity,
-    client: {
-      qunit: {
-        showUI: true
-      }
-    }
-  })
-}
diff --git a/js/tests/karma-bundle.conf.js b/js/tests/karma-bundle.conf.js
deleted file mode 100644
index 50c500faad..0000000000
--- a/js/tests/karma-bundle.conf.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/* eslint-env node */
-/* eslint no-process-env: 0 */
-
-module.exports = (config) => {
-  const jqueryFile = process.env.USE_OLD_JQUERY ? 'https://code.jquery.com/jquery-1.9.1.min.js' : 'site/docs/4.1/assets/js/vendor/jquery-slim.min.js'
-
-  config.set({
-    basePath: '../..',
-    frameworks: ['qunit', 'sinon', 'detectBrowsers'],
-    plugins: [
-      'karma-chrome-launcher',
-      'karma-firefox-launcher',
-      'karma-qunit',
-      'karma-sinon',
-      'karma-detect-browsers'
-    ],
-    // list of files / patterns to load in the browser
-    files: [
-      jqueryFile,
-      'site/docs/4.1/assets/js/vendor/popper.min.js',
-      'dist/js/bootstrap.js',
-      'js/tests/unit/*.js'
-    ],
-    reporters: ['dots'],
-    port: 9876,
-    colors: true,
-    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
-    logLevel: config.LOG_ERROR || config.LOG_WARN,
-    autoWatch: false,
-    customLaunchers: {
-      FirefoxHeadless: {
-        base: 'Firefox',
-        flags: ['-headless']
-      }
-    },
-    singleRun: true,
-    concurrency: Infinity,
-    detectBrowsers: {
-      usePhantomJS: false,
-      postDetection(availableBrowser) {
-        if (typeof process.env.TRAVIS_JOB_ID !== 'undefined' || availableBrowser.includes('Chrome')) {
-          return ['ChromeHeadless']
-        }
-
-        if (availableBrowser.includes('Firefox')) {
-          return ['FirefoxHeadless']
-        }
-
-        throw new Error('Please install Firefox or Chrome')
-      }
-    }
-  })
-}
diff --git a/js/tests/karma.conf.js b/js/tests/karma.conf.js
index 397f8b8e37..e32c2e2fd0 100644
--- a/js/tests/karma.conf.js
+++ b/js/tests/karma.conf.js
@@ -1,76 +1,139 @@
 /* eslint-env node */
 /* eslint no-process-env: 0 */
+const ip = require('ip')
+const {
+  browsers,
+  browsersKeys
+} = require('./browsers')
 const path = require('path')
 const jsCoveragePath = path.resolve(__dirname, '../coverage')
 
-module.exports = (config) => {
-  const jqueryFile = process.env.USE_OLD_JQUERY ? 'https://code.jquery.com/jquery-1.9.1.min.js' : 'site/docs/4.1/assets/js/vendor/jquery-slim.min.js'
+const jqueryFile = process.env.USE_OLD_JQUERY ? 'https://code.jquery.com/jquery-1.9.1.min.js' : 'site/docs/4.1/assets/js/vendor/jquery-slim.min.js'
+const bundle = process.env.BUNDLE === 'true'
+const browserStack = process.env.BROWSER === 'true'
 
-  config.set({
-    basePath: '../..',
-    frameworks: ['qunit', 'sinon', 'detectBrowsers'],
-    plugins: [
-      'karma-chrome-launcher',
-      'karma-firefox-launcher',
-      'karma-qunit',
-      'karma-sinon',
-      'karma-detect-browsers',
-      'karma-coverage-istanbul-reporter'
-    ],
-    // list of files / patterns to load in the browser
-    files: [
-      jqueryFile,
-      'site/docs/4.1/assets/js/vendor/popper.min.js',
-      'js/coverage/dist/util.js',
-      'js/coverage/dist/tooltip.js',
-      'js/coverage/dist/!(util|index|tooltip).js', // include all of our js/dist files except util.js, index.js and tooltip.js
-      'js/tests/unit/*.js'
-    ],
-    reporters: ['dots', 'coverage-istanbul'],
-    port: 9876,
-    colors: true,
-    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
-    logLevel: config.LOG_ERROR || config.LOG_WARN,
-    autoWatch: false,
-    customLaunchers: {
-      FirefoxHeadless: {
-        base: 'Firefox',
-        flags: ['-headless']
-      }
-    },
-    singleRun: true,
-    concurrency: Infinity,
-    detectBrowsers: {
-      usePhantomJS: false,
-      postDetection(availableBrowser) {
-        if (typeof process.env.TRAVIS_JOB_ID !== 'undefined' || availableBrowser.includes('Chrome')) {
-          return ['ChromeHeadless']
-        }
+const frameworks = [
+  'qunit',
+  'sinon'
+]
 
-        if (availableBrowser.includes('Firefox')) {
-          return ['FirefoxHeadless']
-        }
+const plugins = [
+  'karma-qunit',
+  'karma-sinon'
+]
 
-        throw new Error('Please install Firefox or Chrome')
-      }
-    },
-    coverageIstanbulReporter: {
-      dir: jsCoveragePath,
-      reports: ['lcov', 'text-summary'],
-      thresholds: {
-        emitWarning: false,
-        global: {
-          statements: 90,
-          branches: 84,
-          functions: 87,
-          lines: 90
-        }
-      }
-    },
-    client: {
-      qunit: {
-        showUI: true
+const reporters = ['dots']
+
+const detectBrowsers = {
+  usePhantomJS: false,
+  postDetection(availableBrowser) {
+    if (typeof process.env.TRAVIS_JOB_ID !== 'undefined' || availableBrowser.includes('Chrome')) {
+      return ['ChromeHeadless']
+    }
+
+    if (availableBrowser.includes('Firefox')) {
+      return ['FirefoxHeadless']
+    }
+
+    throw new Error('Please install Firefox or Chrome')
+  }
+}
+
+const customLaunchers = {
+  FirefoxHeadless: {
+    base: 'Firefox',
+    flags: ['-headless']
+  }
+}
+
+let files = ['site/docs/4.1/assets/js/vendor/popper.min.js']
+const conf = {
+  basePath: '../..',
+  port: 9876,
+  colors: true,
+  autoWatch: false,
+  singleRun: true,
+  concurrency: Infinity,
+  client: {
+    qunit: {
+      showUI: true
+    }
+  }
+}
+
+if (bundle) {
+  frameworks.push('detectBrowsers')
+  plugins.push(
+    'karma-chrome-launcher',
+    'karma-firefox-launcher',
+    'karma-detect-browsers'
+  )
+  conf.customLaunchers = customLaunchers
+  conf.detectBrowsers = detectBrowsers
+  files = files.concat([
+    jqueryFile,
+    'dist/js/bootstrap.js'
+  ])
+} else if (browserStack) {
+  conf.hostname = ip.address()
+  conf.browserStack = {
+    username: process.env.BROWSER_STACK_USERNAME,
+    accessKey: process.env.BROWSER_STACK_ACCESS_KEY,
+    build: `bootstrap-${new Date().toISOString()}`,
+    project: 'Bootstrap',
+    retryLimit: 2
+  }
+  plugins.push('karma-browserstack-launcher')
+  conf.customLaunchers = browsers
+  conf.browsers = browsersKeys
+  reporters.push('BrowserStack')
+  files = files.concat([
+    'site/docs/4.1/assets/js/vendor/jquery-slim.min.js',
+    'js/dist/util.js',
+    'js/dist/tooltip.js',
+    'js/dist/!(util|index|tooltip).js' // include all of our js/dist files except util.js, index.js and tooltip.js
+  ])
+} else {
+  frameworks.push('detectBrowsers')
+  plugins.push(
+    'karma-chrome-launcher',
+    'karma-firefox-launcher',
+    'karma-detect-browsers',
+    'karma-coverage-istanbul-reporter'
+  )
+  files = files.concat([
+    jqueryFile,
+    'js/coverage/dist/util.js',
+    'js/coverage/dist/tooltip.js',
+    'js/coverage/dist/!(util|index|tooltip).js' // include all of our js/dist files except util.js, index.js and tooltip.js
+  ])
+  reporters.push('coverage-istanbul')
+  conf.customLaunchers = customLaunchers
+  conf.detectBrowsers = detectBrowsers
+  conf.coverageIstanbulReporter = {
+    dir: jsCoveragePath,
+    reports: ['lcov', 'text-summary'],
+    thresholds: {
+      emitWarning: false,
+      global: {
+        statements: 90,
+        branches: 84,
+        functions: 87,
+        lines: 90
       }
     }
-  })
+  }
+}
+
+files.push('js/tests/unit/*.js')
+
+conf.frameworks = frameworks
+conf.plugins = plugins
+conf.reporters = reporters
+conf.files = files
+
+module.exports = (karmaConfig) => {
+  // possible values: karmaConfig.LOG_DISABLE || karmaConfig.LOG_ERROR || karmaConfig.LOG_WARN || karmaConfig.LOG_INFO || karmaConfig.LOG_DEBUG
+  conf.logLevel = karmaConfig.LOG_ERROR || karmaConfig.LOG_WARN
+  karmaConfig.set(conf)
 }
diff --git a/package.json b/package.json
index b3423dd5b8..c429646e7c 100644
--- a/package.json
+++ b/package.json
@@ -53,9 +53,9 @@
     "js-test": "npm-run-all js-test-karma*",
     "js-test-karma": "karma start js/tests/karma.conf.js",
     "js-test-karma-old": "cross-env USE_OLD_JQUERY=true npm run js-test-karma",
-    "js-test-karma-bundle": "cross-env karma start js/tests/karma-bundle.conf.js",
-    "js-test-karma-bundle-old": "cross-env USE_OLD_JQUERY=true npm run js-test-karma-bundle",
-    "js-test-cloud": "karma start js/tests/karma-browserstack.conf.js",
+    "js-test-karma-bundle": "cross-env BUNDLE=true npm run js-test-karma",
+    "js-test-karma-bundle-old": "cross-env BUNDLE=true USE_OLD_JQUERY=true npm run js-test-karma",
+    "js-test-cloud": "cross-env BROWSER=true npm run js-test-karma",
     "coveralls": "shx cat js/coverage/lcov.info | coveralls",
     "docs": "npm-run-all --parallel css-docs js-docs --sequential docs-compile docs-lint",
     "docs-compile": "bundle exec jekyll build",
-- 
GitLab