Migrate from karma to web-test-runner

We want to get rid of the final remnants of karma from gerrit core.
The recommended way to run tests is with web-test-runner.

Change-Id: I5783f54179f6046af40cb05f043eedae6749211d
diff --git a/README.md b/README.md
index 70a02fb..4f07fec 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
 
 For running unit tests execute:
 
-    bazel test --test_output=all //plugins/automerger/web:karma_test
+    bazel test --test_output=all //plugins/automerger/web:web_test_runner
 
 For checking or fixing eslint formatter problems run:
 
diff --git a/web/BUILD b/web/BUILD
index 0f8e233..f66edb2 100644
--- a/web/BUILD
+++ b/web/BUILD
@@ -1,5 +1,5 @@
 load("//tools/js:eslint.bzl", "plugin_eslint")
-load("//tools/bzl:js.bzl", "gerrit_js_bundle", "karma_test")
+load("//tools/bzl:js.bzl", "gerrit_js_bundle", "web_test_runner")
 load("@npm//@bazel/typescript:index.bzl", "ts_config", "ts_project")
 
 package_group(
@@ -51,10 +51,15 @@
     entry_point = "_bazel_ts_out/plugin.js",
 )
 
-karma_test(
-    name = "karma_test",
-    srcs = ["karma_test.sh"],
-    data = [":automerger-ts-tests"],
+web_test_runner(
+    name = "web_test_runner",
+    srcs = ["web_test_runner.sh"],
+    data = [
+        ":tsconfig",
+        ":automerger-ts-tests",
+        "@plugins_npm//:node_modules",
+        "@ui_dev_npm//:node_modules",
+    ],
 )
 
 plugin_eslint()
diff --git a/web/automerger_test.ts b/web/automerger_test.ts
index 6e55bdb..11979a8 100644
--- a/web/automerger_test.ts
+++ b/web/automerger_test.ts
@@ -26,9 +26,13 @@
   ChangeId,
   Timestamp,
   ChangeInfoId,
+  PatchSetNumber,
+  CommitId,
 } from '@gerritcodereview/typescript-api/rest-api';
 import {Automerger, ConfigMap, UIActionInfo} from './automerger';
 import {queryAll, queryAndAssert, waitUntil} from './test/test-util';
+import {assert} from '@open-wc/testing';
+import sinon from 'sinon';
 
 const change: ChangeInfo = {
   _number: 123 as NumericChangeId,
@@ -44,6 +48,8 @@
   status: ChangeStatus.NEW,
   subject: 'test-subject',
   updated: '2021-09-02 12:12:12.000000000' as Timestamp,
+  current_revision_number: 1 as PatchSetNumber,
+  current_revision: 'abc' as CommitId,
 };
 
 const configMap: ConfigMap = {
@@ -55,7 +61,8 @@
 suite('automerger tests', () => {
   let automerger: Automerger;
   let callback: (() => void) | undefined;
-  let sendStub: sinon.SinonStub;
+  let fetchStub: sinon.SinonStub;
+  let getStub: sinon.SinonStub;
   let postStub: sinon.SinonStub;
   let reloadStub: sinon.SinonStub;
   let popup: HTMLElement | undefined;
@@ -70,8 +77,10 @@
   };
 
   setup(async () => {
-    sendStub = sinon.stub();
-    sendStub.returns(Promise.resolve({}));
+    fetchStub = sinon.stub();
+    fetchStub.returns(Promise.resolve({}));
+    getStub = sinon.stub();
+    getStub.returns(Promise.resolve({}));
     postStub = sinon.stub();
     postStub.returns(Promise.resolve(configMap));
     const fakePlugin = {
@@ -90,7 +99,8 @@
       },
       restApi: () => {
         return {
-          send: sendStub,
+          fetch: fetchStub,
+          get: getStub,
           post: postStub,
         };
       },
@@ -108,8 +118,8 @@
   test('callback set, popup created', async () => {
     assert.isNotOk(callback);
     assert.isNotOk(popup);
-
     automerger.onShowChange(change);
+    automerger.onShowRevision();
     assert.isOk(callback, 'callback expected to be set');
     if (callback) callback();
     await waitUntil(() => popup !== undefined);
@@ -118,6 +128,7 @@
 
   test('popup contains 3 checkboxes', async () => {
     automerger.onShowChange(change);
+    automerger.onShowRevision();
     await waitUntil(() => postStub.called);
     if (callback) callback();
     await waitUntil(() => popup !== undefined);
@@ -127,12 +138,13 @@
 
   test('popup contains button, which triggers send', async () => {
     automerger.onShowChange(change);
+    automerger.onShowRevision();
     await waitUntil(() => postStub.called);
     if (callback) callback();
     await waitUntil(() => popup !== undefined);
     const button = queryAndAssert<HTMLElement>(popup, 'gr-button');
     button.click();
-    assert.isTrue(sendStub.called, 'expected send() to be called');
+    assert.isTrue(getStub.called, 'expected send() to be called');
     await waitUntil(() => reloadStub.called);
   });
 });
diff --git a/web/karma_test.sh b/web/karma_test.sh
deleted file mode 100755
index 9597611..0000000
--- a/web/karma_test.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/bash
-
-set -euo pipefail
-./$1 start $2 --single-run \
-  --root 'plugins/automerger/web/_bazel_ts_out_tests/' \
-  --test-files '*_test.js'
diff --git a/web/plugin.ts b/web/plugin.ts
index 03e107b..251088b 100644
--- a/web/plugin.ts
+++ b/web/plugin.ts
@@ -19,7 +19,7 @@
 import {ChangeInfo} from '@gerritcodereview/typescript-api/rest-api';
 import {Automerger} from './automerger';
 
-window.Gerrit.install(plugin => {
+window.Gerrit?.install(plugin => {
   const automerger = new Automerger(plugin);
   plugin.on(EventType.SHOW_CHANGE, (change: ChangeInfo) =>
     automerger.onShowChange(change)
diff --git a/web/test/test-setup.ts b/web/test/test-setup.ts
index 150be02..72d950c 100644
--- a/web/test/test-setup.ts
+++ b/web/test/test-setup.ts
@@ -14,18 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import 'chai/chai';
+
+import sinon from 'sinon';
 
 declare global {
   interface Window {
-    assert: typeof chai.assert;
-    expect: typeof chai.expect;
     sinon: typeof sinon;
   }
-  let assert: typeof chai.assert;
-  let expect: typeof chai.expect;
-  let sinon: typeof sinon;
 }
-window.assert = chai.assert;
-window.expect = chai.expect;
 window.sinon = sinon;
diff --git a/web/tsconfig.json b/web/tsconfig.json
index dc7d0ac..136879e 100644
--- a/web/tsconfig.json
+++ b/web/tsconfig.json
@@ -1,7 +1,7 @@
 {
   "extends": "../../tsconfig-plugins-base.json",
   "compilerOptions": {
-    "outDir": "../../../.ts-out/plugins/automerger", /* overridden by bazel */
+    "outDir": "../../../.ts-out/plugins/automerger" /* overridden by bazel */
   },
   "include": [
     "**/*.ts"
diff --git a/web/web_test_runner.sh b/web/web_test_runner.sh
new file mode 100755
index 0000000..2765d55
--- /dev/null
+++ b/web/web_test_runner.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+set -euo pipefail
+./$1 --config $2 \
+  --dir 'plugins/automerger/web/_bazel_ts_out_tests' \
+  --test-files 'plugins/automerger/web/_bazel_ts_out_tests/*_test.js' \
+  --ts-config="plugins/automerger/web/tsconfig.json"