From 356f78b46564a0d84e8c5d01fd406981e2e7a29e Mon Sep 17 00:00:00 2001
From: Christoph Reiter <reiter.christoph@gmail.com>
Date: Mon, 16 Nov 2020 13:22:01 +0100
Subject: [PATCH] tests: use the mocha tdd mode everywhere and drop karma-chai

Use tdd in all cases to be more consisstend.
Also since last year we can use chai with rollup directly, so
do that everywhere instead of relying on karma-chai injecting
it in to the global scope.
---
 demo/package.json                             |  1 -
 demo/yarn.lock                                | 10 -------
 package.json                                  |  2 +-
 packages/app-shell/rollup.config.js           |  2 +-
 packages/auth/karma.conf.js                   |  2 +-
 packages/auth/package.json                    |  2 +-
 packages/auth/test/unit.js                    | 14 +++++-----
 packages/check-in-place-select/karma.conf.js  | 10 ++++---
 packages/check-in-place-select/package.json   |  2 +-
 .../check-in-place-select/rollup.config.js    |  4 +++
 packages/check-in-place-select/test/unit.js   | 22 ++++++++-------
 packages/data-table-view/test/unit.js         |  8 +++---
 packages/file-handling/karma.conf.js          |  9 +++++--
 packages/file-handling/package.json           |  2 +-
 packages/file-handling/rollup.config.js       |  7 +++++
 packages/file-handling/test/unit.js           | 22 ++++++++-------
 .../karma.conf.js                             |  9 +++++--
 .../package.json                              |  2 +-
 .../rollup.config.js                          |  4 +++
 .../test/unit.js                              | 22 ++++++++-------
 packages/language-select/karma.conf.js        |  9 +++++--
 packages/language-select/package.json         |  2 +-
 packages/language-select/rollup.config.js     |  7 +++++
 packages/language-select/test/unit.js         | 27 ++++++++++---------
 packages/matomo/karma.conf.js                 |  9 +++++--
 packages/matomo/package.json                  |  2 +-
 packages/matomo/rollup.config.js              |  4 +++
 packages/matomo/test/unit.js                  | 24 ++++++++++++++---
 packages/notification/karma.conf.js           |  9 +++++--
 packages/notification/package.json            |  2 +-
 packages/notification/rollup.config.js        |  7 +++++
 packages/notification/test/unit.js            | 12 +++++----
 packages/person-profile/karma.conf.js         |  9 +++++--
 packages/person-profile/package.json          |  2 +-
 packages/person-profile/rollup.config.js      |  4 +++
 packages/person-profile/test/unit.js          | 12 +++++----
 packages/person-select/karma.conf.js          | 10 ++++---
 packages/person-select/package.json           |  2 +-
 packages/person-select/rollup.config.js       |  4 +++
 packages/person-select/test/unit.js           | 22 ++++++++-------
 packages/qr-code-scanner/package.json         |  2 +-
 packages/qr-code-scanner/test/unit.js         |  4 +--
 yarn.lock                                     |  5 ----
 43 files changed, 221 insertions(+), 125 deletions(-)

diff --git a/demo/package.json b/demo/package.json
index 1817867a..346eba99 100644
--- a/demo/package.json
+++ b/demo/package.json
@@ -28,7 +28,6 @@
     "glob": "^7.1.6",
     "i18next-scanner": "^2.10.3",
     "karma": "^5.1.0",
-    "karma-chai": "^0.1.0",
     "karma-chrome-launcher": "^3.1.0",
     "karma-firefox-launcher": "^1.3.0",
     "karma-mocha": "^2.0.1",
diff --git a/demo/yarn.lock b/demo/yarn.lock
index e7fee0b4..c19d6ec4 100644
--- a/demo/yarn.lock
+++ b/demo/yarn.lock
@@ -4147,11 +4147,6 @@ jsprim@^1.2.2:
     json-schema "0.2.3"
     verror "1.10.0"
 
-jsqr@^1.3.1:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/jsqr/-/jsqr-1.3.1.tgz#515a766e58b00c80142f3a2dc4b8751100ceedcf"
-  integrity sha512-zCTP6Qd/WwjrpuHFkJuXc5opRdKprUr7eI7+JCCtcetThJt45qptu82MWQ+eET+FtDrMo7+BYjo3iD0XIq1L9Q==
-
 jszip@^3.2.2, jszip@^3.5.0:
   version "3.5.0"
   resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.5.0.tgz#b4fd1f368245346658e781fec9675802489e15f6"
@@ -4162,11 +4157,6 @@ jszip@^3.2.2, jszip@^3.5.0:
     readable-stream "~2.3.6"
     set-immediate-shim "~1.0.1"
 
-karma-chai@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/karma-chai/-/karma-chai-0.1.0.tgz#bee5ad40400517811ae34bb945f762909108b79a"
-  integrity sha1-vuWtQEAFF4Ea40u5RfdikJEIt5o=
-
 karma-chrome-launcher@^3.0.0, karma-chrome-launcher@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738"
diff --git a/package.json b/package.json
index b1ca1d8d..eb8f3f93 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
     "packages/*"
   ],
   "scripts": {
-    "test": "lerna run test"
+    "test": "lerna run --parallel test"
   },
   "author": "",
   "license": "LGPL-2.1-or-later",
