You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by hn...@apache.org on 2020/03/25 21:28:34 UTC

[myfaces-tobago] 02/02: jasmine framework: test tools

This is an automated email from the ASF dual-hosted git repository.

hnoeth pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/myfaces-tobago.git

commit 886a6f0bffe523e718df24ed680cf6a95494f269
Author: Henning Nöth <hn...@apache.org>
AuthorDate: Wed Mar 25 22:26:08 2020 +0100

    jasmine framework: test tools
    
    * jasmine: set DEFAULT_TIMEOUT_INTERVAL to 2 minutes
    * use querySelectorFn() and querySelectorAllFn() instead of testFrameQuerySelectorFn() and testFrameQuerySelectorAllFn(). If migration from QUnit to Jasmine is complete, these old testFrame*() methods should be deleted
    * migrate: In.test.js, Radio.test.js
    
    Issue: TOBAGO-2022
---
 .../20-component/010-input/10-in/In.test.js        |  53 +++-----
 .../030-select/30-selectOneRadio/Radio.test.js     | 142 ++++++++++-----------
 .../src/main/webapp/script/jasmine-3.5.0/boot.js   |   1 +
 .../src/main/webapp/script/tobago-test.js          |  14 +-
 .../resources/tobago/test/tobago-test-tool.js      |  94 ++++++++++++++
 5 files changed, 192 insertions(+), 112 deletions(-)

diff --git a/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/010-input/10-in/In.test.js b/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/010-input/10-in/In.test.js
index 16a31ad..d551113 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/010-input/10-in/In.test.js
+++ b/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/010-input/10-in/In.test.js
@@ -15,46 +15,29 @@
  * limitations under the License.
  */
 
-import {testFrameQuerySelectorFn} from "/script/tobago-test.js";
-import {TobagoTestTool} from "/tobago/test/tobago-test-tool.js";
+import {querySelectorFn, testFrameQuerySelectorFn} from "/script/tobago-test.js";
+import {JasmineTestTool} from "/tobago/test/tobago-test-tool.js";
 
