summaryrefslogtreecommitdiffstats
path: root/browser/components/newtab/karma.mc.config.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/newtab/karma.mc.config.js')
-rw-r--r--browser/components/newtab/karma.mc.config.js346
1 files changed, 346 insertions, 0 deletions
diff --git a/browser/components/newtab/karma.mc.config.js b/browser/components/newtab/karma.mc.config.js
new file mode 100644
index 0000000000..83cc6e1219
--- /dev/null
+++ b/browser/components/newtab/karma.mc.config.js
@@ -0,0 +1,346 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const path = require("path");
+const webpack = require("webpack");
+const { ResourceUriPlugin } = require("./tools/resourceUriPlugin");
+
+const PATHS = {
+ // Where is the entry point for the unit tests?
+ testEntryFile: path.resolve(__dirname, "test/unit/unit-entry.js"),
+
+ // A glob-style pattern matching all unit tests
+ testFilesPattern: "test/unit/**/*.js",
+
+ // The base directory of all source files (used for path resolution in webpack importing)
+ moduleResolveDirectory: __dirname,
+
+ // a RegEx matching all Cu.import statements of local files
+ resourcePathRegEx: /^resource:\/\/activity-stream\//,
+
+ coverageReportingPath: "logs/coverage/",
+};
+
+// When tweaking here, be sure to review the docs about the execution ordering
+// semantics of the preprocessors array, as they are somewhat odd.
+const preprocessors = {};
+preprocessors[PATHS.testFilesPattern] = [
+ "webpack", // require("karma-webpack")
+ "sourcemap", // require("karma-sourcemap-loader")
+];
+
+module.exports = function (config) {
+ const isTDD = config.tdd;
+ const browsers = isTDD ? ["Firefox"] : ["FirefoxHeadless"]; // require("karma-firefox-launcher")
+ config.set({
+ singleRun: !isTDD,
+ browsers,
+ customLaunchers: {
+ FirefoxHeadless: {
+ base: "Firefox",
+ flags: ["--headless"],
+ },
+ },
+ frameworks: [
+ "chai", // require("chai") require("karma-chai")
+ "mocha", // require("mocha") require("karma-mocha")
+ "sinon", // require("sinon") require("karma-sinon")
+ ],
+ reporters: [
+ "coverage-istanbul", // require("karma-coverage")
+ "mocha", // require("karma-mocha-reporter")
+
+ // for bin/try-runner.js to parse the output easily
+ "json", // require("karma-json-reporter")
+ ],
+ jsonReporter: {
+ // So this doesn't get interleaved with other karma output
+ stdout: false,
+ outputFile: path.join("logs", "karma-run-results.json"),
+ },
+ coverageIstanbulReporter: {
+ reports: ["lcov", "text-summary"], // for some reason "lcov" reallys means "lcov" and "html"
+ "report-config": {
+ // so the full m-c path gets printed; needed for https://coverage.moz.tools/ integration
+ lcov: {
+ projectRoot: "../../..",
+ },
+ },
+ dir: PATHS.coverageReportingPath,
+ // This will make karma fail if coverage reporting is less than the minimums here
+ thresholds: !isTDD && {
+ each: {
+ statements: 100,
+ lines: 100,
+ functions: 100,
+ branches: 66,
+ overrides: {
+ "lib/AboutPreferences.jsm": {
+ statements: 98,
+ lines: 98,
+ functions: 94,
+ branches: 66,
+ },
+ "lib/ASRouter.jsm": {
+ statements: 75,
+ lines: 75,
+ functions: 64,
+ branches: 66,
+ },
+ "lib/ASRouterDefaultConfig.jsm": {
+ statements: 0,
+ lines: 0,
+ functions: 0,
+ branches: 0,
+ },
+ "content-src/asrouter/asrouter-utils.js": {
+ statements: 66,
+ lines: 66,
+ functions: 78,
+ branches: 63,
+ },
+ "lib/TelemetryFeed.jsm": {
+ statements: 99,
+ lines: 99,
+ functions: 100,
+ branches: 95,
+ },
+ "lib/ASRouterParentProcessMessageHandler.jsm": {
+ statements: 98,
+ lines: 98,
+ functions: 100,
+ branches: 88,
+ },
+ "content-src/lib/init-store.js": {
+ statements: 98,
+ lines: 98,
+ functions: 100,
+ branches: 100,
+ },
+ "lib/ActivityStreamStorage.jsm": {
+ statements: 100,
+ lines: 100,
+ functions: 100,
+ branches: 83,
+ },
+ "lib/PlacesFeed.jsm": {
+ statements: 98,
+ lines: 98,
+ functions: 100,
+ branches: 84,
+ },
+ "lib/UTEventReporting.sys.mjs": {
+ statements: 100,
+ lines: 100,
+ functions: 100,
+ branches: 75,
+ },
+ "lib/TopSitesFeed.jsm": {
+ statements: 70,
+ lines: 75,
+ functions: 80,
+ branches: 60,
+ },
+ "lib/Screenshots.jsm": {
+ statements: 94,
+ lines: 94,
+ functions: 75,
+ branches: 84,
+ },
+ "lib/*.jsm": {
+ statements: 100,
+ lines: 100,
+ functions: 99,
+ branches: 84,
+ },
+ "content-src/components/DiscoveryStreamComponents/**/*.jsx": {
+ statements: 90.48,
+ lines: 90.48,
+ functions: 85.71,
+ branches: 68.75,
+ },
+ "content-src/asrouter/**/*.jsx": {
+ statements: 57,
+ lines: 58,
+ functions: 60,
+ branches: 50,
+ },
+ "content-src/components/ASRouterAdmin/*.jsx": {
+ statements: 0,
+ lines: 0,
+ functions: 0,
+ branches: 0,
+ },
+ "content-src/components/CustomizeMenu/**/*.jsx": {
+ statements: 0,
+ lines: 0,
+ functions: 0,
+ branches: 0,
+ },
+ "content-src/components/CustomizeMenu/*.jsx": {
+ statements: 0,
+ lines: 0,
+ functions: 0,
+ branches: 0,
+ },
+ "content-src/lib/aboutwelcome-utils.js": {
+ statements: 50,
+ lines: 50,
+ functions: 50,
+ branches: 0,
+ },
+ "content-src/lib/link-menu-options.js": {
+ statements: 96,
+ lines: 96,
+ functions: 96,
+ branches: 70,
+ },
+ "content-src/aboutwelcome/components/LanguageSwitcher.jsx": {
+ // This file is covered by the mochitest: browser_aboutwelcome_multistage_languageSwitcher.js
+ statements: 0,
+ lines: 0,
+ functions: 0,
+ branches: 0,
+ },
+ "content-src/aboutwelcome/components/EmbeddedMigrationWizard.jsx": {
+ // This file is covered by the mochitest: browser_aboutwelcome_multistage_mr.js
+ // Can't be unit tested because it relies on the migration-wizard custom element
+ statements: 0,
+ lines: 0,
+ functions: 0,
+ branches: 0,
+ },
+ "content-src/aboutwelcome/**/*.jsx": {
+ statements: 62,
+ lines: 60,
+ functions: 50,
+ branches: 50,
+ },
+ "content-src/components/**/*.jsx": {
+ statements: 51.1,
+ lines: 52.38,
+ functions: 31.2,
+ branches: 31.2,
+ },
+ },
+ },
+ },
+ },
+ files: [PATHS.testEntryFile],
+ preprocessors,
+ webpack: {
+ mode: "none",
+ devtool: "inline-source-map",
+ // This loader allows us to override required files in tests
+ resolveLoader: {
+ alias: { inject: path.join(__dirname, "loaders/inject-loader") },
+ },
+ // This resolve config allows us to import with paths relative to the root directory, e.g. "lib/ActivityStream.jsm"
+ resolve: {
+ extensions: [".js", ".jsx"],
+ modules: [PATHS.moduleResolveDirectory, "node_modules"],
+ fallback: {
+ stream: require.resolve("stream-browserify"),
+ buffer: require.resolve("buffer"),
+ },
+ },
+ plugins: [
+ // The ResourceUriPlugin handles translating resource URIs in import
+ // statements in .mjs files, in a similar way to what
+ // babel-jsm-to-commonjs does for jsm files.
+ new ResourceUriPlugin({
+ resourcePathRegEx: PATHS.resourcePathRegEx,
+ }),
+ new webpack.DefinePlugin({
+ "process.env.NODE_ENV": JSON.stringify("development"),
+ }),
+ ],
+ externals: {
+ // enzyme needs these for backwards compatibility with 0.13.
+ // see https://github.com/airbnb/enzyme/blob/master/docs/guides/webpack.md#using-enzyme-with-webpack
+ "react/addons": true,
+ "react/lib/ReactContext": true,
+ "react/lib/ExecutionEnvironment": true,
+ },
+ module: {
+ rules: [
+ // This rule rewrites importing/exporting in .jsm files to be compatible with esmodules
+ {
+ test: /\.jsm$/,
+ exclude: [/node_modules/],
+ use: [
+ {
+ loader: "babel-loader", // require("babel-core")
+ options: {
+ plugins: [
+ // Converts .jsm files into common-js modules
+ [
+ "./tools/babel-jsm-to-commonjs.js",
+ {
+ basePath: PATHS.resourcePathRegEx,
+ removeOtherImports: true,
+ replace: true,
+ },
+ ],
+ "@babel/plugin-proposal-nullish-coalescing-operator",
+ "@babel/plugin-proposal-optional-chaining",
+ "@babel/plugin-proposal-class-properties",
+ ],
+ },
+ },
+ ],
+ },
+ {
+ test: /\.js$/,
+ exclude: [/node_modules\/(?!@fluent\/).*/, /test/],
+ loader: "babel-loader",
+ options: {
+ // This is a workaround for bug 1787278. It can be removed once
+ // that bug is fixed.
+ plugins: ["@babel/plugin-proposal-optional-chaining"],
+ },
+ },
+ {
+ test: /\.jsx$/,
+ exclude: /node_modules/,
+ loader: "babel-loader",
+ options: {
+ presets: ["@babel/preset-react"],
+ plugins: [
+ "@babel/plugin-proposal-nullish-coalescing-operator",
+ "@babel/plugin-proposal-optional-chaining",
+ ],
+ },
+ },
+ {
+ test: /\.md$/,
+ use: "raw-loader",
+ },
+ {
+ enforce: "post",
+ test: /\.js[mx]?$/,
+ loader: "@jsdevtools/coverage-istanbul-loader",
+ options: { esModules: true },
+ include: [
+ path.resolve("content-src"),
+ path.resolve("lib"),
+ path.resolve("common"),
+ ],
+ exclude: [
+ path.resolve("test"),
+ path.resolve("vendor"),
+ path.resolve("lib/ASRouterTargeting.jsm"),
+ path.resolve("lib/ASRouterTriggerListeners.jsm"),
+ path.resolve("lib/OnboardingMessageProvider.jsm"),
+ path.resolve("lib/CFRMessageProvider.sys.mjs"),
+ path.resolve("lib/CFRPageActions.jsm"),
+ ],
+ },
+ ],
+ },
+ },
+ // Silences some overly-verbose logging of individual module builds
+ webpackMiddleware: { noInfo: true },
+ });
+};