Bug 1309496 - Set up mocha testing framework for netmonitor,r=honza,jsnajdr,linclark draft
authorFred Lin <gasolin@mozilla.com>
Fri, 28 Oct 2016 15:20:06 +0800
changeset 433743 e3af1382e7020ba23c796358da8303e44dbce44d
parent 433742 43b69e748e78b45983a5d8df6c0f9a77ccfed026
child 535940 1602471a830266ae5a7980bfbebe67d99a5af74a
push id34634
push userbmo:gasolin@mozilla.com
push dateFri, 04 Nov 2016 06:04:37 +0000
reviewershonza, jsnajdr, linclark
bugs1309496
milestone52.0a1
Bug 1309496 - Set up mocha testing framework for netmonitor,r=honza,jsnajdr,linclark MozReview-Commit-ID: 1tW2yua6h7u
devtools/client/netmonitor/package.json
devtools/client/netmonitor/test/components/filter-buttons.test.js
devtools/client/netmonitor/test/fixtures/create-store.js
devtools/client/netmonitor/test/fixtures/l10n.js
devtools/client/netmonitor/test/fixtures/localization-helper.js
devtools/client/netmonitor/test/require-helper.js
new file mode 100644
--- /dev/null
+++ b/devtools/client/netmonitor/package.json
@@ -0,0 +1,20 @@
+{
+  "name": "netmonitor",
+  "version": "0.0.1",
+  "devDependencies": {
+    "amd-loader": "0.0.5",
+    "babel-preset-es2015": "^6.6.0",
+    "babel-register": "^6.7.2",
+    "cross-env": "^3.1.3",
+    "enzyme": "^2.4.1",
+    "expect": "^1.16.0",
+    "jsdom": "^9.4.1",
+    "jsdom-global": "^2.0.0",
+    "mocha": "^2.5.3",
+    "require-hacker": "^2.1.4"
+  },
+  "scripts": {
+    "postinstall": "cd ../ && npm install && cd netmonitor",
+    "test": "cross-env NODE_PATH=../../../ mocha test/**/*.test.js --compilers js:babel-register -r jsdom-global/register -r ./test/require-helper.js"
+  }
+}
new file mode 100644
--- /dev/null
+++ b/devtools/client/netmonitor/test/components/filter-buttons.test.js
@@ -0,0 +1,100 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+/* eslint-env node, mocha */
+"use strict";
+
+const expect = require("expect");
+const { mount } = require("enzyme");
+const { createFactory } = require("devtools/client/shared/vendor/react");
+const { configureStore } = require("devtools/client/netmonitor/store");
+const Provider = createFactory(require("devtools/client/shared/vendor/react-redux").Provider);
+const Actions = require("devtools/client/netmonitor/actions/index");
+const FilterButtons = createFactory(require("devtools/client/netmonitor/components/filter-buttons"));
+
+const expectDefaultTypes = {
+  all: true,
+  html: false,
+  css: false,
+  js: false,
+  xhr: false,
+  fonts: false,
+  images: false,
+  media: false,
+  flash: false,
+  ws: false,
+  other: false,
+};
+
+// unit test
+describe("FilterButtons component:", () => {
+  const store = configureStore();
+  const wrapper = mount(FilterButtons({ store }));
+
+  asExpected(wrapper, expectDefaultTypes, "by default");
+});
+
+// integration test with redux store, action, reducer
+describe("FilterButtons::enableFilterOnly:", () => {
+  const expectXHRTypes = {
+    all: false,
+    html: false,
+    css: false,
+    js: false,
+    xhr: true,
+    fonts: false,
+    images: false,
+    media: false,
+    flash: false,
+    ws: false,
+    other: false,
+  };
+
+  const store = configureStore();
+  const wrapper = mount(Provider(
+    { store },
+    FilterButtons()
+  ));
+
+  store.dispatch(Actions.enableFilterTypeOnly("xhr"));
+  asExpected(wrapper, expectXHRTypes, `when enableFilterOnly("xhr") is called`);
+});
+
+// integration test with redux store, action, reducer
+describe("FilterButtons::toggleFilter:", () => {
+  const expectXHRJSTypes = {
+    all: false,
+    html: false,
+    css: false,
+    js: true,
+    xhr: true,
+    fonts: false,
+    images: false,
+    media: false,
+    flash: false,
+    ws: false,
+    other: false,
+  };
+
+  const store = configureStore();
+  const wrapper = mount(Provider(
+    { store },
+    FilterButtons()
+  ));
+
+  store.dispatch(Actions.toggleFilterType("xhr"));
+  store.dispatch(Actions.toggleFilterType("js"));
+  asExpected(wrapper, expectXHRJSTypes, `when xhr, js is toggled`);
+});
+
+function asExpected(wrapper, expectTypes, description) {
+  for (let type of Object.keys(expectTypes)) {
+    let checked = expectTypes[type] ? "checked" : "not checked";
+    let className = expectTypes[type] ?
+        "menu-filter-button checked": "menu-filter-button";
+    it(`'${type}' button is ${checked} ${description}`, () => {
+      expect(wrapper.find(`#requests-menu-filter-${type}-button`).html())
+      .toBe(`<button id="requests-menu-filter-${type}-button" class="` + className +
+            `" data-key="${type}">netmonitor.toolbar.filter.${type}</button>`);
+    });
+  }
+}
new file mode 100644
--- /dev/null
+++ b/devtools/client/netmonitor/test/fixtures/create-store.js
@@ -0,0 +1,8 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
+
+const { createStore } = require("devtools/client/shared/vendor/redux");
+
+// Current mockup does not support any middleware
+module.exports = () => createStore;
new file mode 100644
--- /dev/null
+++ b/devtools/client/netmonitor/test/fixtures/l10n.js
@@ -0,0 +1,20 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// @TODO Load the actual strings from netmonitor.properties instead.
+class L10n {
+  getStr(str) {
+    switch (str) {
+      default:
+        return str;
+    }
+  }
+
+  getFormatStr(str) {
+    return this.getStr(str);
+  }
+}
+
+module.exports = L10n;
new file mode 100644
--- /dev/null
+++ b/devtools/client/netmonitor/test/fixtures/localization-helper.js
@@ -0,0 +1,10 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const LocalizationHelper = require("devtools/client/netmonitor/test/fixtures/l10n");
+
+module.exports = {
+  LocalizationHelper
+};
new file mode 100644
--- /dev/null
+++ b/devtools/client/netmonitor/test/require-helper.js
@@ -0,0 +1,33 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
+
+const requireHacker = require("require-hacker");
+
+requireHacker.global_hook("default", path => {
+  switch (path) {
+    // For Enzyme
+    case "react-dom":
+      return `const React = require('devtools/client/shared/vendor/react-dev'); module.exports = React`;
+    case "react-dom/server":
+      return `const React = require('devtools/client/shared/vendor/react-dev'); module.exports = React`;
+    case "react-addons-test-utils":
+      return `const React = require('devtools/client/shared/vendor/react-dev'); module.exports = React.addons.TestUtils`;
+    // Use react-dev. This would be handled by browserLoader in Firefox.
+    case "react":
+    case "devtools/client/shared/vendor/react":
+      return `const React = require('devtools/client/shared/vendor/react-dev'); module.exports = React`;
+    // For Rep's use of AMD
+    case "devtools/client/shared/vendor/react.default":
+      return `const React = require('devtools/client/shared/vendor/react-dev'); module.exports = React`;
+  }
+
+  // Some modules depend on Chrome APIs which don't work in mocha. When such a module
+  // is required, replace it with a mock version.
+  switch (path) {
+    case "devtools/shared/l10n":
+      return `module.exports = require("devtools/client/netmonitor/test/fixtures/localization-helper")`;
+    case "devtools/client/shared/redux/create-store":
+      return `module.exports = require("devtools/client/netmonitor/test/fixtures/create-store")`;
+  }
+});