diff --git a/packages/app-shell/rollup.config.js b/packages/app-shell/rollup.config.js
index acea48bc..9203f9a2 100644
--- a/packages/app-shell/rollup.config.js
+++ b/packages/app-shell/rollup.config.js
@@ -24,7 +24,7 @@ export default (async () => {
         onwarn: function (warning, warn) {
             // ignore chai warnings
             if (warning.code === 'CIRCULAR_DEPENDENCY') {
-              return;
+                return;
             }
             warn(warning);
         },
diff --git a/packages/auth/karma.conf.js b/packages/auth/karma.conf.js
index b6731e57..f9cda6ad 100644
--- a/packages/auth/karma.conf.js
+++ b/packages/auth/karma.conf.js
@@ -15,7 +15,7 @@ module.exports = function(config) {
       {pattern: './**/*', included: false, watched: true, served: true},
     ],
     autoWatch: true,
-    browsers: ['ChromeHeadlessNoSandbox'],
+    browsers: ['ChromeHeadlessNoSandbox', 'FirefoxHeadless'],
     customLaunchers: {
       ChromeHeadlessNoSandbox: {
         base: 'ChromeHeadless',
diff --git a/packages/auth/package.json b/packages/auth/package.json
index 2f616783..dd985976 100644
--- a/packages/auth/package.json
+++ b/packages/auth/package.json
@@ -17,8 +17,8 @@
     "glob": "^7.1.6",
     "i18next-scanner": "^2.10.2",
     "karma": "^5.1.0",
-    "karma-chai": "^0.1.0",
     "karma-chrome-launcher": "^3.0.0",
+    "karma-firefox-launcher": "^1.3.0",
     "karma-mocha": "^2.0.1",
     "mocha": "^8.0.1",
     "puppeteer": "^5.3.1",
diff --git a/packages/auth/test/unit.js b/packages/auth/test/unit.js
index fee5e7c5..9995d6ef 100644
--- a/packages/auth/test/unit.js
+++ b/packages/auth/test/unit.js
@@ -6,7 +6,7 @@ import '../src/dbp-auth-demo';
 suite('dbp-auth basics', () => {
   let node;
 
-  suiteSetup(async () => {
+  setup(async () => {
     node = document.createElement('dbp-auth-keycloak');
     node.setAttribute('url', 'someurl');
     node.setAttribute('realm', 'somerealm');
@@ -15,7 +15,7 @@ suite('dbp-auth basics', () => {
     await node.updateComplete;
   });
 
-  suiteTeardown(() => {
+  teardown(() => {
     node.remove();
   });
 
@@ -27,13 +27,13 @@ suite('dbp-auth basics', () => {
 suite('dbp-login-button', () => {
     let node;
   
-    suiteSetup(async () => {
+    setup(async () => {
       node = document.createElement('dbp-login-button');
       document.body.appendChild(node);
       await node.updateComplete;
     });
-  
-    suiteTeardown(() => {
+
+    teardown(() => {
       node.remove();
     });
   
@@ -45,13 +45,13 @@ suite('dbp-login-button', () => {
 suite('dbp-auth-demo basics', () => {
   let node;
 
-  suiteSetup(async () => {
+  setup(async () => {
     node = document.createElement('dbp-auth-demo');
     document.body.appendChild(node);
     await node.updateComplete;
   });
 
-  suiteTeardown(() => {
+  teardown(() => {
     node.remove();
   });
 
diff --git a/packages/check-in-place-select/karma.conf.js b/packages/check-in-place-select/karma.conf.js
index 4b99e08a..f9cda6ad 100644
--- a/packages/check-in-place-select/karma.conf.js
+++ b/packages/check-in-place-select/karma.conf.js
@@ -1,17 +1,21 @@
 // Trick to use the auto-downloaded puppeteer chrome binary
 process.env.CHROME_BIN = require('puppeteer').executablePath();
-const pkg = require('./package.json');
 
 module.exports = function(config) {
   config.set({
     basePath: 'dist',
-    frameworks: ['mocha', 'chai'],
+    frameworks: ['mocha'],
+    client: {
+      mocha: {
+        ui: 'tdd',
+      },
+    },
     files: [
       {pattern: './*.js', included: true, watched: true, served: true, type: 'module'},
       {pattern: './**/*', included: false, watched: true, served: true},
     ],
     autoWatch: true,
-    browsers: ['ChromeHeadlessNoSandbox'],
+    browsers: ['ChromeHeadlessNoSandbox', 'FirefoxHeadless'],
     customLaunchers: {
       ChromeHeadlessNoSandbox: {
         base: 'ChromeHeadless',
diff --git a/packages/check-in-place-select/package.json b/packages/check-in-place-select/package.json
index ab6f3e30..36965425 100644
--- a/packages/check-in-place-select/package.json
+++ b/packages/check-in-place-select/package.json
@@ -13,8 +13,8 @@
     "chai": "^4.2.0",
     "i18next-scanner": "^2.10.2",
     "karma": "^5.1.0",
-    "karma-chai": "^0.1.0",
     "karma-chrome-launcher": "^3.0.0",
+    "karma-firefox-launcher": "^1.3.0",
     "karma-mocha": "^2.0.1",
     "mocha": "^8.0.1",
     "puppeteer": "^5.3.1",
diff --git a/packages/check-in-place-select/rollup.config.js b/packages/check-in-place-select/rollup.config.js
index 0ea288b1..7c4bb333 100644
--- a/packages/check-in-place-select/rollup.config.js
+++ b/packages/check-in-place-select/rollup.config.js
@@ -24,6 +24,10 @@ export default (async () => {
             sourcemap: true
         },
         onwarn: function (warning, warn) {
+            // ignore chai warnings
+            if (warning.code === 'CIRCULAR_DEPENDENCY') {
+                return;
+            }
             warn(warning);
         },
         plugins: [
diff --git a/packages/check-in-place-select/test/unit.js b/packages/check-in-place-select/test/unit.js
index d5498ceb..c8d13045 100644
--- a/packages/check-in-place-select/test/unit.js
+++ b/packages/check-in-place-select/test/unit.js
@@ -1,38 +1,40 @@
+import {assert} from 'chai';
+
 import '../src/dbp-check-in-place-select.js';
 import '../src/demo.js';
 
-describe('dbp-check-in-place-select basics', () => {
+suite('dbp-check-in-place-select basics', () => {
   let node;
 
-  beforeEach(async () => {
+  setup(async () => {
     node = document.createElement('dbp-check-in-place-select');
     document.body.appendChild(node);
     await node.updateComplete;
   });
 
-  afterEach(() => {
+  teardown(() => {
     node.remove();
   });
 
-  it('should render', () => {
-      expect(node).to.have.property('shadowRoot');
+  test('should render', () => {
+    assert.isNotNull(node.shadowRoot);
   });
 });
 
-describe('dbp-check-in-place-select-demo basics', () => {
+suite('dbp-check-in-place-select-demo basics', () => {
   let node;
 
-  beforeEach(async () => {
+  setup(async () => {
     node = document.createElement('dbp-check-in-place-select-demo');
     document.body.appendChild(node);
     await node.updateComplete;
   });
 
-  afterEach(() => {
+  teardown(() => {
     node.remove();
   });
 
-  it('should render', () => {
-      expect(node).to.have.property('shadowRoot');
+  test('should render', () => {
+    assert.isNotNull(node.shadowRoot);
   });
 });
diff --git a/packages/data-table-view/test/unit.js b/packages/data-table-view/test/unit.js
index 531a2bfe..7ce5434a 100644
--- a/packages/data-table-view/test/unit.js
+++ b/packages/data-table-view/test/unit.js
@@ -6,13 +6,13 @@ import '../src/dbp-data-table-view-demo';
 suite('dbp-data-table-view basics', () => {
   let node;
 
-  suiteSetup(async () => {
+  setup(async () => {
     node = document.createElement('dbp-data-table-view');
     document.body.appendChild(node);
     await node.updateComplete;
   });
 
-  suiteTeardown(() => {
+  teardown(() => {
     node.remove();
   });
 
@@ -24,13 +24,13 @@ suite('dbp-data-table-view basics', () => {
 suite('dbp-data-table-view-demo basics', () => {
   let node;
 
-  suiteSetup(async () => {
+  setup(async () => {
     node = document.createElement('dbp-data-table-view-demo');
     document.body.appendChild(node);
     await node.updateComplete;
   });
 
-  suiteTeardown(() => {
+  teardown(() => {
     node.remove();
   });
 
diff --git a/packages/file-handling/karma.conf.js b/packages/file-handling/karma.conf.js
index 6a646f5e..f9cda6ad 100644
--- a/packages/file-handling/karma.conf.js
+++ b/packages/file-handling/karma.conf.js
@@ -4,13 +4,18 @@ process.env.CHROME_BIN = require('puppeteer').executablePath();
 module.exports = function(config) {
   config.set({
     basePath: 'dist',
-    frameworks: ['mocha', 'chai'],
+    frameworks: ['mocha'],
+    client: {
+      mocha: {
+        ui: 'tdd',
+      },
+    },
     files: [
       {pattern: './*.js', included: true, watched: true, served: true, type: 'module'},
       {pattern: './**/*', included: false, watched: true, served: true},
     ],
     autoWatch: true,
-    browsers: ['ChromeHeadlessNoSandbox'],
+    browsers: ['ChromeHeadlessNoSandbox', 'FirefoxHeadless'],
     customLaunchers: {
       ChromeHeadlessNoSandbox: {
         base: 'ChromeHeadless',
diff --git a/packages/file-handling/package.json b/packages/file-handling/package.json
index fe66a616..2fc9910d 100644
--- a/packages/file-handling/package.json
+++ b/packages/file-handling/package.json
@@ -11,8 +11,8 @@
     "chai": "^4.2.0",
     "i18next-scanner": "^2.10.2",
     "karma": "^5.0.1",
-    "karma-chai": "^0.1.0",
     "karma-chrome-launcher": "^3.0.0",
+    "karma-firefox-launcher": "^1.3.0",
     "karma-mocha": "^2.0.0",
     "mocha": "^8.0.1",
     "puppeteer": "^5.3.1",
diff --git a/packages/file-handling/rollup.config.js b/packages/file-handling/rollup.config.js
index 3c597be1..48f897d0 100644
--- a/packages/file-handling/rollup.config.js
+++ b/packages/file-handling/rollup.config.js
@@ -25,6 +25,13 @@ export default (async () => {
             format: 'esm',
             sourcemap: true
         },
+        onwarn: function (warning, warn) {
+            // ignore chai warnings
+            if (warning.code === 'CIRCULAR_DEPENDENCY') {
+                return;
+            }
+            warn(warning);
+        },
         plugins: [
             del({
                 targets: 'dist/*'
diff --git a/packages/file-handling/test/unit.js b/packages/file-handling/test/unit.js
index fee6e05b..ce2943ed 100644
--- a/packages/file-handling/test/unit.js
+++ b/packages/file-handling/test/unit.js
@@ -1,38 +1,40 @@
+import {assert} from 'chai';
+
 import '../src/dbp-file-source';
 import '../src/demo';
 
-describe('dbp-file-source basics', () => {
+suite('dbp-file-source basics', () => {
   let node;
 
-  beforeEach(async () => {
+  setup(async () => {
     node = document.createElement('dbp-file-source');
     document.body.appendChild(node);
     await node.updateComplete;
   });
 
-  afterEach(() => {
+  teardown(() => {
     node.remove();
   });
 
-  it('should render', () => {
-      expect(node).to.have.property('shadowRoot');
+  test('should render', () => {
+    assert.isNotNull(node.shadowRoot);
   });
 });
 
-describe('dbp-file-source demo', () => {
+suite('dbp-file-source demo', () => {
   let node;
 
-  beforeEach(async () => {
+  setup(async () => {
     node = document.createElement('dbp-file-source-demo');
     document.body.appendChild(node);
     await node.updateComplete;
   });
 
-  afterEach(() => {
+  teardown(() => {
     node.remove();
   });
 
-  it('should render', () => {
-      expect(node).to.have.property('shadowRoot');
+  test('should render', () => {
+    assert.isNotNull(node.shadowRoot);
   });
 });
diff --git a/packages/knowledge-base-web-page-element-view/karma.conf.js b/packages/knowledge-base-web-page-element-view/karma.conf.js
index 6a646f5e..f9cda6ad 100644
--- a/packages/knowledge-base-web-page-element-view/karma.conf.js
+++ b/packages/knowledge-base-web-page-element-view/karma.conf.js
@@ -4,13 +4,18 @@ process.env.CHROME_BIN = require('puppeteer').executablePath();
 module.exports = function(config) {
   config.set({
     basePath: 'dist',
-    frameworks: ['mocha', 'chai'],
+    frameworks: ['mocha'],
+    client: {
+      mocha: {
+        ui: 'tdd',
+      },
+    },
     files: [
       {pattern: './*.js', included: true, watched: true, served: true, type: 'module'},
       {pattern: './**/*', included: false, watched: true, served: true},
     ],
     autoWatch: true,
-    browsers: ['ChromeHeadlessNoSandbox'],
+    browsers: ['ChromeHeadlessNoSandbox', 'FirefoxHeadless'],
     customLaunchers: {
       ChromeHeadlessNoSandbox: {
         base: 'ChromeHeadless',
diff --git a/packages/knowledge-base-web-page-element-view/package.json b/packages/knowledge-base-web-page-element-view/package.json
index 7d548031..467bfd4e 100644
--- a/packages/knowledge-base-web-page-element-view/package.json
+++ b/packages/knowledge-base-web-page-element-view/package.json
@@ -11,8 +11,8 @@
     "@rollup/plugin-url": "^5.0.1",
     "chai": "^4.2.0",
     "karma": "^5.1.0",
-    "karma-chai": "^0.1.0",
     "karma-chrome-launcher": "^3.0.0",
+    "karma-firefox-launcher": "^1.3.0",
     "karma-mocha": "^2.0.1",
     "mocha": "^8.0.1",
     "puppeteer": "^5.3.1",
diff --git a/packages/knowledge-base-web-page-element-view/rollup.config.js b/packages/knowledge-base-web-page-element-view/rollup.config.js
index df8835f3..87bac9e1 100644
--- a/packages/knowledge-base-web-page-element-view/rollup.config.js
+++ b/packages/knowledge-base-web-page-element-view/rollup.config.js
@@ -24,6 +24,10 @@ export default (async () => {
             sourcemap: true
         },
         onwarn: function (warning, warn) {
+            // ignore chai warnings
+            if (warning.code === 'CIRCULAR_DEPENDENCY') {
+                return;
+            }
             warn(warning);
         },
         plugins: [
diff --git a/packages/knowledge-base-web-page-element-view/test/unit.js b/packages/knowledge-base-web-page-element-view/test/unit.js
index 48263b32..43594f7f 100644
--- a/packages/knowledge-base-web-page-element-view/test/unit.js
+++ b/packages/knowledge-base-web-page-element-view/test/unit.js
@@ -1,38 +1,40 @@
+import {assert} from 'chai';
+
 import '../src/dbp-knowledge-base-web-page-element-view.js';
 import '../src/dbp-knowledge-base-web-page-element-view-demo.js';
 
-describe('dbp-knowledge-base-web-page-element-view basics', () => {
+suite('dbp-knowledge-base-web-page-element-view basics', () => {
   let node;
 
-  beforeEach(async () => {
+  setup(async () => {
     node = document.createElement('dbp-knowledge-base-web-page-element-view');
     document.body.appendChild(node);
     await node.updateComplete;
   });
 
-  afterEach(() => {
+  teardown(() => {
     node.remove();
   });
 
-  it('should render', () => {
-      expect(node).to.have.property('shadowRoot');
+  test('should render', () => {
+    assert.isNotNull(node.shadowRoot);
   });
 });
 
-describe('dbp-knowledge-base-web-page-element-view demo', () => {
+suite('dbp-knowledge-base-web-page-element-view demo', () => {
   let node;
 
-  beforeEach(async () => {
+  setup(async () => {
     node = document.createElement('dbp-knowledge-base-web-page-element-view-demo');
     document.body.appendChild(node);
     await node.updateComplete;
   });
 
-  afterEach(() => {
+  teardown(() => {
     node.remove();
   });
 
-  it('should render', () => {
-      expect(node).to.have.property('shadowRoot');
+  test('should render', () => {
+    assert.isNotNull(node.shadowRoot);
   });
 });
diff --git a/packages/language-select/karma.conf.js b/packages/language-select/karma.conf.js
index 6a646f5e..f9cda6ad 100644
--- a/packages/language-select/karma.conf.js
+++ b/packages/language-select/karma.conf.js
@@ -4,13 +4,18 @@ process.env.CHROME_BIN = require('puppeteer').executablePath();
 module.exports = function(config) {
   config.set({
     basePath: 'dist',
-    frameworks: ['mocha', 'chai'],
+    frameworks: ['mocha'],
+    client: {
+      mocha: {
+        ui: 'tdd',
+      },
+    },
     files: [
       {pattern: './*.js', included: true, watched: true, served: true, type: 'module'},
       {pattern: './**/*', included: false, watched: true, served: true},
     ],
     autoWatch: true,
-    browsers: ['ChromeHeadlessNoSandbox'],
+    browsers: ['ChromeHeadlessNoSandbox', 'FirefoxHeadless'],
     customLaunchers: {
       ChromeHeadlessNoSandbox: {
         base: 'ChromeHeadless',
diff --git a/packages/language-select/package.json b/packages/language-select/package.json
index 23bd392a..6210a0ee 100644
--- a/packages/language-select/package.json
+++ b/packages/language-select/package.json
@@ -11,8 +11,8 @@
     "chai": "^4.2.0",
     "i18next-scanner": "^2.10.2",
     "karma": "^5.1.0",
-    "karma-chai": "^0.1.0",
     "karma-chrome-launcher": "^3.0.0",
+    "karma-firefox-launcher": "^1.3.0",
     "karma-mocha": "^2.0.1",
     "mocha": "^8.0.1",
     "puppeteer": "^5.3.1",
diff --git a/packages/language-select/rollup.config.js b/packages/language-select/rollup.config.js
index 96f5a585..27a76937 100644
--- a/packages/language-select/rollup.config.js
+++ b/packages/language-select/rollup.config.js
@@ -20,6 +20,13 @@ export default {
         format: 'esm',
         sourcemap: true
     },
+    onwarn: function (warning, warn) {
+        // ignore chai warnings
+        if (warning.code === 'CIRCULAR_DEPENDENCY') {
+            return;
+        }
+        warn(warning);
+    },
     plugins: [
         del({
             targets: 'dist/*'
diff --git a/packages/language-select/test/unit.js b/packages/language-select/test/unit.js
index 54fb5b9d..b76d1f4c 100644
--- a/packages/language-select/test/unit.js
+++ b/packages/language-select/test/unit.js
@@ -1,7 +1,9 @@
+import {assert, expect} from 'chai';
+
 import '../src/dbp-language-select.js';
 import '../src/demo.js';
 
-describe('dbp-language-select basics', () => {
+suite('dbp-language-select basics', () => {
   let node;
   let events = [];
 
@@ -9,7 +11,7 @@ describe('dbp-language-select basics', () => {
     events.push(e);
   }
 
-  beforeEach(async () => {
+  setup(async () => {
     events.length = 0;
     window.addEventListener('dbp-language-changed', handler);
     node = document.createElement('dbp-language-select');
@@ -17,16 +19,16 @@ describe('dbp-language-select basics', () => {
     await node.updateComplete;
   });
 
-  afterEach(() => {
+  teardown(() => {
     node.remove();
     window.removeEventListener('dbp-language-changed', handler);
   });
 
-  it('should render', () => {
-      expect(node).to.have.property('shadowRoot');
+  test('should render', () => {
+    assert.isNotNull(node.shadowRoot);
   });
 
-  it('change language events', () => {
+  test('change language events', () => {
     node.lang = 'en';
     expect(node.next).to.equal('de');
     expect(events.length).to.equal(1);
@@ -35,7 +37,8 @@ describe('dbp-language-select basics', () => {
     expect(events.length).to.equal(2);
   });
 
-  it('change next', () => {
+  test('change next', () => {
+    expect(events.length).to.equal(0);
     node.lang = 'en';
     expect(node.next).to.equal('de');
     expect(node.lang).to.equal('en');
@@ -46,20 +49,20 @@ describe('dbp-language-select basics', () => {
   });
 });
 
-describe('dbp-language-select demo', () => {
+suite('dbp-language-select demo', () => {
   let node;
 
-  beforeEach(async () => {
+  setup(async () => {
     node = document.createElement('dbp-language-select-demo');
     document.body.appendChild(node);
     await node.updateComplete;
   });
 
-  afterEach(() => {
+  teardown(() => {
     node.remove();
   });
 
-  it('should render', () => {
-      expect(node).to.have.property('shadowRoot');
+  test('should render', () => {
+    assert.isNotNull(node.shadowRoot);
   });
 });
diff --git a/packages/matomo/karma.conf.js b/packages/matomo/karma.conf.js
index 6a646f5e..f9cda6ad 100644
--- a/packages/matomo/karma.conf.js
+++ b/packages/matomo/karma.conf.js
@@ -4,13 +4,18 @@ process.env.CHROME_BIN = require('puppeteer').executablePath();
 module.exports = function(config) {
   config.set({
     basePath: 'dist',
-    frameworks: ['mocha', 'chai'],
+    frameworks: ['mocha'],
+    client: {
+      mocha: {
+        ui: 'tdd',
+      },
+    },
     files: [
       {pattern: './*.js', included: true, watched: true, served: true, type: 'module'},
       {pattern: './**/*', included: false, watched: true, served: true},
     ],
     autoWatch: true,
-    browsers: ['ChromeHeadlessNoSandbox'],
+    browsers: ['ChromeHeadlessNoSandbox', 'FirefoxHeadless'],
     customLaunchers: {
       ChromeHeadlessNoSandbox: {
         base: 'ChromeHeadless',
diff --git a/packages/matomo/package.json b/packages/matomo/package.json
index 965f5a53..19794bcd 100644
--- a/packages/matomo/package.json
+++ b/packages/matomo/package.json
@@ -12,8 +12,8 @@
     "chai": "^4.2.0",
     "i18next-scanner": "^2.10.2",
     "karma": "^5.1.0",
-    "karma-chai": "^0.1.0",
     "karma-chrome-launcher": "^3.0.0",
+    "karma-firefox-launcher": "^1.3.0",
     "karma-mocha": "^2.0.1",
     "mocha": "^8.0.1",
     "puppeteer": "^5.3.1",
diff --git a/packages/matomo/rollup.config.js b/packages/matomo/rollup.config.js
index 3f08b808..74206c84 100644
--- a/packages/matomo/rollup.config.js
+++ b/packages/matomo/rollup.config.js
@@ -52,6 +52,10 @@ export default (async () => {
             sourcemap: true
         },
         onwarn: function (warning, warn) {
+            // ignore chai warnings
+            if (warning.code === 'CIRCULAR_DEPENDENCY') {
+                return;
+            }
             warn(warning);
         },
         plugins: [
diff --git a/packages/matomo/test/unit.js b/packages/matomo/test/unit.js
index bc2f3f5d..cbdbc701 100644
--- a/packages/matomo/test/unit.js
+++ b/packages/matomo/test/unit.js
@@ -1,3 +1,21 @@
-describe('dbp-matomo', () => {
-    it('should render', () => {});
-});
+import {assert} from 'chai';
+import '../src/dbp-matomo';
+
+suite('dbp-matomo', () => {
+    let node;
+  
+    setup(async () => {
+      node = document.createElement('dbp-matomo');
+      document.body.appendChild(node);
+      await node.updateComplete;
+    });
+  
+    teardown(() => {
+      node.remove();
+    });
+  
+    test('should render', () => {
+      assert.isNotNull(node.shadowRoot);
+    });
+  });
+  
\ No newline at end of file
diff --git a/packages/notification/karma.conf.js b/packages/notification/karma.conf.js
index 6a646f5e..f9cda6ad 100644
--- a/packages/notification/karma.conf.js
+++ b/packages/notification/karma.conf.js
@@ -4,13 +4,18 @@ process.env.CHROME_BIN = require('puppeteer').executablePath();
 module.exports = function(config) {
   config.set({
     basePath: 'dist',
-    frameworks: ['mocha', 'chai'],
+    frameworks: ['mocha'],
+    client: {
+      mocha: {
+        ui: 'tdd',
+      },
+    },
     files: [
       {pattern: './*.js', included: true, watched: true, served: true, type: 'module'},
       {pattern: './**/*', included: false, watched: true, served: true},
     ],
     autoWatch: true,
-    browsers: ['ChromeHeadlessNoSandbox'],
+    browsers: ['ChromeHeadlessNoSandbox', 'FirefoxHeadless'],
     customLaunchers: {
       ChromeHeadlessNoSandbox: {
         base: 'ChromeHeadless',
diff --git a/packages/notification/package.json b/packages/notification/package.json
index dc68e356..7fae753c 100644
--- a/packages/notification/package.json
+++ b/packages/notification/package.json
@@ -12,8 +12,8 @@
     "chai": "^4.2.0",
     "i18next-scanner": "^2.10.2",
     "karma": "^5.1.0",
-    "karma-chai": "^0.1.0",
     "karma-chrome-launcher": "^3.0.0",
+    "karma-firefox-launcher": "^1.3.0",
     "karma-mocha": "^2.0.1",
     "mocha": "^8.0.1",
     "puppeteer": "^5.3.1",
diff --git a/packages/notification/rollup.config.js b/packages/notification/rollup.config.js
index 639ffbd3..ff5162a1 100644
--- a/packages/notification/rollup.config.js
+++ b/packages/notification/rollup.config.js
@@ -21,6 +21,13 @@ export default {
         format: 'esm',
         sourcemap: true
     },
+    onwarn: function (warning, warn) {
+        // ignore chai warnings
+        if (warning.code === 'CIRCULAR_DEPENDENCY') {
+            return;
+        }
+        warn(warning);
+    },
     plugins: [
         del({
             targets: 'dist/*'
diff --git a/packages/notification/test/unit.js b/packages/notification/test/unit.js
index 786cfacb..e476e86b 100644
--- a/packages/notification/test/unit.js
+++ b/packages/notification/test/unit.js
@@ -1,19 +1,21 @@
+import {assert} from 'chai';
+
 import '../src/dbp-notification';
 
-describe('dbp-notification basics', () => {
+suite('dbp-notification basics', () => {
   let node;
 
-  beforeEach(async () => {
+  setup(async () => {
     node = document.createElement('dbp-notification');
     document.body.appendChild(node);
     await node.updateComplete;
   });
 
-  afterEach(() => {
+  teardown(() => {
     node.remove();
   });
 
-  it('should render', () => {
-      expect(node).to.have.property('shadowRoot');
+  test('should render', () => {
+    assert.isNotNull(node.shadowRoot);
   });
 });
diff --git a/packages/person-profile/karma.conf.js b/packages/person-profile/karma.conf.js
index 6a646f5e..f9cda6ad 100644
--- a/packages/person-profile/karma.conf.js
+++ b/packages/person-profile/karma.conf.js
@@ -4,13 +4,18 @@ process.env.CHROME_BIN = require('puppeteer').executablePath();
 module.exports = function(config) {
   config.set({
     basePath: 'dist',
-    frameworks: ['mocha', 'chai'],
+    frameworks: ['mocha'],
+    client: {
+      mocha: {
+        ui: 'tdd',
+      },
+    },
     files: [
       {pattern: './*.js', included: true, watched: true, served: true, type: 'module'},
       {pattern: './**/*', included: false, watched: true, served: true},
     ],
     autoWatch: true,
-    browsers: ['ChromeHeadlessNoSandbox'],
+    browsers: ['ChromeHeadlessNoSandbox', 'FirefoxHeadless'],
     customLaunchers: {
       ChromeHeadlessNoSandbox: {
         base: 'ChromeHeadless',
diff --git a/packages/person-profile/package.json b/packages/person-profile/package.json
index 04fbc1bc..4e8599c4 100644
--- a/packages/person-profile/package.json
+++ b/packages/person-profile/package.json
@@ -12,8 +12,8 @@
     "chai": "^4.2.0",
     "i18next-scanner": "^2.10.2",
     "karma": "^5.1.0",
-    "karma-chai": "^0.1.0",
     "karma-chrome-launcher": "^3.0.0",
+    "karma-firefox-launcher": "^1.3.0",
     "karma-mocha": "^2.0.1",
     "mocha": "^8.0.1",
     "puppeteer": "^5.3.1",
diff --git a/packages/person-profile/rollup.config.js b/packages/person-profile/rollup.config.js
index 977c5a50..45b314c0 100644
--- a/packages/person-profile/rollup.config.js
+++ b/packages/person-profile/rollup.config.js
@@ -25,6 +25,10 @@ export default (async () => {
             sourcemap: true
         },
         onwarn: function (warning, warn) {
+            // ignore chai warnings
+            if (warning.code === 'CIRCULAR_DEPENDENCY') {
+                return;
+            }
             warn(warning);
         },
         plugins: [
diff --git a/packages/person-profile/test/unit.js b/packages/person-profile/test/unit.js
index 8635f113..db0670b4 100644
--- a/packages/person-profile/test/unit.js
+++ b/packages/person-profile/test/unit.js
@@ -1,19 +1,21 @@
+import {assert} from 'chai';
+
 import '../src/dbp-person-profile-demo.js';
 
-describe('dbp-person-profile demo', () => {
+suite('dbp-person-profile demo', () => {
   let node;
 
-  beforeEach(async () => {
+  setup(async () => {
     node = document.createElement('dbp-person-profile-demo');
     document.body.appendChild(node);
     await node.updateComplete;
   });
 
-  afterEach(() => {
+  teardown(() => {
     node.remove();
   });
 
-  it('should render', () => {
-      expect(node).to.have.property('shadowRoot');
+  test('should render', () => {
+    assert.isNotNull(node.shadowRoot);
   });
 });
diff --git a/packages/person-select/karma.conf.js b/packages/person-select/karma.conf.js
index 4b99e08a..f9cda6ad 100644
--- a/packages/person-select/karma.conf.js
+++ b/packages/person-select/karma.conf.js
@@ -1,17 +1,21 @@
 // Trick to use the auto-downloaded puppeteer chrome binary
 process.env.CHROME_BIN = require('puppeteer').executablePath();
-const pkg = require('./package.json');
 
 module.exports = function(config) {
   config.set({
     basePath: 'dist',
-    frameworks: ['mocha', 'chai'],
+    frameworks: ['mocha'],
+    client: {
+      mocha: {
+        ui: 'tdd',
+      },
+    },
     files: [
       {pattern: './*.js', included: true, watched: true, served: true, type: 'module'},
       {pattern: './**/*', included: false, watched: true, served: true},
     ],
     autoWatch: true,
-    browsers: ['ChromeHeadlessNoSandbox'],
+    browsers: ['ChromeHeadlessNoSandbox', 'FirefoxHeadless'],
     customLaunchers: {
       ChromeHeadlessNoSandbox: {
         base: 'ChromeHeadless',
diff --git a/packages/person-select/package.json b/packages/person-select/package.json
index 4d058df1..851b7300 100644
--- a/packages/person-select/package.json
+++ b/packages/person-select/package.json
@@ -13,8 +13,8 @@
     "chai": "^4.2.0",
     "i18next-scanner": "^2.10.2",
     "karma": "^5.1.0",
-    "karma-chai": "^0.1.0",
     "karma-chrome-launcher": "^3.0.0",
+    "karma-firefox-launcher": "^1.3.0",
     "karma-mocha": "^2.0.1",
     "mocha": "^8.0.1",
     "puppeteer": "^5.3.1",
diff --git a/packages/person-select/rollup.config.js b/packages/person-select/rollup.config.js
index 274fa5e7..35abaaa5 100644
--- a/packages/person-select/rollup.config.js
+++ b/packages/person-select/rollup.config.js
@@ -24,6 +24,10 @@ export default (async () => {
             sourcemap: true
         },
         onwarn: function (warning, warn) {
+            // ignore chai warnings
+            if (warning.code === 'CIRCULAR_DEPENDENCY') {
+                return;
+            }
             warn(warning);
         },
         plugins: [
diff --git a/packages/person-select/test/unit.js b/packages/person-select/test/unit.js
index ce021395..fcefa861 100644
--- a/packages/person-select/test/unit.js
+++ b/packages/person-select/test/unit.js
@@ -1,38 +1,40 @@
+import {assert} from 'chai';
+
 import '../src/dbp-person-select.js';
 import '../src/demo.js';
 
-describe('dbp-person-select basics', () => {
+suite('dbp-person-select basics', () => {
   let node;
 
-  beforeEach(async () => {
+  setup(async () => {
     node = document.createElement('dbp-person-select');
     document.body.appendChild(node);
     await node.updateComplete;
   });
 
-  afterEach(() => {
+  teardown(() => {
     node.remove();
   });
 
-  it('should render', () => {
-      expect(node).to.have.property('shadowRoot');
+  test('should render', () => {
+    assert.isNotNull(node.shadowRoot);
   });
 });
 
-describe('dbp-person-select-demo basics', () => {
+suite('dbp-person-select-demo basics', () => {
   let node;
 
-  beforeEach(async () => {
+  setup(async () => {
     node = document.createElement('dbp-person-select-demo');
     document.body.appendChild(node);
     await node.updateComplete;
   });
 
-  afterEach(() => {
+  teardown(() => {
     node.remove();
   });
 
-  it('should render', () => {
-      expect(node).to.have.property('shadowRoot');
+  test('should render', () => {
+    assert.isNotNull(node.shadowRoot);
   });
 });
diff --git a/packages/qr-code-scanner/package.json b/packages/qr-code-scanner/package.json
index 98ed6202..596d6c0a 100644
--- a/packages/qr-code-scanner/package.json
+++ b/packages/qr-code-scanner/package.json
@@ -14,8 +14,8 @@
     "eslint-plugin-jsdoc": "^30.7.3",
     "i18next-scanner": "^2.10.2",
     "karma": "^5.1.0",
-    "karma-chai": "^0.1.0",
     "karma-chrome-launcher": "^3.0.0",
+    "karma-firefox-launcher": "^1.3.0",
     "karma-mocha": "^2.0.1",
     "mocha": "^8.0.1",
     "puppeteer": "^5.3.1",
diff --git a/packages/qr-code-scanner/test/unit.js b/packages/qr-code-scanner/test/unit.js
index 0537c74d..3e3340c1 100644
--- a/packages/qr-code-scanner/test/unit.js
+++ b/packages/qr-code-scanner/test/unit.js
@@ -5,13 +5,13 @@ import '../src/dbp-qr-code-scanner';
 suite('dbp-qr-code-scanner basics', () => {
   let node;
 
-  suiteSetup(async () => {
+  setup(async () => {
     node = document.createElement('dbp-qr-code-scanner');
     document.body.appendChild(node);
     await node.updateComplete;
   });
 
-  suiteTeardown(() => {
+  teardown(() => {
     node.remove();
   });
 
diff --git a/yarn.lock b/yarn.lock
index c9493148..4c398165 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5072,11 +5072,6 @@ jszip@^3.2.2, jszip@^3.5.0:
     readable-stream "~2.3.6"
     set-immediate-shim "~1.0.1"
 
-karma-chai@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/karma-chai/-/karma-chai-0.1.0.tgz#bee5ad40400517811ae34bb945f762909108b79a"
-  integrity sha1-vuWtQEAFF4Ea40u5RfdikJEIt5o=
-
 karma-chrome-launcher@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738"
-- 
GitLab