-QUnit.test("inputfield with label", function (assert) {
+it("inputfield with label", function (done) {
   let labelFn = testFrameQuerySelectorFn("#page\\:mainForm\\:iNormal > label");
   let inputFieldFn = testFrameQuerySelectorFn("#page\\:mainForm\\:iNormal\\:\\:field");
 
-  let TTT = new TobagoTestTool(assert);
-  TTT.asserts(2, function () {
-    assert.equal(labelFn().textContent, "Input");
-    assert.equal(inputFieldFn().value, "Some Text");
-  });
-  TTT.action(function () {
-    inputFieldFn().value = "abc";
-  });
-  TTT.asserts(1, function () {
-    assert.equal(inputFieldFn().value, "abc");
-  });
-  TTT.startTest();
+  const test = new JasmineTestTool(done);
+  test.do(() => expect(labelFn().textContent).toBe("Input"));
+  test.do(() => expect(inputFieldFn().value).toBe("Some Text"));
+  test.do(() => inputFieldFn().value = "abc");
+  test.do(() => expect(inputFieldFn().value).toBe("abc"));
+  test.start();
 });
 
-QUnit.test("ajax change event", function (assert) {
-  let inputFieldFn = testFrameQuerySelectorFn("#page\\:mainForm\\:inputAjax\\:\\:field");
-  let outputFieldFn = testFrameQuerySelectorFn("#page\\:mainForm\\:outputAjax span");
+it("ajax change event", function (done) {
+  let inputFieldFn = querySelectorFn("#page\\:mainForm\\:inputAjax\\:\\:field");
+  let outputFieldFn = querySelectorFn("#page\\:mainForm\\:outputAjax span");
 
-  let TTT = new TobagoTestTool(assert);
-  TTT.asserts(2, function () {
-    assert.equal(inputFieldFn().value, "");
-    assert.equal(outputFieldFn().textContent, "");
-  });
-  TTT.action(function () {
-    inputFieldFn().value = "qwe";
-    inputFieldFn().dispatchEvent(new Event("change", {bubbles: true}));
-  });
-  TTT.waitForResponse();
-  TTT.asserts(1, function () {
-    assert.equal(inputFieldFn().value, "qwe");
-  });
-  TTT.asserts(1, function () {
-    assert.equal(outputFieldFn().textContent, "qwe");
-  });
-  TTT.startTest();
+  const test = new JasmineTestTool(done);
+  test.do(() => inputFieldFn().value = "some input text");
+  test.do(() => inputFieldFn().dispatchEvent(new Event("change", {bubbles: true})));
+  test.wait(() => outputFieldFn() && outputFieldFn().textContent === "some input text");
+  test.do(() => expect(outputFieldFn().textContent).toBe("some input text"));
+  test.start();
 });
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/030-select/30-selectOneRadio/Radio.test.js b/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/030-select/30-selectOneRadio/Radio.test.js
index 00e7a39..891b604 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/030-select/30-selectOneRadio/Radio.test.js
+++ b/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/030-select/30-selectOneRadio/Radio.test.js
@@ -15,91 +15,81 @@
  * limitations under the License.
  */
 
-import {testFrameQuerySelectorAllFn, testFrameQuerySelectorFn} from "/script/tobago-test.js";
-import {TobagoTestTool} from "/tobago/test/tobago-test-tool.js";
+import {querySelectorAllFn, querySelectorFn} from "/script/tobago-test.js";
+import {JasmineTestTool} from "/tobago/test/tobago-test-tool.js";
 
-QUnit.test("submit: Addition (2 + 4)", function (assert) {
-  let number1Fn = testFrameQuerySelectorAllFn("#page\\:mainForm\\:selectNum1 input");
-  let number2Fn = testFrameQuerySelectorAllFn("#page\\:mainForm\\:selectNum2 input");
-  let submitAddFn = testFrameQuerySelectorFn("#page\\:mainForm\\:submitAdd");
-  let outputFn = testFrameQuerySelectorFn("#page\\:mainForm\\:resultOutput span");
+it("submit: Addition (2 + 4)", function (done) {
+  let number1Fn = querySelectorAllFn("#page\\:mainForm\\:selectNum1 input");
+  let number2Fn = querySelectorAllFn("#page\\:mainForm\\:selectNum2 input");
+  let submitAddFn = querySelectorFn("#page\\:mainForm\\:submitAdd");
+  let outputFn = querySelectorFn("#page\\:mainForm\\:resultOutput span");
 
-  let TTT = new TobagoTestTool(assert);
-  TTT.action(function () {
-    number1Fn().item(0).checked = false;
-    number1Fn().item(1).checked = true; // Select 2
-    number1Fn().item(2).checked = false;
-    number2Fn().item(0).checked = false;
-    number2Fn().item(1).checked = false;
-    number2Fn().item(2).checked = true; // Select 4
-    submitAddFn().dispatchEvent(new Event("click", {bubbles: true}));
-  });
-  TTT.waitForResponse();
-  TTT.asserts(1, function () {
-    assert.equal(outputFn().textContent, "6");
-  });
-  TTT.startTest();
+  const test = new JasmineTestTool(done);
+  test.do(() => number1Fn().item(0).checked = false);
+  test.do(() => number1Fn().item(1).checked = true); // Select 2
+  test.do(() => number1Fn().item(2).checked = false);
+  test.do(() => number2Fn().item(0).checked = false);
+  test.do(() => number2Fn().item(1).checked = false);
+  test.do(() => number2Fn().item(2).checked = true); // Select 4
+  test.do(() => submitAddFn().dispatchEvent(new Event("click", {bubbles: true})));
+  test.wait(() => outputFn() && outputFn().textContent === "6");
+  test.do(() => expect(outputFn().textContent).toBe("6"));
+  test.start();
 });
 
-QUnit.test("submit: Subtraction (4 - 1)", function (assert) {
-  let number1Fn = testFrameQuerySelectorAllFn("#page\\:mainForm\\:selectNum1 input");
-  let number2Fn = testFrameQuerySelectorAllFn("#page\\:mainForm\\:selectNum2 input");
-  let submitSubFn = testFrameQuerySelectorFn("#page\\:mainForm\\:submitSub");
-  let outputFn = testFrameQuerySelectorFn("#page\\:mainForm\\:resultOutput span");
+it("submit: Subtraction (4 - 1)", function (done) {
+  let number1Fn = querySelectorAllFn("#page\\:mainForm\\:selectNum1 input");
+  let number2Fn = querySelectorAllFn("#page\\:mainForm\\:selectNum2 input");
+  let submitSubFn = querySelectorFn("#page\\:mainForm\\:submitSub");
+  let outputFn = querySelectorFn("#page\\:mainForm\\:resultOutput span");
 
-  let TTT = new TobagoTestTool(assert);
-  TTT.action(function () {
-    number1Fn().item(0).checked = false;
-    number1Fn().item(1).checked = false;
-    number1Fn().item(2).checked = true; // Select 4
-    number2Fn().item(0).checked = true; // Select 1
-    number2Fn().item(1).checked = false;
-    number2Fn().item(2).checked = false;
-    submitSubFn().dispatchEvent(new Event("click", {bubbles: true}));
-  });
-  TTT.waitForResponse();
-  TTT.asserts(1, function () {
-    assert.equal(outputFn().textContent, "3");
-  });
-  TTT.startTest();
+  const test = new JasmineTestTool(done);
+  test.do(() => number1Fn().item(0).checked = false);
+  test.do(() => number1Fn().item(1).checked = false);
+  test.do(() => number1Fn().item(2).checked = true); // Select 4
+  test.do(() => number2Fn().item(0).checked = true); // Select 1
+  test.do(() => number2Fn().item(1).checked = false);
+  test.do(() => number2Fn().item(2).checked = false);
+  test.do(() => submitSubFn().dispatchEvent(new Event("click", {bubbles: true})));
+  test.wait(() => outputFn() && outputFn().textContent === "3");
+  test.do(() => expect(outputFn().textContent).toBe("3"));
+  test.start();
 });
 
-QUnit.test("ajax: select Mars", function (assert) {
-  let planetFn = testFrameQuerySelectorAllFn("#page\\:mainForm\\:selectPlanet input");
-  let moonsFn = testFrameQuerySelectorAllFn("#page\\:mainForm\\:moonradio label.form-check-label");
+it("ajax: select Mars", function (done) {
+  let planetFn = querySelectorAllFn("#page\\:mainForm\\:selectPlanet input");
+  let moonsFn = querySelectorAllFn("#page\\:mainForm\\:moonradio label.form-check-label");
 
-  let TTT = new TobagoTestTool(assert);
-  TTT.action(function () {
-    planetFn().item(0).checked = false;
-    planetFn().item(2).checked = false;
-    planetFn().item(1).checked = true; // Mars.
-    planetFn().item(1).dispatchEvent(new Event("change", {bubbles: true}));
-  });
-  TTT.waitForResponse();
-  TTT.asserts(2, function () {
-    assert.equal(moonsFn().item(0).textContent, "Phobos");
-    assert.equal(moonsFn().item(1).textContent, "Deimos");
-  });
-  TTT.startTest();
+  const test = new JasmineTestTool(done);
+  test.do(() => planetFn().item(0).checked = false);
+  test.do(() => planetFn().item(2).checked = false);
+  test.do(() => planetFn().item(1).checked = true); // Mars.
+  test.do(() => planetFn().item(1).dispatchEvent(new Event("change", {bubbles: true})));
+  test.wait(() => moonsFn()
+      && moonsFn().item(0).textContent === "Phobos" && moonsFn().item(1).textContent === "Deimos");
+  test.do(() => expect(moonsFn().item(0).textContent).toBe("Phobos"));
+  test.do(() => expect(moonsFn().item(1).textContent).toBe("Deimos"));
+  test.start();
 });
 
-QUnit.test("ajax: select Jupiter", function (assert) {
-  let planetFn = testFrameQuerySelectorAllFn("#page\\:mainForm\\:selectPlanet input");
-  let moonsFn = testFrameQuerySelectorAllFn("#page\\:mainForm\\:moonradio label.form-check-label");
+it("ajax: select Jupiter", function (done) {
+  let planetFn = querySelectorAllFn("#page\\:mainForm\\:selectPlanet input");
+  let moonsFn = querySelectorAllFn("#page\\:mainForm\\:moonradio label.form-check-label");
 
-  let TTT = new TobagoTestTool(assert);
-  TTT.action(function () {
-    planetFn().item(0).checked = false;
-    planetFn().item(1).checked = false;
-    planetFn().item(2).checked = true; // Jupiter.
-    planetFn().item(2).dispatchEvent(new Event("change", {bubbles: true}));
-  });
-  TTT.waitForResponse();
-  TTT.asserts(4, function () {
-    assert.equal(moonsFn().item(0).textContent, "Europa");
-    assert.equal(moonsFn().item(1).textContent, "Ganymed");
-    assert.equal(moonsFn().item(2).textContent, "Io");
-    assert.equal(moonsFn().item(3).textContent, "Kallisto");
-  });
-  TTT.startTest();
+  const test = new JasmineTestTool(done);
+  test.do(() => planetFn().item(0).checked = false);
+  test.do(() => planetFn().item(1).checked = false);
+  test.do(() => planetFn().item(2).checked = true); // Jupiter.
+  test.do(() => planetFn().item(2).dispatchEvent(new Event("change", {bubbles: true})));
+  test.wait(() => moonsFn() &&
+      moonsFn().item(0).textContent === "Europa"
+      && moonsFn().item(1).textContent === "Ganymed"
+      && moonsFn().item(2).textContent === "Io"
+      && moonsFn().item(3).textContent === "Kallisto"
+  );
+  test.do(() => expect(moonsFn().item(0).textContent).toBe("Europa"));
+  test.do(() => expect(moonsFn().item(1).textContent).toBe("Ganymed"));
+  test.do(() => expect(moonsFn().item(2).textContent).toBe("Io"));
+  test.do(() => expect(moonsFn().item(3).textContent).toBe("Kallisto"));
+  test.start()
 });
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/script/jasmine-3.5.0/boot.js b/tobago-example/tobago-example-demo/src/main/webapp/script/jasmine-3.5.0/boot.js
index b438fb8..76fc879 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/script/jasmine-3.5.0/boot.js
+++ b/tobago-example/tobago-example-demo/src/main/webapp/script/jasmine-3.5.0/boot.js
@@ -16,6 +16,7 @@
    * Require Jasmine's core files. Specifically, this requires and attaches all of Jasmine's code to the `jasmine` reference.
    */
   window.jasmine = jasmineRequire.core(jasmineRequire);
+  jasmine.DEFAULT_TIMEOUT_INTERVAL = 120000;
 
   /**
    * Since this is being run in a browser and the results should populate to an HTML page, require the HTML-specific Jasmine code, injecting the same reference.
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/script/tobago-test.js b/tobago-example/tobago-example-demo/src/main/webapp/script/tobago-test.js
index 991ccb3..d6d01a6 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/script/tobago-test.js
+++ b/tobago-example/tobago-example-demo/src/main/webapp/script/tobago-test.js
@@ -15,6 +15,18 @@
  * limitations under the License.
  */
 
+function querySelectorFn(expression) {
+  return function () {
+    return document.getElementById("page:testframe").contentWindow.document.querySelector(expression);
+  }
+}
+
+function querySelectorAllFn(expression) {
+  return function () {
+    return document.getElementById("page:testframe").contentWindow.document.querySelectorAll(expression);
+  }
+}
+
 function testFrameQuerySelectorFn(expression) {
   return function () {
     return document.getElementById("page:testframe").contentWindow.document.querySelector(expression);
@@ -27,7 +39,7 @@ function testFrameQuerySelectorAllFn(expression) {
   }
 }
 
-export {testFrameQuerySelectorFn, testFrameQuerySelectorAllFn};
+export {querySelectorFn, querySelectorAllFn, testFrameQuerySelectorFn, testFrameQuerySelectorAllFn};
 
 QUnit.test("wait for test", function (assert) {
   let done = assert.async();
diff --git a/tobago-tool/tobago-tool-test/src/main/resources/META-INF/resources/tobago/test/tobago-test-tool.js b/tobago-tool/tobago-tool-test/src/main/resources/META-INF/resources/tobago/test/tobago-test-tool.js
index a2c8601..52e7fff 100644
--- a/tobago-tool/tobago-tool-test/src/main/resources/META-INF/resources/tobago/test/tobago-test-tool.js
+++ b/tobago-tool/tobago-tool-test/src/main/resources/META-INF/resources/tobago/test/tobago-test-tool.js
@@ -225,3 +225,97 @@ TobagoTestTool.prototype = {
 };
 
 export {TobagoTestTool};
+
+class JasmineTestTool {
+
+  steps = [];
+  cycleTiming = 50;
+  done;
+  timeout;
+  lastStepExecution;
+
+  constructor(done, timeout) {
+    this.done = done; //done function from Jasmine; must called if all Steps done or timeout
+    this.timeout = timeout ? timeout : 20000; //timeout for a single step
+  }
+
+  do(fn) {
+    this.steps.push({
+      type: "do",
+      func: fn,
+      done: false
+    });
+  }
+
+  wait(fn) {
+    this.steps.push({
+      type: "wait",
+      func: fn,
+      done: false
+    });
+  }
+
+  start() {
+    this.resetTimeout();
+    this.cycle();
+  }
+
+  cycle() {
+    let nextStep = this.getNextStep();
+
+    if (this.isFinished()) {
+      this.done();
+    } else if (this.isTimeout()) {
+      fail("Timeout!");
+      this.done();
+    } else if (this.isStepValid(nextStep)) {
+      if (nextStep.type === "do") {
+        nextStep.func();
+        nextStep.done = true;
+        this.resetTimeout();
+        window.setTimeout(this.cycle.bind(this), this.cycleTiming);
+      } else if (nextStep.type === "wait") {
+        if (nextStep.func()) {
+          nextStep.done = true;
+          this.resetTimeout();
+        }
+        window.setTimeout(this.cycle.bind(this), this.cycleTiming);
+      }
+    } else {
+      fail("an unexpected error has occurred!");
+      this.done();
+    }
+  }
+
+  isFinished() {
+    for (let step of this.steps) {
+      if (!step.done) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  getNextStep() {
+    for (let step of this.steps) {
+      if (!step.done) {
+        return step;
+      }
+    }
+    return null;
+  }
+
+  isStepValid(step) {
+    return step && (step.type === "do" || step.type === "wait");
+  }
+
+  isTimeout() {
+    return Date.now() > (this.lastStepExecution + this.timeout);
+  }
+
+  resetTimeout() {
+    this.lastStepExecution = Date.now();
+  }
+}
+
+export {JasmineTestTool};