Repository: opossum-tool/OpossumUI
Pull request #2459 (2024-01-04 14:35:47)

chore: remove unused code
### Summary of changes

- extract test setup from shared folder
- create command for detecting unused code
- run command as part of code-check pipeline
- remove unused dependencies and code

### Context and reason for change

Unused dependencies and code bloat the app unnecessarily.

### How can the changes be tested

Run `yarn unused-check`.


Patch:
diff --git a/.eslintrc.js b/.eslintrc.js
index ebd3357f..deb4ac2a 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -165,7 +165,7 @@ module.exports = {
       files: [
         '**/*.test.ts',
         '**/*.test.tsx',
-        'src/shared/Faker.ts',
+        'src/testing/**/*',
         'src/e2e-tests/**/*',
       ],
       rules: {
diff --git a/.github/workflows/check-code-quality.yml b/.github/workflows/check-code-quality.yml
index 0784dd64..b9b45e52 100644
--- a/.github/workflows/check-code-quality.yml
+++ b/.github/workflows/check-code-quality.yml
@@ -43,4 +43,6 @@ jobs:
 
       - run: yarn circular-import-check
 
+      - run: yarn unused-check
+
       - run: yarn test:unit
diff --git a/.unimportedrc.json b/.unimportedrc.json
new file mode 100644
index 00000000..4ff6ec12
--- /dev/null
+++ b/.unimportedrc.json
@@ -0,0 +1,23 @@
+{
+  "entry": [
+    "src/index.tsx",
+    "src/ElectronBackend/app.ts",
+    "src/ElectronBackend/preload.ts"
+  ],
+  "ignorePatterns": [
+    "**/src/testing/**",
+    "**/src/e2e-tests/**",
+    "**/src/Frontend/test-helpers/**",
+    "**/node_modules/**",
+    "**/*.tests.{js,jsx,ts,tsx}",
+    "**/*.test.{js,jsx,ts,tsx}",
+    "**/*.spec.{js,jsx,ts,tsx}",
+    "**/tests/**",
+    "**/__tests__/**",
+    "**/*.d.ts"
+  ],
+  "ignoreUnimported": [],
+  "ignoreUnused": [],
+  "ignoreUnresolved": [],
+  "respectGitignore": true
+}
diff --git a/jest.config.ts b/jest.config.ts
index 64e19368..174b9c1a 100644
--- a/jest.config.ts
+++ b/jest.config.ts
@@ -8,11 +8,11 @@ const config: Config = {
   testEnvironment: 'jsdom',
   resetMocks: false,
   transformIgnorePatterns: ['/node_modules/(?!d3-*|internmap|axios)'],
-  setupFilesAfterEnv: ['./src/shared/setup-tests.ts'],
+  setupFilesAfterEnv: ['./src/testing/setup-tests.ts'],
   watchAll: false,
   clearMocks: true,
-  globalSetup: './src/shared/global-test-setup.ts',
-  globalTeardown: './src/shared/global-test-teardown.ts',
+  globalSetup: './src/testing/global-test-setup.ts',
+  globalTeardown: './src/testing/global-test-teardown.ts',
   setupFiles: ['whatwg-fetch'],
   roots: ['<rootDir>/src/Frontend', '<rootDir>/src/ElectronBackend'],
   modulePathIgnorePatterns: ['<rootDir>/build/'],
diff --git a/package.json b/package.json
index 56ef9157..f2ae09ad 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,6 @@
     "@mui/system": "^5.15.3",
     "@reduxjs/toolkit": "^2.0.1",
     "@tanstack/react-query": "^5.17.1",
-    "buffer": "^6.0.3",
     "compare-versions": "^6.1.0",
     "dayjs": "^1.11.10",
     "electron-devtools-installer": "^3.2.0",
@@ -27,6 +26,7 @@
     "lodash": "^4.17.21",
     "object-hash": "^3.0.0",
     "packageurl-js": "^1.2.1",
+    "prop-types": "^15.8.1",
     "proxy-memoize": "^2.0.4",
     "re-resizable": "^6.9.11",
     "react": "^18.2.0",
@@ -38,7 +38,6 @@
     "spdx-license-ids": "^3.0.16",
     "stream-json": "^1.8.0",
     "upath": "^2.0.1",
-    "url": "^0.11.3",
     "uuid": "^9.0.1"
   },
   "devDependencies": {
@@ -62,6 +61,7 @@
     "@types/jest": "^29.5.11",
     "@types/js-yaml": "^4.0.9",
     "@types/lodash": "^4.14.202",
+    "@types/node": "^20.10.6",
     "@types/object-hash": "^3.0.6",
     "@types/prop-types": "^15.7.11",
     "@types/react": "^18.2.46",
@@ -103,6 +103,7 @@
     "start-server-and-test": "^2.0.3",
     "ts-node": "^10.9.2",
     "typescript": "^5.3.3",
+    "unimported": "^1.31.1",
     "vite": "^5.0.10",
     "vite-plugin-electron": "^0.15.5",
     "vite-plugin-svgr": "^4.2.0",
@@ -127,6 +128,7 @@
     "format": "prettier --write --ignore-unknown .",
     "format-check": "prettier --check --ignore-unknown .",
     "copyright-lint-check": "reuse lint",
+    "unused-check": "unimported",
     "update-commit-hash": "run-script-os",
     "update-commit-hash:darwin:linux": "COMMIT_INFO=$(git describe --exact-match --tags 2> /dev/null || git rev-parse --short HEAD); echo \"{\\\"commitInfo\\\" : \\\"$COMMIT_INFO\\\" }\" > \"src/commitInfo.json\"",
     "update-commit-hash:win32": "tools/get_app_version_for_windows.bat",
diff --git a/renovate.json5 b/renovate.json5
index 30316b80..be6f8898 100644
--- a/renovate.json5
+++ b/renovate.json5
@@ -24,7 +24,6 @@
         '@trivago/prettier-plugin-sort-imports',
         'babel-jest',
         'babel-plugin-transform-import-meta',
-        'buffer',
         'compare-versions',
         'cross-env',
         'dayjs',
@@ -46,6 +45,7 @@
         'nunjucks',
         'object-hash',
         'prettier',
+        'prop-types',
         'proxy-memoize',
         'react-hotkeys-hook',
         'run-script-os',
@@ -55,7 +55,6 @@
         'ts-node',
         'typescript',
         'upath',
-        'url',
         'uuid',
         'whatwg-fetch',
       ],
diff --git a/src/Frontend/state/helpers/load-action-helpers.ts b/src/Frontend/state/helpers/load-action-helpers.ts
deleted file mode 100644
index ab33393d..00000000
--- a/src/Frontend/state/helpers/load-action-helpers.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-// SPDX-FileCopyrightText: Meta Platforms, Inc. and its affiliates
-// SPDX-FileCopyrightText: TNG Technology Consulting GmbH <https://www.tngtech.com>
-//
-// SPDX-License-Identifier: Apache-2.0
-import objectHash from 'object-hash';
-
-import {
-  Attributions,
-  AttributionsToHashes,
-  PackageInfo,
-} from '../../../shared/shared-types';
-
-const FIELDS_TO_IGNORE_WHEN_HASHING_ATTRIBUTIONS = new Set<string>([
-  'comment',
-  'attributionConfidence',
-  'originIds',
-  'preSelected',
-]);
-
-export function createExternalAttributionsToHashes(
-  externalAttributions: Attributions,
-): AttributionsToHashes {
-  const hashOptions = {
-    excludeKeys: (key: string): boolean =>
-      FIELDS_TO_IGNORE_WHEN_HASHING_ATTRIBUTIONS.has(key),
-  };
-
-  const externalAttributionsToHashes: AttributionsToHashes = {};
-  const hashesToExternalAttributions: { [hash: string]: Array<string> } = {};
-
-  for (const [attributionId, attribution] of Object.entries(
-    externalAttributions,
-  )) {
-    if (attribution.firstParty || attribution.packageName) {
-      const attributionKeys = Object.keys(attribution) as Array<
-        keyof PackageInfo
-      >;
-      attributionKeys.forEach(
-        (key) =>
-          (attribution[key] === undefined || attribution[key] === '') &&
-          delete attribution[key],
-      );
-
-      const hash = objectHash(attribution, hashOptions);
-
-      hashesToExternalAttributions[hash]
-        ? hashesToExternalAttributions[hash].push(attributionId)
-        : (hashesToExternalAttributions[hash] = [attributionId]);
-    }
-  }
-
-  Object.entries(hashesToExternalAttributions).forEach(
-    ([hash, attributionIds]) => {
-      if (attributionIds.length > 1) {
-        attributionIds.forEach(
-          (attributionId) =>
-            (externalAttributionsToHashes[attributionId] = hash),
-        );
-      }
-    },
-  );
-
-  return externalAttributionsToHashes;
-}
diff --git a/src/Frontend/util/ensure-array.ts b/src/Frontend/util/ensure-array.ts
deleted file mode 100644
index 2355abf1..00000000
--- a/src/Frontend/util/ensure-array.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-// SPDX-FileCopyrightText: Meta Platforms, Inc. and its affiliates
-// SPDX-FileCopyrightText: TNG Technology Consulting GmbH <https://www.tngtech.com>
-//
-// SPDX-License-Identifier: Apache-2.0
-
-/**
- * Makes sure that value ends up being array if not already an array
- * @param input
- */
-export function ensureArray<T>(
-  input: T | Array<T> | null | undefined,
-): Array<T> {
-  if (input === null || input === undefined) {
-    return [];
-  }
-
-  return Array.isArray(input) ? input : [input];
-}
diff --git a/src/shared/Faker.ts b/src/testing/Faker.ts
similarity index 99%
rename from src/shared/Faker.ts
rename to src/testing/Faker.ts
index 14b161df..e3d4bfde 100644
--- a/src/shared/Faker.ts
+++ b/src/testing/Faker.ts
@@ -48,7 +48,7 @@ import {
   ResourcesToAttributions,
   ResourcesWithAttributedChildren,
   Source,
-} from './shared-types';
+} from '../shared/shared-types';
 
 type ManualPackageInfo = Omit<ExternalPackageInfo, 'source'>;
 type Tuple<N extends number, T> = N extends N
diff --git a/yarn.lock b/yarn.lock
index 97006827..cfccf853 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2598,6 +2598,22 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@kwsites/file-exists@npm:^1.1.1":
+  version: 1.1.1
+  resolution: "@kwsites/file-exists@npm:1.1.1"
+  dependencies:
+    debug: "npm:^4.1.1"
+  checksum: 4ff945de7293285133aeae759caddc71e73c4a44a12fac710fdd4f574cce2671a3f89d8165fdb03d383cfc97f3f96f677d8de3c95133da3d0e12a123a23109fe
+  languageName: node
+  linkType: hard
+
+"@kwsites/promise-deferred@npm:^1.1.1":
+  version: 1.1.1
+  resolution: "@kwsites/promise-deferred@npm:1.1.1"
+  checksum: 07455477a0123d9a38afb503739eeff2c5424afa8d3dbdcc7f9502f13604488a4b1d9742fc7288832a52a6422cf1e1c0a1d51f69a39052f14d27c9a0420b6629
+  languageName: node
+  linkType: hard
+
 "@malept/cross-spawn-promise@npm:^1.1.0":
   version: 1.1.1
   resolution: "@malept/cross-spawn-promise@npm:1.1.1"
@@ -3639,6 +3655,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/node@npm:^20.10.6":
+  version: 20.10.6
+  resolution: "@types/node@npm:20.10.6"
+  dependencies:
+    undici-types: "npm:~5.26.4"
+  checksum: 08471220d3cbbb6669835c4b78541edf5eface8f2c2e36c550cfa4ff73da73071c90e200a06359fac25d6564127597c23e178128058fb676824ec23d5178a017
+  languageName: node
+  linkType: hard
+
 "@types/normalize-package-data@npm:^2.4.0":
   version: 2.4.4
   resolution: "@types/normalize-package-data@npm:2.4.4"
@@ -3843,7 +3868,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/parser@npm:^6.17.0":
+"@typescript-eslint/parser@npm:^6.17.0, @typescript-eslint/parser@npm:^6.7.3":
   version: 6.17.0
   resolution: "@typescript-eslint/parser@npm:6.17.0"
   dependencies:
@@ -3930,7 +3955,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/typescript-estree@npm:6.17.0":
+"@typescript-eslint/typescript-estree@npm:6.17.0, @typescript-eslint/typescript-estree@npm:^6.7.3":
   version: 6.17.0
   resolution: "@typescript-eslint/typescript-estree@npm:6.17.0"
   dependencies:
@@ -4764,16 +4789,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"buffer@npm:^6.0.3":
-  version: 6.0.3
-  resolution: "buffer@npm:6.0.3"
-  dependencies:
-    base64-js: "npm:^1.3.1"
-    ieee754: "npm:^1.2.1"
-  checksum: b6bc68237ebf29bdacae48ce60e5e28fc53ae886301f2ad9496618efac49427ed79096750033e7eab1897a4f26ae374ace49106a5758f38fb70c78c9fda2c3b1
-  languageName: node
-  linkType: hard
-
 "builder-util-runtime@npm:9.2.3":
   version: 9.2.3
   resolution: "builder-util-runtime@npm:9.2.3"
@@ -5039,6 +5054,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"cliui@npm:^7.0.2":
+  version: 7.0.4
+  resolution: "cliui@npm:7.0.4"
+  dependencies:
+    string-width: "npm:^4.2.0"
+    strip-ansi: "npm:^6.0.0"
+    wrap-ansi: "npm:^7.0.0"
+  checksum: db858c49af9d59a32d603987e6fddaca2ce716cd4602ba5a2bb3a5af1351eebe82aba8dff3ef3e1b331f7fa9d40ca66e67bdf8e7c327ce0ea959747ead65c0ef
+  languageName: node
+  linkType: hard
+
 "cliui@npm:^8.0.1":
   version: 8.0.1
   resolution: "cliui@npm:8.0.1"
@@ -6858,6 +6884,27 @@ __metadata:
   languageName: node
   linkType: hard
 
+"flow-parser@npm:^0.156.0":
+  version: 0.156.0
+  resolution: "flow-parser@npm:0.156.0"
+  checksum: 194c326d1ccd920c7a83f60ce38d96105c49646c884db0439c910f2142adb4fa6ae74e4c525b2f9a9d66ad3891c9699345a8c7c6d3a6b516b207a66135f8f7b3
+  languageName: node
+  linkType: hard
+
+"flow-remove-types@npm:2.156.0":
+  version: 2.156.0
+  resolution: "flow-remove-types@npm:2.156.0"
+  dependencies:
+    flow-parser: "npm:^0.156.0"
+    pirates: "npm:^3.0.2"
+    vlq: "npm:^0.2.1"
+  bin:
+    flow-node: flow-node
+    flow-remove-types: flow-remove-types
+  checksum: 1eaf738e278678e21f7aeb78937e7e5d3a94c7f119f6b110575e31c67497a6893120bd64bb4c56113d459e227fe73c93678fde6fa7081919f90ddf56f8957a6e
+  languageName: node
+  linkType: hard
+
 "follow-redirects@npm:^1.15.4":
   version: 1.15.4
   resolution: "follow-redirects@npm:1.15.4"
@@ -7495,7 +7542,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1":
+"ieee754@npm:^1.1.13":
   version: 1.2.1
   resolution: "ieee754@npm:1.2.1"
   checksum: d9f2557a59036f16c282aaeb107832dc957a93d73397d89bbad4eb1130560560eb695060145e8e6b3b498b15ab95510226649a0b8f52ae06583575419fe10fc4
@@ -9605,6 +9652,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"node-modules-regexp@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "node-modules-regexp@npm:1.0.0"
+  checksum: 99541903536c5ce552786f0fca7f06b88df595e62e423c21fa86a1674ee2363dad1f7482d1bec20b4bd9fa5f262f88e6e5cb788fc56411113f2fe2e97783a3a7
+  languageName: node
+  linkType: hard
+
 "node-releases@npm:^2.0.14":
   version: 2.0.14
   resolution: "node-releases@npm:2.0.14"
@@ -9855,6 +9909,7 @@ __metadata:
     "@types/jest": "npm:^29.5.11"
     "@types/js-yaml": "npm:^4.0.9"
     "@types/lodash": "npm:^4.14.202"
+    "@types/node": "npm:^20.10.6"
     "@types/object-hash": "npm:^3.0.6"
     "@types/prop-types": "npm:^15.7.11"
     "@types/react": "npm:^18.2.46"
@@ -9867,7 +9922,6 @@ __metadata:
     "@vitejs/plugin-react": "npm:^4.2.1"
     babel-jest: "npm:^29.7.0"
     babel-plugin-transform-import-meta: "npm:^2.2.1"
-    buffer: "npm:^6.0.3"
     compare-versions: "npm:^6.1.0"
     cross-env: "npm:^7.0.3"
     dayjs: "npm:^1.11.10"
@@ -9906,6 +9960,7 @@ __metadata:
     packageurl-js: "npm:^1.2.1"
     prettier: "npm:^3.1.1"
     prettier-plugin-sh: "npm:^0.13.1"
+    prop-types: "npm:^15.8.1"
     proxy-memoize: "npm:^2.0.4"
     re-resizable: "npm:^6.9.11"
     react: "npm:^18.2.0"
@@ -9920,8 +9975,8 @@ __metadata:
     stream-json: "npm:^1.8.0"
     ts-node: "npm:^10.9.2"
     typescript: "npm:^5.3.3"
+    unimported: "npm:^1.31.1"
     upath: "npm:^2.0.1"
-    url: "npm:^0.11.3"
     uuid: "npm:^9.0.1"
     vite: "npm:^5.0.10"
     vite-plugin-electron: "npm:^0.15.5"
@@ -9945,7 +10000,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ora@npm:^5.4.1":
+"ora@npm:^5.3.0, ora@npm:^5.4.1":
   version: 5.4.1
   resolution: "ora@npm:5.4.1"
   dependencies:
@@ -10156,6 +10211,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"pirates@npm:^3.0.2":
+  version: 3.0.2
+  resolution: "pirates@npm:3.0.2"
+  dependencies:
+    node-modules-regexp: "npm:^1.0.0"
+  checksum: 9350e4a088c27b071c1a8dedc58661190ff1f4c562ce4313bc6a3dc5e2204238c6ee991c0aa4d72bb3f658a4a18fe65e5ec88a311802484b3b8ba8c8b111e3e2
+  languageName: node
+  linkType: hard
+
 "pirates@npm:^4.0.4":
   version: 4.0.6
   resolution: "pirates@npm:4.0.6"
@@ -10371,13 +10435,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"punycode@npm:^1.4.1":
-  version: 1.4.1
-  resolution: "punycode@npm:1.4.1"
-  checksum: af2700dde1a116791ff8301348ff344c47d6c224e875057237d1b5112035655fb07a6175cfdb8bf0e3a8cdfd2dc82b3a622e0aefd605566c0e949a6d0d1256a4
-  languageName: node
-  linkType: hard
-
 "punycode@npm:^2.1.0, punycode@npm:^2.1.1":
   version: 2.3.0
   resolution: "punycode@npm:2.3.0"
@@ -10392,15 +10449,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"qs@npm:^6.11.2":
-  version: 6.11.2
-  resolution: "qs@npm:6.11.2"
-  dependencies:
-    side-channel: "npm:^1.0.4"
-  checksum: f2321d0796664d0f94e92447ccd3bdfd6b6f3a50b6b762aa79d7f5b1ea3a7a9f94063ba896b82bc2a877ed6a7426d4081e4f16568fdb04f0ee188cca9d8505b4
-  languageName: node
-  linkType: hard
-
 "querystringify@npm:^2.1.1":
   version: 2.2.0
   resolution: "querystringify@npm:2.2.0"
@@ -11270,6 +11318,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"simple-git@npm:^3.18.0":
+  version: 3.22.0
+  resolution: "simple-git@npm:3.22.0"
+  dependencies:
+    "@kwsites/file-exists": "npm:^1.1.1"
+    "@kwsites/promise-deferred": "npm:^1.1.1"
+    debug: "npm:^4.3.4"
+  checksum: 309e7f0b73550f99949c0c6cfd4b4799ec0452fc4835dc440f89ec9351fe553c979c4e2bf7a772308e608697d3a27512281fbc64df0328a73607641f389b0aaf
+  languageName: node
+  linkType: hard
+
 "simple-update-notifier@npm:2.0.0":
   version: 2.0.0
   resolution: "simple-update-notifier@npm:2.0.0"
@@ -11833,6 +11892,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"term-size@npm:^2.2.1":
+  version: 2.2.1
+  resolution: "term-size@npm:2.2.1"
+  checksum: f96aca2d4139c91e3359f5949ffb86f0a58f8c254ab7fe4a64b65126974939c782db6aaa91bf51a56d0344e505e22f9a0186f2f689e23ac9382b54606603c537
+  languageName: node
+  linkType: hard
+
 "test-exclude@npm:^6.0.0":
   version: 6.0.0
   resolution: "test-exclude@npm:6.0.0"
@@ -12256,6 +12322,33 @@ __metadata:
   languageName: node
   linkType: hard
 
+"unimported@npm:^1.31.1":
+  version: 1.31.1
+  resolution: "unimported@npm:1.31.1"
+  dependencies:
+    "@typescript-eslint/parser": "npm:^6.7.3"
+    "@typescript-eslint/typescript-estree": "npm:^6.7.3"
+    chalk: "npm:^4.1.0"
+    cosmiconfig: "npm:^8.3.6"
+    debug: "npm:^4.3.2"
+    file-entry-cache: "npm:^6.0.1"
+    flow-remove-types: "npm:2.156.0"
+    glob: "npm:^7.1.6"
+    ignore: "npm:^5.2.4"
+    json5: "npm:^2.2.0"
+    ora: "npm:^5.3.0"
+    read-pkg-up: "npm:^7.0.1"
+    resolve: "npm:^1.20.0"
+    simple-git: "npm:^3.18.0"
+    term-size: "npm:^2.2.1"
+    typescript: "npm:^5.2.2"
+    yargs: "npm:^16.2.0"
+  bin:
+    unimported: bin/unimported.js
+  checksum: 3f4e28f50557c5fa230724c94b08cd405ff5c8dd07108d6b8e9bb01c768fef3f369840eb76bc0bce3375a4ab8ee2bb5bd7d5cb3d11b5bfc00e1addf88cbbaa20
+  languageName: node
+  linkType: hard
+
 "unique-filename@npm:^3.0.0":
   version: 3.0.0
   resolution: "unique-filename@npm:3.0.0"
@@ -12346,16 +12439,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"url@npm:^0.11.3":
-  version: 0.11.3
-  resolution: "url@npm:0.11.3"
-  dependencies:
-    punycode: "npm:^1.4.1"
-    qs: "npm:^6.11.2"
-  checksum: a3a5ba64d8afb4dda111355d94073a9754b88b1de4035554c398b75f3e4d4244d5e7ae9e4554f0d91be72efd416aedbb646fbb1f3dd4cacecca45ed6c9b75145
-  languageName: node
-  linkType: hard
-
 "use-sync-external-store@npm:^1.0.0":
   version: 1.2.0
   resolution: "use-sync-external-store@npm:1.2.0"
@@ -12533,6 +12616,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"vlq@npm:^0.2.1":
+  version: 0.2.3
+  resolution: "vlq@npm:0.2.3"
+  checksum: 2231d8caeb5b2c1a438677ab029e9a94aa6fb61ab05819c72691b792aea0456dab29576aff5ae29309ee45bad0a309e832dc45173119bca1393f3b87709d8f8d
+  languageName: node
+  linkType: hard
+
 "w3c-xmlserializer@npm:^4.0.0":
   version: 4.0.0
   resolution: "w3c-xmlserializer@npm:4.0.0"
@@ -12835,7 +12925,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"yargs-parser@npm:^20.2.3":
+"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3":
   version: 20.2.9
   resolution: "yargs-parser@npm:20.2.9"
   checksum: 0188f430a0f496551d09df6719a9132a3469e47fe2747208b1dd0ab2bb0c512a95d0b081628bbca5400fb20dbf2fabe63d22badb346cecadffdd948b049f3fcc
@@ -12849,6 +12939,21 @@ __metadata:
   languageName: node
   linkType: hard
 
+"yargs@npm:^16.2.0":
+  version: 16.2.0
+  resolution: "yargs@npm:16.2.0"
+  dependencies:
+    cliui: "npm:^7.0.2"
+    escalade: "npm:^3.1.1"
+    get-caller-file: "npm:^2.0.5"
+    require-directory: "npm:^2.1.1"
+    string-width: "npm:^4.2.0"
+    y18n: "npm:^5.0.5"
+    yargs-parser: "npm:^20.2.2"
+  checksum: 807fa21211d2117135d557f95fcd3c3d390530cda2eca0c840f1d95f0f40209dcfeb5ec18c785a1f3425896e623e3b2681e8bb7b6600060eda1c3f4804e7957e
+  languageName: node
+  linkType: hard
+
 "yargs@npm:^17.0.0, yargs@npm:^17.3.1, yargs@npm:^17.6.2, yargs@npm:^17.7.2":
   version: 17.7.2
   resolution: "yargs@npm:17.7.2"


Test patch:
diff --git a/src/ElectronBackend/input/__tests__/importFromFile.test.ts b/src/ElectronBackend/input/__tests__/importFromFile.test.ts
index 1a2aacb2..36eabe14 100644
--- a/src/ElectronBackend/input/__tests__/importFromFile.test.ts
+++ b/src/ElectronBackend/input/__tests__/importFromFile.test.ts
@@ -7,7 +7,6 @@ import { BrowserWindow, dialog } from 'electron';
 import * as zlib from 'zlib';
 
 import { EMPTY_PROJECT_METADATA } from '../../../Frontend/shared-constants';
-import { faker } from '../../../shared/Faker';
 import { AllowedFrontendChannels } from '../../../shared/ipc-channels';
 import {
   Criticality,
@@ -17,6 +16,7 @@ import {
   ParsedFileContent,
 } from '../../../shared/shared-types';
 import { writeFile, writeOpossumFile } from '../../../shared/write-file';
+import { faker } from '../../../testing/Faker';
 import {
   getGlobalBackendState,
   setGlobalBackendState,
diff --git a/src/ElectronBackend/input/__tests__/parseFile.test.ts b/src/ElectronBackend/input/__tests__/parseFile.test.ts
index bbaf5b21..b0db1a89 100644
--- a/src/ElectronBackend/input/__tests__/parseFile.test.ts
+++ b/src/ElectronBackend/input/__tests__/parseFile.test.ts
@@ -6,8 +6,8 @@ import { cloneDeep, set } from 'lodash';
 import { NIL as uuidNil } from 'uuid';
 import zlib from 'zlib';
 
-import { faker } from '../../../shared/Faker';
 import { writeFile, writeOpossumFile } from '../../../shared/write-file';
+import { faker } from '../../../testing/Faker';
 import {
   OpossumOutputFile,
   ParsedOpossumInputAndOutput,
diff --git a/src/ElectronBackend/main/__tests__/listeners.test.ts b/src/ElectronBackend/main/__tests__/listeners.test.ts
index 162ba04f..aadcff61 100644
--- a/src/ElectronBackend/main/__tests__/listeners.test.ts
+++ b/src/ElectronBackend/main/__tests__/listeners.test.ts
@@ -8,7 +8,6 @@ import { strFromU8, unzip } from 'fflate';
 import fs from 'fs';
 
 import { EMPTY_PROJECT_METADATA } from '../../../Frontend/shared-constants';
-import { faker } from '../../../shared/Faker';
 import {
   AllowedFrontendChannels,
   IpcChannel,
@@ -22,6 +21,7 @@ import {
   PackageInfo,
 } from '../../../shared/shared-types';
 import { writeFile } from '../../../shared/write-file';
+import { faker } from '../../../testing/Faker';
 import { loadInputAndOutputFromFilePath } from '../../input/importFromFile';
 import { writeCsvToFile } from '../../output/writeCsvToFile';
 import { writeSpdxFile } from '../../output/writeSpdxFile';
diff --git a/src/ElectronBackend/output/__tests__/writeCsvToFile.test.ts b/src/ElectronBackend/output/__tests__/writeCsvToFile.test.ts
index 9a67946e..bab67cb5 100644
--- a/src/ElectronBackend/output/__tests__/writeCsvToFile.test.ts
+++ b/src/ElectronBackend/output/__tests__/writeCsvToFile.test.ts
@@ -4,11 +4,11 @@
 // SPDX-License-Identifier: Apache-2.0
 import * as fs from 'fs';
 
-import { faker } from '../../../shared/Faker';
 import {
   Attributions,
   AttributionsWithResources,
 } from '../../../shared/shared-types';
+import { faker } from '../../../testing/Faker';
 import { KeysOfAttributionInfo } from '../../types/types';
 import { getHeadersFromColumns, writeCsvToFile } from '../writeCsvToFile';
 
diff --git a/src/ElectronBackend/output/__tests__/writeSpdxFile.test.ts b/src/ElectronBackend/output/__tests__/writeSpdxFile.test.ts
index 4f5bc321..76c963d9 100644
--- a/src/ElectronBackend/output/__tests__/writeSpdxFile.test.ts
+++ b/src/ElectronBackend/output/__tests__/writeSpdxFile.test.ts
@@ -4,8 +4,8 @@
 // SPDX-License-Identifier: Apache-2.0
 import fs from 'fs';
 
-import { faker } from '../../../shared/Faker';
 import { Attributions, ExportType } from '../../../shared/shared-types';
+import { faker } from '../../../testing/Faker';
 import { writeSpdxFile } from '../writeSpdxFile';
 
 describe('writeSpdxFile', () => {
diff --git a/src/Frontend/Components/AttributionColumn/__tests__/AttributionColumn.test.tsx b/src/Frontend/Components/AttributionColumn/__tests__/AttributionColumn.test.tsx
index 9c0637f5..3bc18c3f 100644
--- a/src/Frontend/Components/AttributionColumn/__tests__/AttributionColumn.test.tsx
+++ b/src/Frontend/Components/AttributionColumn/__tests__/AttributionColumn.test.tsx
@@ -7,7 +7,6 @@ import { screen } from '@testing-library/react';
 import userEvent from '@testing-library/user-event';
 import { noop } from 'lodash';
 
-import { faker } from '../../../../shared/Faker';
 import {
   Attributions,
   DiscreteConfidence,
@@ -19,6 +18,7 @@ import {
   SaveFileArgs,
 } from '../../../../shared/shared-types';
 import { text } from '../../../../shared/text';
+import { faker } from '../../../../testing/Faker';
 import { AttributionType } from '../../../enums/enums';
 import {
   setFrequentLicenses,
diff --git a/src/Frontend/Components/Autocomplete/__tests__/Autocomplete.test.tsx b/src/Frontend/Components/Autocomplete/__tests__/Autocomplete.test.tsx
index 37c2de10..febc096c 100644
--- a/src/Frontend/Components/Autocomplete/__tests__/Autocomplete.test.tsx
+++ b/src/Frontend/Components/Autocomplete/__tests__/Autocomplete.test.tsx
@@ -6,7 +6,7 @@ import { screen, within } from '@testing-library/react';
 import userEvent from '@testing-library/user-event';
 import { isEqual } from 'lodash';
 
-import { faker } from '../../../../shared/Faker';
+import { faker } from '../../../../testing/Faker';
 import { renderComponent } from '../../../test-helpers/render';
 import { Autocomplete } from '../Autocomplete';
 
diff --git a/src/Frontend/Components/ConfirmationDialog/__test__/ConfirmationDialog.test.tsx b/src/Frontend/Components/ConfirmationDialog/__test__/ConfirmationDialog.test.tsx
index c181dbf9..2ec7eceb 100644
--- a/src/Frontend/Components/ConfirmationDialog/__test__/ConfirmationDialog.test.tsx
+++ b/src/Frontend/Components/ConfirmationDialog/__test__/ConfirmationDialog.test.tsx
@@ -5,7 +5,7 @@
 import { screen, waitFor } from '@testing-library/react';
 import userEvent from '@testing-library/user-event';
 
-import { faker } from '../../../../shared/Faker';
+import { faker } from '../../../../testing/Faker';
 import { ButtonText } from '../../../enums/enums';
 import { renderComponent } from '../../../test-helpers/render';
 import {
diff --git a/src/Frontend/Components/Filter/__tests__/FilterMultiSelect.util.test.ts b/src/Frontend/Components/Filter/__tests__/FilterMultiSelect.util.test.ts
index 306dd4bd..c22109be 100644
--- a/src/Frontend/Components/Filter/__tests__/FilterMultiSelect.util.test.ts
+++ b/src/Frontend/Components/Filter/__tests__/FilterMultiSelect.util.test.ts
@@ -2,8 +2,8 @@
 // SPDX-FileCopyrightText: TNG Technology Consulting GmbH <https://www.tngtech.com>
 //
 // SPDX-License-Identifier: Apache-2.0
-import { faker } from '../../../../shared/Faker';
 import { Attributions, FollowUp } from '../../../../shared/shared-types';
+import { faker } from '../../../../testing/Faker';
 import { setManualData } from '../../../state/actions/resource-actions/all-views-simple-actions';
 import { setVariable } from '../../../state/actions/variables-actions/variables-actions';
 import { renderHook } from '../../../test-helpers/render';
diff --git a/src/Frontend/Components/MenuButton/__tests__/MenuButton.test.tsx b/src/Frontend/Components/MenuButton/__tests__/MenuButton.test.tsx
index a933e244..ba619db4 100644
--- a/src/Frontend/Components/MenuButton/__tests__/MenuButton.test.tsx
+++ b/src/Frontend/Components/MenuButton/__tests__/MenuButton.test.tsx
@@ -5,7 +5,7 @@
 import { render, screen } from '@testing-library/react';
 import userEvent from '@testing-library/user-event';
 
-import { faker } from '../../../../shared/Faker';
+import { faker } from '../../../../testing/Faker';
 import { ContextMenuItem } from '../../ContextMenu/ContextMenu';
 import { MenuButton } from '../MenuButton';
 
diff --git a/src/Frontend/Components/ProcessPopup/__tests__/ProcessPopup.test.tsx b/src/Frontend/Components/ProcessPopup/__tests__/ProcessPopup.test.tsx
index 713729df..16bdfacb 100644
--- a/src/Frontend/Components/ProcessPopup/__tests__/ProcessPopup.test.tsx
+++ b/src/Frontend/Components/ProcessPopup/__tests__/ProcessPopup.test.tsx
@@ -6,10 +6,10 @@ import { act, screen, within } from '@testing-library/react';
 import { IpcRendererEvent } from 'electron';
 import { noop } from 'lodash';
 
-import { faker } from '../../../../shared/Faker';
 import { AllowedFrontendChannels } from '../../../../shared/ipc-channels';
 import { ElectronAPI, Log } from '../../../../shared/shared-types';
 import { text } from '../../../../shared/text';
+import { faker } from '../../../../testing/Faker';
 import { renderComponent } from '../../../test-helpers/render';
 import { ProcessPopup } from '../ProcessPopup';
 
diff --git a/src/Frontend/Components/SearchTextField/__tests__/SearchTextField.test.tsx b/src/Frontend/Components/SearchTextField/__tests__/SearchTextField.test.tsx
index 3f5ff5fc..49b4bc8e 100644
--- a/src/Frontend/Components/SearchTextField/__tests__/SearchTextField.test.tsx
+++ b/src/Frontend/Components/SearchTextField/__tests__/SearchTextField.test.tsx
@@ -5,7 +5,7 @@
 import { screen } from '@testing-library/react';
 import userEvent from '@testing-library/user-event';
 
-import { faker } from '../../../../shared/Faker';
+import { faker } from '../../../../testing/Faker';
 import { renderComponent } from '../../../test-helpers/render';
 import { SearchTextField } from '../SearchTextField';
 
diff --git a/src/Frontend/Components/SplitButton/__tests__/SplitButton.test.tsx b/src/Frontend/Components/SplitButton/__tests__/SplitButton.test.tsx
index c899da39..959799ed 100644
--- a/src/Frontend/Components/SplitButton/__tests__/SplitButton.test.tsx
+++ b/src/Frontend/Components/SplitButton/__tests__/SplitButton.test.tsx
@@ -5,7 +5,7 @@
 import { render, screen } from '@testing-library/react';
 import userEvent from '@testing-library/user-event';
 
-import { faker } from '../../../../shared/Faker';
+import { faker } from '../../../../testing/Faker';
 import { ContextMenuItem } from '../../ContextMenu/ContextMenu';
 import { SplitButton } from '../SplitButton';
 
diff --git a/src/Frontend/Components/UpdateAppPopup/__tests__/UpdateAppPopup.test.tsx b/src/Frontend/Components/UpdateAppPopup/__tests__/UpdateAppPopup.test.tsx
index 051228c1..099940a1 100644
--- a/src/Frontend/Components/UpdateAppPopup/__tests__/UpdateAppPopup.test.tsx
+++ b/src/Frontend/Components/UpdateAppPopup/__tests__/UpdateAppPopup.test.tsx
@@ -5,8 +5,8 @@
 import { screen } from '@testing-library/react';
 
 import commitInfo from '../../../../commitInfo.json';
-import { faker } from '../../../../shared/Faker';
 import { text } from '../../../../shared/text';
+import { faker } from '../../../../testing/Faker';
 import { renderComponent } from '../../../test-helpers/render';
 import { UpdateAppPopup } from '../UpdateAppPopup';
 import * as util from '../UpdateAppPopup.util';
diff --git a/src/Frontend/state/actions/resource-actions/__tests__/preference-actions.test.ts b/src/Frontend/state/actions/resource-actions/__tests__/preference-actions.test.ts
index 04fde5ea..d8746618 100644
--- a/src/Frontend/state/actions/resource-actions/__tests__/preference-actions.test.ts
+++ b/src/Frontend/state/actions/resource-actions/__tests__/preference-actions.test.ts
@@ -2,8 +2,8 @@
 // SPDX-FileCopyrightText: TNG Technology Consulting GmbH <https://www.tngtech.com>
 //
 // SPDX-License-Identifier: Apache-2.0
-import { faker } from '../../../../../shared/Faker';
 import { Resources } from '../../../../../shared/shared-types';
+import { faker } from '../../../../../testing/Faker';
 import { getOriginIdsToPreferOver } from '../preference-actions';
 
 describe('getOriginIdsToPreferOver', () => {
diff --git a/src/Frontend/state/helpers/__tests__/load-action-helpers.test.ts b/src/Frontend/state/helpers/__tests__/load-action-helpers.test.ts
deleted file mode 100644
index dbb4094a..00000000
--- a/src/Frontend/state/helpers/__tests__/load-action-helpers.test.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-// SPDX-FileCopyrightText: Meta Platforms, Inc. and its affiliates
-// SPDX-FileCopyrightText: TNG Technology Consulting GmbH <https://www.tngtech.com>
-//
-// SPDX-License-Identifier: Apache-2.0
-import { Attributions } from '../../../../shared/shared-types';
-import { createExternalAttributionsToHashes } from '../load-action-helpers';
-
-describe('createExternalAttributionsToHashes', () => {
-  it('yields correct results', () => {
-    const testExternalAttributions: Attributions = {
-      uuid1: {
-        attributionConfidence: 1,
-        comment: 'comment1',
-        packageName: 'name',
-        originIds: ['abc'],
-        preSelected: true,
-      },
-      uuid2: {
-        attributionConfidence: 2,
-        comment: 'comment2',
-        packageName: 'name',
-        originIds: ['def'],
-        preSelected: false,
-      },
-      uuid3: {
-        packageName: 'name',
-      },
-      uuid4: {
-        licenseName: '',
-        firstParty: true,
-      },
-      uuid5: {
-        firstParty: true,
-      },
-      uuid6: {
-        packageName: '',
-      },
-      uuid7: {
-        firstParty: false,
-      },
-    };
-
-    const testExternalAttributionsToHashes = createExternalAttributionsToHashes(
-      testExternalAttributions,
-    );
-
-    expect(testExternalAttributionsToHashes.uuid1).toBeDefined();
-    expect(testExternalAttributionsToHashes.uuid2).toBeDefined();
-    expect(testExternalAttributionsToHashes.uuid3).toBeDefined();
-    expect(testExternalAttributionsToHashes.uuid4).toBeDefined();
-    expect(testExternalAttributionsToHashes.uuid5).toBeDefined();
-    expect(testExternalAttributionsToHashes.uuid6).toBeUndefined();
-    expect(testExternalAttributionsToHashes.uuid7).toBeUndefined();
-
-    expect(testExternalAttributionsToHashes.uuid1).toEqual(
-      testExternalAttributionsToHashes.uuid2,
-    );
-    expect(testExternalAttributionsToHashes.uuid1).toEqual(
-      testExternalAttributionsToHashes.uuid3,
-    );
-    expect(testExternalAttributionsToHashes.uuid1).not.toEqual(
-      testExternalAttributionsToHashes.uuid4,
-    );
-    expect(testExternalAttributionsToHashes.uuid4).toEqual(
-      testExternalAttributionsToHashes.uuid5,
-    );
-  });
-});
diff --git a/src/Frontend/util/__tests__/package-search-api.test.ts b/src/Frontend/util/__tests__/package-search-api.test.ts
index 220c42f1..4faaf961 100644
--- a/src/Frontend/util/__tests__/package-search-api.test.ts
+++ b/src/Frontend/util/__tests__/package-search-api.test.ts
@@ -4,12 +4,12 @@
 // SPDX-License-Identifier: Apache-2.0
 import { difference } from 'lodash';
 
-import { faker } from '../../../shared/Faker';
 import {
   AutocompleteSignal,
   DisplayPackageInfo,
 } from '../../../shared/shared-types';
 import { text } from '../../../shared/text';
+import { faker } from '../../../testing/Faker';
 import { RequestProps } from '../http-client';
 import {
   PackageSearchApi,
diff --git a/src/Frontend/util/__tests__/use-user-setting.test.ts b/src/Frontend/util/__tests__/use-user-setting.test.ts
index df14cb23..ccb4623c 100644
--- a/src/Frontend/util/__tests__/use-user-setting.test.ts
+++ b/src/Frontend/util/__tests__/use-user-setting.test.ts
@@ -4,8 +4,8 @@
 // SPDX-License-Identifier: Apache-2.0
 import { act, waitFor } from '@testing-library/react';
 
-import { faker } from '../../../shared/Faker';
 import { ElectronAPI } from '../../../shared/shared-types';
+import { faker } from '../../../testing/Faker';
 import { renderHook } from '../../test-helpers/render';
 import { useUserSetting } from '../use-user-setting';
 
diff --git a/src/Frontend/util/__tests__/use-variable.test.ts b/src/Frontend/util/__tests__/use-variable.test.ts
index 4232c12f..601e9c79 100644
--- a/src/Frontend/util/__tests__/use-variable.test.ts
+++ b/src/Frontend/util/__tests__/use-variable.test.ts
@@ -4,7 +4,7 @@
 // SPDX-License-Identifier: Apache-2.0
 import { act } from '@testing-library/react';
 
-import { faker } from '../../../shared/Faker';
+import { faker } from '../../../testing/Faker';
 import { renderHook } from '../../test-helpers/render';
 import { useVariable } from '../use-variable';
 
diff --git a/src/Frontend/web-workers/__tests__/signals-worker.test.ts b/src/Frontend/web-workers/__tests__/signals-worker.test.ts
index 0575f725..4e47f3bf 100644
--- a/src/Frontend/web-workers/__tests__/signals-worker.test.ts
+++ b/src/Frontend/web-workers/__tests__/signals-worker.test.ts
@@ -2,7 +2,7 @@
 // SPDX-FileCopyrightText: TNG Technology Consulting GmbH <https://www.tngtech.com>
 //
 // SPDX-License-Identifier: Apache-2.0
-import { faker } from '../../../shared/Faker';
+import { faker } from '../../../testing/Faker';
 import { SignalsWorker, SignalsWorkerOutput } from '../signals-worker';
 
 describe('SignalsWorker', () => {
diff --git a/src/Frontend/web-workers/__tests__/use-signals-worker.test.ts b/src/Frontend/web-workers/__tests__/use-signals-worker.test.ts
index 1b9894be..c8f9cada 100644
--- a/src/Frontend/web-workers/__tests__/use-signals-worker.test.ts
+++ b/src/Frontend/web-workers/__tests__/use-signals-worker.test.ts
@@ -4,7 +4,7 @@
 // SPDX-License-Identifier: Apache-2.0
 import { act } from '@testing-library/react';
 
-import { faker } from '../../../shared/Faker';
+import { faker } from '../../../testing/Faker';
 import { View } from '../../enums/enums';
 import { setProjectMetadata } from '../../state/actions/resource-actions/all-views-simple-actions';
 import { setSelectedResourceId } from '../../state/actions/resource-actions/audit-view-simple-actions';
diff --git a/src/Frontend/web-workers/scripts/__tests__/get-autocomplete-signals.test.ts b/src/Frontend/web-workers/scripts/__tests__/get-autocomplete-signals.test.ts
index f7afc83e..e5cd3f1b 100644
--- a/src/Frontend/web-workers/scripts/__tests__/get-autocomplete-signals.test.ts
+++ b/src/Frontend/web-workers/scripts/__tests__/get-autocomplete-signals.test.ts
@@ -2,8 +2,8 @@
 // SPDX-FileCopyrightText: TNG Technology Consulting GmbH <https://www.tngtech.com>
 //
 // SPDX-License-Identifier: Apache-2.0
-import { faker } from '../../../../shared/Faker';
 import { AutocompleteSignal } from '../../../../shared/shared-types';
+import { faker } from '../../../../testing/Faker';
 import { EMPTY_DISPLAY_PACKAGE_INFO } from '../../../shared-constants';
 import { getAutocompleteSignals } from '../get-autocomplete-signals';
 
diff --git a/src/e2e-tests/__tests__/open-file-warnings.test.ts b/src/e2e-tests/__tests__/open-file-warnings.test.ts
index c884bb05..7783fb2e 100644
--- a/src/e2e-tests/__tests__/open-file-warnings.test.ts
+++ b/src/e2e-tests/__tests__/open-file-warnings.test.ts
@@ -2,7 +2,7 @@
 // SPDX-FileCopyrightText: TNG Technology Consulting GmbH <https://www.tngtech.com>
 //
 // SPDX-License-Identifier: Apache-2.0
-import { faker } from '../../shared/Faker';
+import { faker } from '../../testing/Faker';
 import { test } from '../utils';
 
 const [resourceName1, resourceName2] = faker.opossum.resourceNames({
diff --git a/src/e2e-tests/page-objects/FileSearchPopup.ts b/src/e2e-tests/page-objects/FileSearchPopup.ts
index 39a4c9c9..494b9487 100644
--- a/src/e2e-tests/page-objects/FileSearchPopup.ts
+++ b/src/e2e-tests/page-objects/FileSearchPopup.ts
@@ -4,7 +4,7 @@
 // SPDX-License-Identifier: Apache-2.0
 import { expect, type Locator, type Page } from '@playwright/test';
 
-import { faker } from '../../shared/Faker';
+import { faker } from '../../testing/Faker';
 
 export class FileSearchPopup {
   private readonly node: Locator;
diff --git a/src/e2e-tests/utils/fixtures.ts b/src/e2e-tests/utils/fixtures.ts
index 7f464436..7c16b04b 100644
--- a/src/e2e-tests/utils/fixtures.ts
+++ b/src/e2e-tests/utils/fixtures.ts
@@ -46,7 +46,6 @@ interface OpossumData {
   decompress?: boolean;
 }
 
-export { expect } from '@playwright/test';
 export const test = base.extend<{
   window: Page & { app: ElectronApplication };
   /** Specify the input/output data contained in the opossum file which the app will open as part of the test. */
diff --git a/src/e2e-tests/utils/index.ts b/src/e2e-tests/utils/index.ts
index e29a3bb9..d8b20f9d 100644
--- a/src/e2e-tests/utils/index.ts
+++ b/src/e2e-tests/utils/index.ts
@@ -2,7 +2,7 @@
 // SPDX-FileCopyrightText: TNG Technology Consulting GmbH <https://www.tngtech.com>
 //
 // SPDX-License-Identifier: Apache-2.0
-export * from '../../shared/Faker';
+export * from '../../testing/Faker';
 export * from './fixtures';
 export * from './retry';
 
diff --git a/src/shared/global-test-setup.ts b/src/testing/global-test-setup.ts
similarity index 100%
rename from src/shared/global-test-setup.ts
rename to src/testing/global-test-setup.ts
diff --git a/src/shared/global-test-teardown.ts b/src/testing/global-test-teardown.ts
similarity index 100%
rename from src/shared/global-test-teardown.ts
rename to src/testing/global-test-teardown.ts
diff --git a/src/shared/setup-tests.ts b/src/testing/setup-tests.ts
similarity index 97%
rename from src/shared/setup-tests.ts
rename to src/testing/setup-tests.ts
index 44cb233a..7811100b 100644
--- a/src/shared/setup-tests.ts
+++ b/src/testing/setup-tests.ts
@@ -6,8 +6,8 @@
 import '@testing-library/jest-dom';
 import { noop } from 'lodash';
 
+import { ElectronAPI } from '../shared/shared-types';
 import { faker } from './Faker';
-import { ElectronAPI } from './shared-types';
 
 // We suppress the recharts warning that is due to our mocking in tests.
 const SUBSTRINGS_TO_SUPPRESS_IN_CONSOLE_WARN = [