From 3ee2448404f167f1d8d761c793e9f68dd5451ec9 Mon Sep 17 00:00:00 2001 From: Helene Lotsberg Date: Thu, 15 Oct 2026 15:03:47 +0200 Subject: [PATCH 1/4] Restructure test files and clean up Vitest config --- frontend/coverage/MyMatchesPage.css.html | 420 ------------------ frontend/coverage/MyMatchesPage.tsx.html | 255 ----------- frontend/eslint.config.js | 2 +- frontend/setupTests.ts | 1 - .../MyMatchesPage.test.tsx | 2 +- .../tests/__snapshots__/Profile.test.tsx.snap | 212 --------- frontend/src/tests/setup.ts | 6 + .../src/tests/test_profile/Profile.test.tsx | 76 ---- frontend/vitest.config.ts | 10 - 9 files changed, 8 insertions(+), 976 deletions(-) delete mode 100644 frontend/coverage/MyMatchesPage.css.html delete mode 100644 frontend/coverage/MyMatchesPage.tsx.html delete mode 100644 frontend/setupTests.ts rename frontend/src/{test_my_matches => tests}/MyMatchesPage.test.tsx (96%) delete mode 100644 frontend/src/tests/test_profile/Profile.test.tsx delete mode 100644 frontend/vitest.config.ts diff --git a/frontend/coverage/MyMatchesPage.css.html b/frontend/coverage/MyMatchesPage.css.html deleted file mode 100644 index ea43f1d1..00000000 --- a/frontend/coverage/MyMatchesPage.css.html +++ /dev/null @@ -1,420 +0,0 @@ - - - - Code coverage report for MyMatchesPage.css - - - - - - - - - -
-
-

All files MyMatchesPage.css

-
-
- 0% - Statements - 0/0 -
- -
- 0% - Branches - 0/0 -
- -
- 0% - Functions - 0/0 -
- -
- 0% - Lines - 0/0 -
-
-

- Press n or j to go to the next uncovered block, - b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
.my-matches-page {
-  margin-left: var(--sidebar-width);
-  width: calc(100% - var(--sidebar-width));
-  min-height: 100vh;
-  padding: 40px;
-  box-sizing: border-box;
- 
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  gap: 30px;
- 
-  font-family: Georgia, serif;
-}
- 
-.plant-scroll-container {
-  display: flex;
-  align-items: center;
-  gap: 10px;
-  width: 100%;
-}
- 
-.scroll-bar {
-  display: flex;
-  flex-direction: row;
-  gap: 20px;
- 
-  overflow-x: scroll;
-  scroll-behavior: smooth;
- 
-  padding: 10px;
-  padding-bottom: 25px;
- 
-  flex: 1;
-}
- 
-.scroll-bar::-webkit-scrollbar {
-  height: 8px;
-}
- 
-.scroll-bar::-webkit-scrollbar-thumb {
-  background: var(--accent-green);
-  border-radius: 10px;
-}
- 
-.plant-card-placeholder {
-  flex: 0 0 350px;
-  height: 500px;
- 
-  border-radius: 12px;
-  overflow: hidden;
- 
-  background-color: var(--background);
-}
-.scroll-button {
-  height: 50px;
-  width: 50px;
- 
-  display: flex;
-  justify-content: center;
-  align-items: center;
- 
-  background-color: transparent;
-  border: none;
- 
-  color: var(--accent-green);
-  font-size: 30px;
- 
-  cursor: pointer;
-}
- 
-.scroll-button:hover {
-  transform: scale(1.1);
-}
- 
-@media (max-width: 767px) {
-  .my-matches-page {
-    margin-left: 0;
-    width: 100%;
-    padding: 20px;
-    gap: 20px;
-  }
- 
-  .my-matches-page h2 {
-    font-size: 28px;
-    text-align: center;
-    white-space: nowrap;
-    font-family: Georgia, serif;
-  }
- 
-  .plant-scroll-container {
-    width: 100%;
-    gap: 5px;
-  }
- 
-  .scroll-bar {
-    gap: 15px;
-    padding: 5px;
-    padding-bottom: 20px;
-  }
- 
-  .plant-card-placeholder {
-    flex: 0 0 200px;
-    height: 300px;
-  }
- 
-  .scroll-button {
-    width: 35px;
-    height: 35px;
-    font-size: 22px;
-  }
-}
- 
- -
- -
- - - - - - - - diff --git a/frontend/coverage/MyMatchesPage.tsx.html b/frontend/coverage/MyMatchesPage.tsx.html deleted file mode 100644 index 701a79e9..00000000 --- a/frontend/coverage/MyMatchesPage.tsx.html +++ /dev/null @@ -1,255 +0,0 @@ - - - - Code coverage report for MyMatchesPage.tsx - - - - - - - - - -
-
-

All files MyMatchesPage.tsx

-
-
- 100% - Statements - 8/8 -
- -
- 100% - Branches - 0/0 -
- -
- 100% - Functions - 4/4 -
- -
- 100% - Lines - 8/8 -
-
-

- Press n or j to go to the next uncovered block, - b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58  -  -  -  -4x -  -4x -  -  -  -  -  -  -  -  -4x -1x -  -  -  -  -  -4x -1x -  -  -  -  -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -24x -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useTranslation } from "react-i18next";
-import "./MyMatchesPage.css";
- 
-function MyMatchesPage() {
-  const { t } = useTranslation();
- 
-  const plants = [
-    { name: "Hydrangea" },
-    { name: "Orchid" },
-    { name: "Fig Tree" },
-    { name: "Monstera" },
-    { name: "Peony" },
-    { name: "Lily" },
-  ];
- 
-  const scrollLeft = () => {
-    document.querySelector(".scroll-bar")?.scrollBy({
-      left: -300,
-      behavior: "smooth",
-    });
-  };
- 
-  const scrollRight = () => {
-    document.querySelector(".scroll-bar")?.scrollBy({
-      left: 300,
-      behavior: "smooth",
-    });
-  };
- 
-  return (
-    <main className="my-matches-page">
-      <section>
-        <h2>{t("myMatchesPage.guide")}</h2>
-      </section>
- 
-      <section className="plant-scroll-container">
-        <button className="scroll-button left-button" onClick={scrollLeft}>
-          ❮
-        </button>
- 
-        <div className="scroll-bar">
-          {plants.map((plant) => (
-            <div className="plant-card-placeholder" key={plant.name}>
-              <p>{plant.name}</p>
-            </div>
-          ))}
-        </div>
- 
-        <button className="scroll-button right-button" onClick={scrollRight}>
-          ❯
-        </button>
-      </section>
-    </main>
-  );
-}
- 
-export default MyMatchesPage;
- 
- -
- -
- - - - - - - - diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js index da6f0265..c0c361f9 100644 --- a/frontend/eslint.config.js +++ b/frontend/eslint.config.js @@ -6,7 +6,7 @@ import tseslint from "typescript-eslint"; import { defineConfig, globalIgnores } from "eslint/config"; export default defineConfig([ - globalIgnores(["dist"]), + globalIgnores(["dist", "coverage"]), { files: ["**/*.{ts,tsx}"], extends: [ diff --git a/frontend/setupTests.ts b/frontend/setupTests.ts deleted file mode 100644 index f149f27a..00000000 --- a/frontend/setupTests.ts +++ /dev/null @@ -1 +0,0 @@ -import "@testing-library/jest-dom/vitest"; diff --git a/frontend/src/test_my_matches/MyMatchesPage.test.tsx b/frontend/src/tests/MyMatchesPage.test.tsx similarity index 96% rename from frontend/src/test_my_matches/MyMatchesPage.test.tsx rename to frontend/src/tests/MyMatchesPage.test.tsx index d9515caa..dbafefea 100644 --- a/frontend/src/test_my_matches/MyMatchesPage.test.tsx +++ b/frontend/src/tests/MyMatchesPage.test.tsx @@ -1,7 +1,7 @@ import { cleanup, fireEvent, render, screen } from "@testing-library/react"; import { afterEach } from "vitest"; import { describe, it, expect, vi } from "vitest"; -import MyMatchesPage from "../pages/MyMatches/MyMatchesPage"; +import MyMatchesPage from "../pages/myMatches/MyMatchesPage"; vi.mock("react-i18next", () => ({ useTranslation: () => ({ diff --git a/frontend/src/tests/__snapshots__/Profile.test.tsx.snap b/frontend/src/tests/__snapshots__/Profile.test.tsx.snap index 8bad26f0..545c64b5 100644 --- a/frontend/src/tests/__snapshots__/Profile.test.tsx.snap +++ b/frontend/src/tests/__snapshots__/Profile.test.tsx.snap @@ -1,217 +1,5 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Profile > matcher snapshot 1`] = ` -
-
-
- profile.imageAlt -
-

- - profile.name -

-

- - profile.description - -

-
-
-
- - -
-
-

- preferences.title -

-
- - - - - - - - - - -
-
-
-
-`; - -exports[`Profile > matches snapshot 1`] = ` -
-
-
- profile.imageAlt -
-

- - profile.name -

-

- - profile.description - -

-
-
-
- - -
-
-

- preferences.title -

-
- - - - - - - - - - -
-
-
-
-`; - exports[`Profile page > matches snapshot 1`] = `
{ + cleanup(); +}); diff --git a/frontend/src/tests/test_profile/Profile.test.tsx b/frontend/src/tests/test_profile/Profile.test.tsx deleted file mode 100644 index ab02b037..00000000 --- a/frontend/src/tests/test_profile/Profile.test.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { render, screen } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; -import { describe, it, expect, vi } from "vitest"; - -import Profile from "../../components/profile/Profile"; - -vi.mock("react-i18next", () => ({ - useTranslation: () => ({ - t: (key: string) => key, - }), -})); - -describe("Profile page", () => { - it("renders profile name", () => { - render(); - - expect( - screen.getByRole("heading", { name: "profile.name" }), - ).toBeInTheDocument(); - }); - - it("renders profile image alt text", () => { - render(); - - expect(screen.getByAltText("profile.imageAlt")).toBeInTheDocument(); - }); - - it("shows the preferences tab by default", () => { - render(); - - expect( - screen.getByRole("button", { name: "profile.preferences" }), - ).toBeInTheDocument(); - - expect( - screen.getByRole("heading", { name: "preferences.title" }), - ).toBeInTheDocument(); - }); - - it("switch to saved plants when button is clicked", async () => { - const user = userEvent.setup(); - - render(); - - await user.click( - screen.getByRole("button", { name: "profile.savedPlants" }), - ); - - expect( - screen.getByRole("heading", { name: /profile.savedPlants/ }), - ).toBeInTheDocument(); - }); - - it("displays saved plants", async () => { - const user = userEvent.setup(); - - render(); - - await user.click( - screen.getByRole("button", { name: "profile.savedPlants" }), - ); - // TODO: replace hardcoded plants with mocked backend data when backend is implemented - expect(screen.getByText("Hydrangea")).toBeInTheDocument(); - expect(screen.getByText("Orchid")).toBeInTheDocument(); - expect(screen.getByText("Fig Tree")).toBeInTheDocument(); - expect(screen.getByText("Monstera")).toBeInTheDocument(); - expect(screen.getByText("Peony")).toBeInTheDocument(); - expect(screen.getByText("Lily")).toBeInTheDocument(); - }); - - it("matches snapshot", () => { - const { container } = render(); - - expect(container).toMatchSnapshot(); - }); -}); diff --git a/frontend/vitest.config.ts b/frontend/vitest.config.ts deleted file mode 100644 index 0c42878e..00000000 --- a/frontend/vitest.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig } from "vitest/config"; -import react from "@vitejs/plugin-react"; - -export default defineConfig({ - plugins: [react()], - test: { - environment: "jsdom", - setupFiles: "./setupTests.ts", - }, -}); From 992635ccfcfc3cfde895ca3fa634d202eea12a7e Mon Sep 17 00:00:00 2001 From: Helene Lotsberg Date: Thu, 15 Oct 2026 15:06:56 +0200 Subject: [PATCH 2/4] Stop tracking coverage --- frontend/coverage/base.css | 362 -------- frontend/coverage/block-navigation.js | 85 -- frontend/coverage/clover.xml | 20 - frontend/coverage/coverage-final.json | 129 --- frontend/coverage/favicon.png | Bin 445 -> 0 bytes frontend/coverage/index.html | 196 ----- frontend/coverage/prettify.css | 101 --- frontend/coverage/prettify.js | 1008 ----------------------- frontend/coverage/sort-arrow-sprite.png | Bin 138 -> 0 bytes frontend/coverage/sorter.js | 209 ----- 10 files changed, 2110 deletions(-) delete mode 100644 frontend/coverage/base.css delete mode 100644 frontend/coverage/block-navigation.js delete mode 100644 frontend/coverage/clover.xml delete mode 100644 frontend/coverage/coverage-final.json delete mode 100644 frontend/coverage/favicon.png delete mode 100644 frontend/coverage/index.html delete mode 100644 frontend/coverage/prettify.css delete mode 100644 frontend/coverage/prettify.js delete mode 100644 frontend/coverage/sort-arrow-sprite.png delete mode 100644 frontend/coverage/sorter.js diff --git a/frontend/coverage/base.css b/frontend/coverage/base.css deleted file mode 100644 index 3fc428ec..00000000 --- a/frontend/coverage/base.css +++ /dev/null @@ -1,362 +0,0 @@ -body, -html { - margin: 0; - padding: 0; - height: 100%; -} -body { - font-family: - Helvetica Neue, - Helvetica, - Arial; - font-size: 14px; - color: #333; -} -.small { - font-size: 12px; -} -*, -*:after, -*:before { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -h1 { - font-size: 20px; - margin: 0; -} -h2 { - font-size: 14px; -} -pre { - font: - 12px/1.4 Consolas, - "Liberation Mono", - Menlo, - Courier, - monospace; - margin: 0; - padding: 0; - -moz-tab-size: 2; - -o-tab-size: 2; - tab-size: 2; -} -a { - color: #0074d9; - text-decoration: none; -} -a:hover { - text-decoration: underline; -} -.strong { - font-weight: bold; -} -.space-top1 { - padding: 10px 0 0 0; -} -.pad2y { - padding: 20px 0; -} -.pad1y { - padding: 10px 0; -} -.pad2x { - padding: 0 20px; -} -.pad2 { - padding: 20px; -} -.pad1 { - padding: 10px; -} -.space-left2 { - padding-left: 55px; -} -.space-right2 { - padding-right: 20px; -} -.center { - text-align: center; -} -.clearfix { - display: block; -} -.clearfix:after { - content: ""; - display: block; - height: 0; - clear: both; - visibility: hidden; -} -.fl { - float: left; -} -@media only screen and (max-width: 640px) { - .col3 { - width: 100%; - max-width: 100%; - } - .hide-mobile { - display: none !important; - } -} - -.quiet { - color: #7f7f7f; - color: rgba(0, 0, 0, 0.5); -} -.quiet a { - opacity: 0.7; -} - -.fraction { - font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; - font-size: 10px; - color: #555; - background: #e8e8e8; - padding: 4px 5px; - border-radius: 3px; - vertical-align: middle; -} - -div.path a:link, -div.path a:visited { - color: #333; -} -table.coverage { - border-collapse: collapse; - margin: 10px 0 0 0; - padding: 0; -} - -table.coverage td { - margin: 0; - padding: 0; - vertical-align: top; -} -table.coverage td.line-count { - text-align: right; - padding: 0 5px 0 20px; -} -table.coverage td.line-coverage { - text-align: right; - padding-right: 10px; - min-width: 20px; -} - -table.coverage td span.cline-any { - display: inline-block; - padding: 0 5px; - width: 100%; -} -.missing-if-branch { - display: inline-block; - margin-right: 5px; - border-radius: 3px; - position: relative; - padding: 0 4px; - background: #333; - color: yellow; -} - -.skip-if-branch { - display: none; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: #ccc; - color: white; -} -.missing-if-branch .typ, -.skip-if-branch .typ { - color: inherit !important; -} -.coverage-summary { - border-collapse: collapse; - width: 100%; -} -.coverage-summary tr { - border-bottom: 1px solid #bbb; -} -.keyline-all { - border: 1px solid #ddd; -} -.coverage-summary td, -.coverage-summary th { - padding: 10px; -} -.coverage-summary tbody { - border: 1px solid #bbb; -} -.coverage-summary td { - border-right: 1px solid #bbb; -} -.coverage-summary td:last-child { - border-right: none; -} -.coverage-summary th { - text-align: left; - font-weight: normal; - white-space: nowrap; -} -.coverage-summary th.file { - border-right: none !important; -} -.coverage-summary th.pct { -} -.coverage-summary th.pic, -.coverage-summary th.abs, -.coverage-summary td.pct, -.coverage-summary td.abs { - text-align: right; -} -.coverage-summary td.file { - white-space: nowrap; -} -.coverage-summary td.pic { - min-width: 120px !important; -} -.coverage-summary tfoot td { -} - -.coverage-summary .sorter { - height: 10px; - width: 7px; - display: inline-block; - margin-left: 0.5em; - background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; -} -.coverage-summary .sorted .sorter { - background-position: 0 -20px; -} -.coverage-summary .sorted-desc .sorter { - background-position: 0 -10px; -} -.status-line { - height: 10px; -} -/* yellow */ -.cbranch-no { - background: yellow !important; - color: #111; -} -/* dark red */ -.red.solid, -.status-line.low, -.low .cover-fill { - background: #c21f39; -} -.low .chart { - border: 1px solid #c21f39; -} -.highlighted, -.highlighted .cstat-no, -.highlighted .fstat-no, -.highlighted .cbranch-no { - background: #c21f39 !important; -} -/* medium red */ -.cstat-no, -.fstat-no, -.cbranch-no, -.cbranch-no { - background: #f6c6ce; -} -/* light red */ -.low, -.cline-no { - background: #fce1e5; -} -/* light green */ -.high, -.cline-yes { - background: rgb(230, 245, 208); -} -/* medium green */ -.cstat-yes { - background: rgb(161, 215, 106); -} -/* dark green */ -.status-line.high, -.high .cover-fill { - background: rgb(77, 146, 33); -} -.high .chart { - border: 1px solid rgb(77, 146, 33); -} -/* dark yellow (gold) */ -.status-line.medium, -.medium .cover-fill { - background: #f9cd0b; -} -.medium .chart { - border: 1px solid #f9cd0b; -} -/* light yellow */ -.medium { - background: #fff4c2; -} - -.cstat-skip { - background: #ddd; - color: #111; -} -.fstat-skip { - background: #ddd; - color: #111 !important; -} -.cbranch-skip { - background: #ddd !important; - color: #111; -} - -span.cline-neutral { - background: #eaeaea; -} - -.coverage-summary td.empty { - opacity: 0.5; - padding-top: 4px; - padding-bottom: 4px; - line-height: 1; - color: #888; -} - -.cover-fill, -.cover-empty { - display: inline-block; - height: 12px; -} -.chart { - line-height: 0; -} -.cover-empty { - background: white; -} -.cover-full { - border-right: none !important; -} -pre.prettyprint { - border: none !important; - padding: 0 !important; - margin: 0 !important; -} -.com { - color: #999 !important; -} -.ignore-none { - color: #999; - font-weight: normal; -} - -.wrapper { - min-height: 100%; - height: auto !important; - height: 100%; - margin: 0 auto -48px; -} -.footer, -.push { - height: 48px; -} diff --git a/frontend/coverage/block-navigation.js b/frontend/coverage/block-navigation.js deleted file mode 100644 index 3ad7125b..00000000 --- a/frontend/coverage/block-navigation.js +++ /dev/null @@ -1,85 +0,0 @@ -/* eslint-disable */ -var jumpToCode = (function init() { - // Classes of code we would like to highlight in the file view - var missingCoverageClasses = [".cbranch-no", ".cstat-no", ".fstat-no"]; - - // Elements to highlight in the file listing view - var fileListingElements = ["td.pct.low"]; - - // We don't want to select elements that are direct descendants of another match - var notSelector = ":not(" + missingCoverageClasses.join("):not(") + ") > "; // becomes `:not(a):not(b) > ` - - // Selector that finds elements on the page to which we can jump - var selector = - fileListingElements.join(", ") + - ", " + - notSelector + - missingCoverageClasses.join(", " + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` - - // The NodeList of matching elements - var missingCoverageElements = document.querySelectorAll(selector); - - var currentIndex; - - function toggleClass(index) { - missingCoverageElements.item(currentIndex).classList.remove("highlighted"); - missingCoverageElements.item(index).classList.add("highlighted"); - } - - function makeCurrent(index) { - toggleClass(index); - currentIndex = index; - missingCoverageElements.item(index).scrollIntoView({ - behavior: "smooth", - block: "center", - inline: "center", - }); - } - - function goToPrevious() { - var nextIndex = 0; - if (typeof currentIndex !== "number" || currentIndex === 0) { - nextIndex = missingCoverageElements.length - 1; - } else if (missingCoverageElements.length > 1) { - nextIndex = currentIndex - 1; - } - - makeCurrent(nextIndex); - } - - function goToNext() { - var nextIndex = 0; - - if ( - typeof currentIndex === "number" && - currentIndex < missingCoverageElements.length - 1 - ) { - nextIndex = currentIndex + 1; - } - - makeCurrent(nextIndex); - } - - return function jump(event) { - if ( - document.getElementById("fileSearch") === document.activeElement && - document.activeElement != null - ) { - // if we're currently focused on the search input, we don't want to navigate - return; - } - - switch (event.which) { - case 78: // n - case 74: // j - goToNext(); - break; - case 66: // b - case 75: // k - case 80: // p - goToPrevious(); - break; - } - }; -})(); -window.addEventListener("keydown", jumpToCode); diff --git a/frontend/coverage/clover.xml b/frontend/coverage/clover.xml deleted file mode 100644 index fb1fa280..00000000 --- a/frontend/coverage/clover.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/frontend/coverage/coverage-final.json b/frontend/coverage/coverage-final.json deleted file mode 100644 index b0645a97..00000000 --- a/frontend/coverage/coverage-final.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "/Users/miagamlem/T03-Project-2/frontend/src/pages/MyMatches/MyMatchesPage.css": { - "path": "/Users/miagamlem/T03-Project-2/frontend/src/pages/MyMatches/MyMatchesPage.css", - "statementMap": {}, - "fnMap": {}, - "branchMap": {}, - "s": {}, - "f": {}, - "b": {}, - "meta": { - "lastBranch": 0, - "lastFunction": 0, - "lastStatement": 0, - "seen": {}, - "fnNames": {} - } - }, - "/Users/miagamlem/T03-Project-2/frontend/src/pages/MyMatches/MyMatchesPage.tsx": { - "path": "/Users/miagamlem/T03-Project-2/frontend/src/pages/MyMatches/MyMatchesPage.tsx", - "statementMap": { - "0": { - "start": { "line": 5, "column": 16 }, - "end": { "line": 5, "column": 31 } - }, - "1": { - "start": { "line": 7, "column": 17 }, - "end": { "line": 14, "column": null } - }, - "2": { - "start": { "line": 16, "column": 8 }, - "end": { "line": 21, "column": null } - }, - "3": { - "start": { "line": 17, "column": 4 }, - "end": { "line": 20, "column": null } - }, - "4": { - "start": { "line": 23, "column": 8 }, - "end": { "line": 28, "column": null } - }, - "5": { - "start": { "line": 24, "column": 4 }, - "end": { "line": 27, "column": null } - }, - "6": { - "start": { "line": 30, "column": 2 }, - "end": { "line": 53, "column": null } - }, - "7": { - "start": { "line": 43, "column": 12 }, - "end": { "line": 45, "column": null } - } - }, - "fnMap": { - "0": { - "name": "MyMatchesPage", - "decl": { - "start": { "line": 4, "column": 9 }, - "end": { "line": 4, "column": 25 } - }, - "loc": { - "start": { "line": 4, "column": 25 }, - "end": { "line": 55, "column": null } - }, - "line": 4 - }, - "1": { - "name": "(anonymous_1)", - "decl": { - "start": { "line": 16, "column": 8 }, - "end": { "line": 16, "column": 27 } - }, - "loc": { - "start": { "line": 16, "column": 27 }, - "end": { "line": 21, "column": null } - }, - "line": 16 - }, - "2": { - "name": "(anonymous_2)", - "decl": { - "start": { "line": 23, "column": 8 }, - "end": { "line": 23, "column": 28 } - }, - "loc": { - "start": { "line": 23, "column": 28 }, - "end": { "line": 28, "column": null } - }, - "line": 23 - }, - "3": { - "name": "(anonymous_3)", - "decl": { - "start": { "line": 42, "column": 18 }, - "end": { "line": 42, "column": 23 } - }, - "loc": { - "start": { "line": 43, "column": 12 }, - "end": { "line": 45, "column": null } - }, - "line": 43 - } - }, - "branchMap": {}, - "s": { "0": 4, "1": 4, "2": 4, "3": 1, "4": 4, "5": 1, "6": 4, "7": 24 }, - "f": { "0": 4, "1": 1, "2": 1, "3": 24 }, - "b": {}, - "meta": { - "lastBranch": 0, - "lastFunction": 4, - "lastStatement": 8, - "seen": { - "f:4:9:4:25": 0, - "s:5:16:5:31": 0, - "s:7:17:14:Infinity": 1, - "s:16:8:21:Infinity": 2, - "f:16:8:16:27": 1, - "s:17:4:20:Infinity": 3, - "s:23:8:28:Infinity": 4, - "f:23:8:23:28": 2, - "s:24:4:27:Infinity": 5, - "s:30:2:53:Infinity": 6, - "f:42:18:42:23": 3, - "s:43:12:45:Infinity": 7 - }, - "fnNames": {} - } - } -} diff --git a/frontend/coverage/favicon.png b/frontend/coverage/favicon.png deleted file mode 100644 index c1525b811a167671e9de1fa78aab9f5c0b61cef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> - - - Code coverage report for All files - - - - - - - - - -
-
-

All files

-
-
- 100% - Statements - 8/8 -
- -
- 100% - Branches - 0/0 -
- -
- 100% - Functions - 4/4 -
- -
- 100% - Lines - 8/8 -
-
-

- Press n or j to go to the next uncovered block, - b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- File - - Statements - - Branches - - Functions - - Lines -
- MyMatchesPage.css - -
-
-
-
-
0%0/00%0/00%0/00%0/0
- MyMatchesPage.tsx - -
-
-
-
-
100%8/8100%0/0100%4/4100%8/8
-
-
- -
- - - - - - - - diff --git a/frontend/coverage/prettify.css b/frontend/coverage/prettify.css deleted file mode 100644 index 006492ca..00000000 --- a/frontend/coverage/prettify.css +++ /dev/null @@ -1,101 +0,0 @@ -.pln { - color: #000; -} -@media screen { - .str { - color: #080; - } - .kwd { - color: #008; - } - .com { - color: #800; - } - .typ { - color: #606; - } - .lit { - color: #066; - } - .pun, - .opn, - .clo { - color: #660; - } - .tag { - color: #008; - } - .atn { - color: #606; - } - .atv { - color: #080; - } - .dec, - .var { - color: #606; - } - .fun { - color: red; - } -} -@media print, projection { - .str { - color: #060; - } - .kwd { - color: #006; - font-weight: bold; - } - .com { - color: #600; - font-style: italic; - } - .typ { - color: #404; - font-weight: bold; - } - .lit { - color: #044; - } - .pun, - .opn, - .clo { - color: #440; - } - .tag { - color: #006; - font-weight: bold; - } - .atn { - color: #404; - } - .atv { - color: #060; - } -} -pre.prettyprint { - padding: 2px; - border: 1px solid #888; -} -ol.linenums { - margin-top: 0; - margin-bottom: 0; -} -li.L0, -li.L1, -li.L2, -li.L3, -li.L5, -li.L6, -li.L7, -li.L8 { - list-style-type: none; -} -li.L1, -li.L3, -li.L5, -li.L7, -li.L9 { - background: #eee; -} diff --git a/frontend/coverage/prettify.js b/frontend/coverage/prettify.js deleted file mode 100644 index 5b230e5a..00000000 --- a/frontend/coverage/prettify.js +++ /dev/null @@ -1,1008 +0,0 @@ -/* eslint-disable */ -window.PR_SHOULD_USE_CONTINUATION = true; -(function () { - var h = ["break,continue,do,else,for,if,return,while"]; - var u = [ - h, - "auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile", - ]; - var p = [ - u, - "catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof", - ]; - var l = [ - p, - "alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where", - ]; - var x = [ - p, - "abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient", - ]; - var R = [ - x, - "as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var", - ]; - var r = - "all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes"; - var w = [ - p, - "debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN", - ]; - var s = - "caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"; - var I = [ - h, - "and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None", - ]; - var f = [ - h, - "alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END", - ]; - var H = [h, "case,done,elif,esac,eval,fi,function,in,local,set,then,until"]; - var A = [l, R, w, s + I, f, H]; - var e = - /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/; - var C = "str"; - var z = "kwd"; - var j = "com"; - var O = "typ"; - var G = "lit"; - var L = "pun"; - var F = "pln"; - var m = "tag"; - var E = "dec"; - var J = "src"; - var P = "atn"; - var n = "atv"; - var N = "nocode"; - var M = - "(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*"; - function k(Z) { - var ad = 0; - var S = false; - var ac = false; - for (var V = 0, U = Z.length; V < U; ++V) { - var ae = Z[V]; - if (ae.ignoreCase) { - ac = true; - } else { - if ( - /[a-z]/i.test( - ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ""), - ) - ) { - S = true; - ac = false; - break; - } - } - } - var Y = { b: 8, t: 9, n: 10, v: 11, f: 12, r: 13 }; - function ab(ah) { - var ag = ah.charCodeAt(0); - if (ag !== 92) { - return ag; - } - var af = ah.charAt(1); - ag = Y[af]; - if (ag) { - return ag; - } else { - if ("0" <= af && af <= "7") { - return parseInt(ah.substring(1), 8); - } else { - if (af === "u" || af === "x") { - return parseInt(ah.substring(2), 16); - } else { - return ah.charCodeAt(1); - } - } - } - } - function T(af) { - if (af < 32) { - return (af < 16 ? "\\x0" : "\\x") + af.toString(16); - } - var ag = String.fromCharCode(af); - if (ag === "\\" || ag === "-" || ag === "[" || ag === "]") { - ag = "\\" + ag; - } - return ag; - } - function X(am) { - var aq = am - .substring(1, am.length - 1) - .match( - new RegExp( - "\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]", - "g", - ), - ); - var ak = []; - var af = []; - var ao = aq[0] === "^"; - for (var ar = ao ? 1 : 0, aj = aq.length; ar < aj; ++ar) { - var ah = aq[ar]; - if (/\\[bdsw]/i.test(ah)) { - ak.push(ah); - } else { - var ag = ab(ah); - var al; - if (ar + 2 < aj && "-" === aq[ar + 1]) { - al = ab(aq[ar + 2]); - ar += 2; - } else { - al = ag; - } - af.push([ag, al]); - if (!(al < 65 || ag > 122)) { - if (!(al < 65 || ag > 90)) { - af.push([Math.max(65, ag) | 32, Math.min(al, 90) | 32]); - } - if (!(al < 97 || ag > 122)) { - af.push([Math.max(97, ag) & ~32, Math.min(al, 122) & ~32]); - } - } - } - } - af.sort(function (av, au) { - return av[0] - au[0] || au[1] - av[1]; - }); - var ai = []; - var ap = [NaN, NaN]; - for (var ar = 0; ar < af.length; ++ar) { - var at = af[ar]; - if (at[0] <= ap[1] + 1) { - ap[1] = Math.max(ap[1], at[1]); - } else { - ai.push((ap = at)); - } - } - var an = ["["]; - if (ao) { - an.push("^"); - } - an.push.apply(an, ak); - for (var ar = 0; ar < ai.length; ++ar) { - var at = ai[ar]; - an.push(T(at[0])); - if (at[1] > at[0]) { - if (at[1] + 1 > at[0]) { - an.push("-"); - } - an.push(T(at[1])); - } - } - an.push("]"); - return an.join(""); - } - function W(al) { - var aj = al.source.match( - new RegExp( - "(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)", - "g", - ), - ); - var ah = aj.length; - var an = []; - for (var ak = 0, am = 0; ak < ah; ++ak) { - var ag = aj[ak]; - if (ag === "(") { - ++am; - } else { - if ("\\" === ag.charAt(0)) { - var af = +ag.substring(1); - if (af && af <= am) { - an[af] = -1; - } - } - } - } - for (var ak = 1; ak < an.length; ++ak) { - if (-1 === an[ak]) { - an[ak] = ++ad; - } - } - for (var ak = 0, am = 0; ak < ah; ++ak) { - var ag = aj[ak]; - if (ag === "(") { - ++am; - if (an[am] === undefined) { - aj[ak] = "(?:"; - } - } else { - if ("\\" === ag.charAt(0)) { - var af = +ag.substring(1); - if (af && af <= am) { - aj[ak] = "\\" + an[am]; - } - } - } - } - for (var ak = 0, am = 0; ak < ah; ++ak) { - if ("^" === aj[ak] && "^" !== aj[ak + 1]) { - aj[ak] = ""; - } - } - if (al.ignoreCase && S) { - for (var ak = 0; ak < ah; ++ak) { - var ag = aj[ak]; - var ai = ag.charAt(0); - if (ag.length >= 2 && ai === "[") { - aj[ak] = X(ag); - } else { - if (ai !== "\\") { - aj[ak] = ag.replace(/[a-zA-Z]/g, function (ao) { - var ap = ao.charCodeAt(0); - return "[" + String.fromCharCode(ap & ~32, ap | 32) + "]"; - }); - } - } - } - } - return aj.join(""); - } - var aa = []; - for (var V = 0, U = Z.length; V < U; ++V) { - var ae = Z[V]; - if (ae.global || ae.multiline) { - throw new Error("" + ae); - } - aa.push("(?:" + W(ae) + ")"); - } - return new RegExp(aa.join("|"), ac ? "gi" : "g"); - } - function a(V) { - var U = /(?:^|\s)nocode(?:\s|$)/; - var X = []; - var T = 0; - var Z = []; - var W = 0; - var S; - if (V.currentStyle) { - S = V.currentStyle.whiteSpace; - } else { - if (window.getComputedStyle) { - S = document.defaultView - .getComputedStyle(V, null) - .getPropertyValue("white-space"); - } - } - var Y = S && "pre" === S.substring(0, 3); - function aa(ab) { - switch (ab.nodeType) { - case 1: - if (U.test(ab.className)) { - return; - } - for (var ae = ab.firstChild; ae; ae = ae.nextSibling) { - aa(ae); - } - var ad = ab.nodeName; - if ("BR" === ad || "LI" === ad) { - X[W] = "\n"; - Z[W << 1] = T++; - Z[(W++ << 1) | 1] = ab; - } - break; - case 3: - case 4: - var ac = ab.nodeValue; - if (ac.length) { - if (!Y) { - ac = ac.replace(/[ \t\r\n]+/g, " "); - } else { - ac = ac.replace(/\r\n?/g, "\n"); - } - X[W] = ac; - Z[W << 1] = T; - T += ac.length; - Z[(W++ << 1) | 1] = ab; - } - break; - } - } - aa(V); - return { sourceCode: X.join("").replace(/\n$/, ""), spans: Z }; - } - function B(S, U, W, T) { - if (!U) { - return; - } - var V = { sourceCode: U, basePos: S }; - W(V); - T.push.apply(T, V.decorations); - } - var v = /\S/; - function o(S) { - var V = undefined; - for (var U = S.firstChild; U; U = U.nextSibling) { - var T = U.nodeType; - V = T === 1 ? (V ? S : U) : T === 3 ? (v.test(U.nodeValue) ? S : V) : V; - } - return V === S ? undefined : V; - } - function g(U, T) { - var S = {}; - var V; - (function () { - var ad = U.concat(T); - var ah = []; - var ag = {}; - for (var ab = 0, Z = ad.length; ab < Z; ++ab) { - var Y = ad[ab]; - var ac = Y[3]; - if (ac) { - for (var ae = ac.length; --ae >= 0;) { - S[ac.charAt(ae)] = Y; - } - } - var af = Y[1]; - var aa = "" + af; - if (!ag.hasOwnProperty(aa)) { - ah.push(af); - ag[aa] = null; - } - } - ah.push(/[\0-\uffff]/); - V = k(ah); - })(); - var X = T.length; - var W = function (ah) { - var Z = ah.sourceCode, - Y = ah.basePos; - var ad = [Y, F]; - var af = 0; - var an = Z.match(V) || []; - var aj = {}; - for (var ae = 0, aq = an.length; ae < aq; ++ae) { - var ag = an[ae]; - var ap = aj[ag]; - var ai = void 0; - var am; - if (typeof ap === "string") { - am = false; - } else { - var aa = S[ag.charAt(0)]; - if (aa) { - ai = ag.match(aa[1]); - ap = aa[0]; - } else { - for (var ao = 0; ao < X; ++ao) { - aa = T[ao]; - ai = ag.match(aa[1]); - if (ai) { - ap = aa[0]; - break; - } - } - if (!ai) { - ap = F; - } - } - am = ap.length >= 5 && "lang-" === ap.substring(0, 5); - if (am && !(ai && typeof ai[1] === "string")) { - am = false; - ap = J; - } - if (!am) { - aj[ag] = ap; - } - } - var ab = af; - af += ag.length; - if (!am) { - ad.push(Y + ab, ap); - } else { - var al = ai[1]; - var ak = ag.indexOf(al); - var ac = ak + al.length; - if (ai[2]) { - ac = ag.length - ai[2].length; - ak = ac - al.length; - } - var ar = ap.substring(5); - B(Y + ab, ag.substring(0, ak), W, ad); - B(Y + ab + ak, al, q(ar, al), ad); - B(Y + ab + ac, ag.substring(ac), W, ad); - } - } - ah.decorations = ad; - }; - return W; - } - function i(T) { - var W = [], - S = []; - if (T.tripleQuotedStrings) { - W.push([ - C, - /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/, - null, - "'\"", - ]); - } else { - if (T.multiLineStrings) { - W.push([ - C, - /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/, - null, - "'\"`", - ]); - } else { - W.push([ - C, - /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/, - null, - "\"'", - ]); - } - } - if (T.verbatimStrings) { - S.push([C, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]); - } - var Y = T.hashComments; - if (Y) { - if (T.cStyleComments) { - if (Y > 1) { - W.push([j, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, "#"]); - } else { - W.push([ - j, - /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/, - null, - "#", - ]); - } - S.push([ - C, - /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/, - null, - ]); - } else { - W.push([j, /^#[^\r\n]*/, null, "#"]); - } - } - if (T.cStyleComments) { - S.push([j, /^\/\/[^\r\n]*/, null]); - S.push([j, /^\/\*[\s\S]*?(?:\*\/|$)/, null]); - } - if (T.regexLiterals) { - var X = - "/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/"; - S.push(["lang-regex", new RegExp("^" + M + "(" + X + ")")]); - } - var V = T.types; - if (V) { - S.push([O, V]); - } - var U = ("" + T.keywords).replace(/^ | $/g, ""); - if (U.length) { - S.push([ - z, - new RegExp("^(?:" + U.replace(/[\s,]+/g, "|") + ")\\b"), - null, - ]); - } - W.push([F, /^\s+/, null, " \r\n\t\xA0"]); - S.push( - [G, /^@[a-z_$][a-z_$@0-9]*/i, null], - [O, /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null], - [F, /^[a-z_$][a-z_$@0-9]*/i, null], - [ - G, - new RegExp( - "^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*", - "i", - ), - null, - "0123456789", - ], - [F, /^\\[\s\S]?/, null], - [L, /^.[^\s\w\.$@\'\"\`\/\#\\]*/, null], - ); - return g(W, S); - } - var K = i({ - keywords: A, - hashComments: true, - cStyleComments: true, - multiLineStrings: true, - regexLiterals: true, - }); - function Q(V, ag) { - var U = /(?:^|\s)nocode(?:\s|$)/; - var ab = /\r\n?|\n/; - var ac = V.ownerDocument; - var S; - if (V.currentStyle) { - S = V.currentStyle.whiteSpace; - } else { - if (window.getComputedStyle) { - S = ac.defaultView - .getComputedStyle(V, null) - .getPropertyValue("white-space"); - } - } - var Z = S && "pre" === S.substring(0, 3); - var af = ac.createElement("LI"); - while (V.firstChild) { - af.appendChild(V.firstChild); - } - var W = [af]; - function ae(al) { - switch (al.nodeType) { - case 1: - if (U.test(al.className)) { - break; - } - if ("BR" === al.nodeName) { - ad(al); - if (al.parentNode) { - al.parentNode.removeChild(al); - } - } else { - for (var an = al.firstChild; an; an = an.nextSibling) { - ae(an); - } - } - break; - case 3: - case 4: - if (Z) { - var am = al.nodeValue; - var aj = am.match(ab); - if (aj) { - var ai = am.substring(0, aj.index); - al.nodeValue = ai; - var ah = am.substring(aj.index + aj[0].length); - if (ah) { - var ak = al.parentNode; - ak.insertBefore(ac.createTextNode(ah), al.nextSibling); - } - ad(al); - if (!ai) { - al.parentNode.removeChild(al); - } - } - } - break; - } - } - function ad(ak) { - while (!ak.nextSibling) { - ak = ak.parentNode; - if (!ak) { - return; - } - } - function ai(al, ar) { - var aq = ar ? al.cloneNode(false) : al; - var ao = al.parentNode; - if (ao) { - var ap = ai(ao, 1); - var an = al.nextSibling; - ap.appendChild(aq); - for (var am = an; am; am = an) { - an = am.nextSibling; - ap.appendChild(am); - } - } - return aq; - } - var ah = ai(ak.nextSibling, 0); - for (var aj; (aj = ah.parentNode) && aj.nodeType === 1;) { - ah = aj; - } - W.push(ah); - } - for (var Y = 0; Y < W.length; ++Y) { - ae(W[Y]); - } - if (ag === (ag | 0)) { - W[0].setAttribute("value", ag); - } - var aa = ac.createElement("OL"); - aa.className = "linenums"; - var X = Math.max(0, (ag - 1) | 0) || 0; - for (var Y = 0, T = W.length; Y < T; ++Y) { - af = W[Y]; - af.className = "L" + ((Y + X) % 10); - if (!af.firstChild) { - af.appendChild(ac.createTextNode("\xA0")); - } - aa.appendChild(af); - } - V.appendChild(aa); - } - function D(ac) { - var aj = /\bMSIE\b/.test(navigator.userAgent); - var am = /\n/g; - var al = ac.sourceCode; - var an = al.length; - var V = 0; - var aa = ac.spans; - var T = aa.length; - var ah = 0; - var X = ac.decorations; - var Y = X.length; - var Z = 0; - X[Y] = an; - var ar, aq; - for (aq = ar = 0; aq < Y;) { - if (X[aq] !== X[aq + 2]) { - X[ar++] = X[aq++]; - X[ar++] = X[aq++]; - } else { - aq += 2; - } - } - Y = ar; - for (aq = ar = 0; aq < Y;) { - var at = X[aq]; - var ab = X[aq + 1]; - var W = aq + 2; - while (W + 2 <= Y && X[W + 1] === ab) { - W += 2; - } - X[ar++] = at; - X[ar++] = ab; - aq = W; - } - Y = X.length = ar; - var ae = null; - while (ah < T) { - var af = aa[ah]; - var S = aa[ah + 2] || an; - var ag = X[Z]; - var ap = X[Z + 2] || an; - var W = Math.min(S, ap); - var ak = aa[ah + 1]; - var U; - if (ak.nodeType !== 1 && (U = al.substring(V, W))) { - if (aj) { - U = U.replace(am, "\r"); - } - ak.nodeValue = U; - var ai = ak.ownerDocument; - var ao = ai.createElement("SPAN"); - ao.className = X[Z + 1]; - var ad = ak.parentNode; - ad.replaceChild(ao, ak); - ao.appendChild(ak); - if (V < S) { - aa[ah + 1] = ak = ai.createTextNode(al.substring(W, S)); - ad.insertBefore(ak, ao.nextSibling); - } - } - V = W; - if (V >= S) { - ah += 2; - } - if (V >= ap) { - Z += 2; - } - } - } - var t = {}; - function c(U, V) { - for (var S = V.length; --S >= 0;) { - var T = V[S]; - if (!t.hasOwnProperty(T)) { - t[T] = U; - } else { - if (window.console) { - console.warn("cannot override language handler %s", T); - } - } - } - } - function q(T, S) { - if (!(T && t.hasOwnProperty(T))) { - T = /^\s*]*(?:>|$)/], - [j, /^<\!--[\s\S]*?(?:-\->|$)/], - ["lang-", /^<\?([\s\S]+?)(?:\?>|$)/], - ["lang-", /^<%([\s\S]+?)(?:%>|$)/], - [L, /^(?:<[%?]|[%?]>)/], - ["lang-", /^]*>([\s\S]+?)<\/xmp\b[^>]*>/i], - ["lang-js", /^]*>([\s\S]*?)(<\/script\b[^>]*>)/i], - ["lang-css", /^]*>([\s\S]*?)(<\/style\b[^>]*>)/i], - ["lang-in.tag", /^(<\/?[a-z][^<>]*>)/i], - ], - ), - ["default-markup", "htm", "html", "mxml", "xhtml", "xml", "xsl"], - ); - c( - g( - [ - [F, /^[\s]+/, null, " \t\r\n"], - [n, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, "\"'"], - ], - [ - [m, /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i], - [P, /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i], - ["lang-uq.val", /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/], - [L, /^[=<>\/]+/], - ["lang-js", /^on\w+\s*=\s*\"([^\"]+)\"/i], - ["lang-js", /^on\w+\s*=\s*\'([^\']+)\'/i], - ["lang-js", /^on\w+\s*=\s*([^\"\'>\s]+)/i], - ["lang-css", /^style\s*=\s*\"([^\"]+)\"/i], - ["lang-css", /^style\s*=\s*\'([^\']+)\'/i], - ["lang-css", /^style\s*=\s*([^\"\'>\s]+)/i], - ], - ), - ["in.tag"], - ); - c(g([], [[n, /^[\s\S]+/]]), ["uq.val"]); - c(i({ keywords: l, hashComments: true, cStyleComments: true, types: e }), [ - "c", - "cc", - "cpp", - "cxx", - "cyc", - "m", - ]); - c(i({ keywords: "null,true,false" }), ["json"]); - c( - i({ - keywords: R, - hashComments: true, - cStyleComments: true, - verbatimStrings: true, - types: e, - }), - ["cs"], - ); - c(i({ keywords: x, cStyleComments: true }), ["java"]); - c(i({ keywords: H, hashComments: true, multiLineStrings: true }), [ - "bsh", - "csh", - "sh", - ]); - c( - i({ - keywords: I, - hashComments: true, - multiLineStrings: true, - tripleQuotedStrings: true, - }), - ["cv", "py"], - ); - c( - i({ - keywords: s, - hashComments: true, - multiLineStrings: true, - regexLiterals: true, - }), - ["perl", "pl", "pm"], - ); - c( - i({ - keywords: f, - hashComments: true, - multiLineStrings: true, - regexLiterals: true, - }), - ["rb"], - ); - c(i({ keywords: w, cStyleComments: true, regexLiterals: true }), ["js"]); - c( - i({ - keywords: r, - hashComments: 3, - cStyleComments: true, - multilineStrings: true, - tripleQuotedStrings: true, - regexLiterals: true, - }), - ["coffee"], - ); - c(g([], [[C, /^[\s\S]+/]]), ["regex"]); - function d(V) { - var U = V.langExtension; - try { - var S = a(V.sourceNode); - var T = S.sourceCode; - V.sourceCode = T; - V.spans = S.spans; - V.basePos = 0; - q(U, T)(V); - D(V); - } catch (W) { - if ("console" in window) { - console.log(W && W.stack ? W.stack : W); - } - } - } - function y(W, V, U) { - var S = document.createElement("PRE"); - S.innerHTML = W; - if (U) { - Q(S, U); - } - var T = { langExtension: V, numberLines: U, sourceNode: S }; - d(T); - return S.innerHTML; - } - function b(ad) { - function Y(af) { - return document.getElementsByTagName(af); - } - var ac = [Y("pre"), Y("code"), Y("xmp")]; - var T = []; - for (var aa = 0; aa < ac.length; ++aa) { - for (var Z = 0, V = ac[aa].length; Z < V; ++Z) { - T.push(ac[aa][Z]); - } - } - ac = null; - var W = Date; - if (!W.now) { - W = { - now: function () { - return +new Date(); - }, - }; - } - var X = 0; - var S; - var ab = /\blang(?:uage)?-([\w.]+)(?!\S)/; - var ae = /\bprettyprint\b/; - function U() { - var ag = window.PR_SHOULD_USE_CONTINUATION ? W.now() + 250 : Infinity; - for (; X < T.length && W.now() < ag; X++) { - var aj = T[X]; - var ai = aj.className; - if (ai.indexOf("prettyprint") >= 0) { - var ah = ai.match(ab); - var am; - if (!ah && (am = o(aj)) && "CODE" === am.tagName) { - ah = am.className.match(ab); - } - if (ah) { - ah = ah[1]; - } - var al = false; - for (var ak = aj.parentNode; ak; ak = ak.parentNode) { - if ( - (ak.tagName === "pre" || - ak.tagName === "code" || - ak.tagName === "xmp") && - ak.className && - ak.className.indexOf("prettyprint") >= 0 - ) { - al = true; - break; - } - } - if (!al) { - var af = aj.className.match(/\blinenums\b(?::(\d+))?/); - af = af ? (af[1] && af[1].length ? +af[1] : true) : false; - if (af) { - Q(aj, af); - } - S = { langExtension: ah, sourceNode: aj, numberLines: af }; - d(S); - } - } - } - if (X < T.length) { - setTimeout(U, 250); - } else { - if (ad) { - ad(); - } - } - } - U(); - } - window.prettyPrintOne = y; - window.prettyPrint = b; - window.PR = { - createSimpleLexer: g, - registerLangHandler: c, - sourceDecorator: i, - PR_ATTRIB_NAME: P, - PR_ATTRIB_VALUE: n, - PR_COMMENT: j, - PR_DECLARATION: E, - PR_KEYWORD: z, - PR_LITERAL: G, - PR_NOCODE: N, - PR_PLAIN: F, - PR_PUNCTUATION: L, - PR_SOURCE: J, - PR_STRING: C, - PR_TAG: m, - PR_TYPE: O, - }; -})(); -PR.registerLangHandler( - PR.createSimpleLexer( - [], - [ - [PR.PR_DECLARATION, /^]*(?:>|$)/], - [PR.PR_COMMENT, /^<\!--[\s\S]*?(?:-\->|$)/], - [PR.PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/], - ["lang-", /^<\?([\s\S]+?)(?:\?>|$)/], - ["lang-", /^<%([\s\S]+?)(?:%>|$)/], - ["lang-", /^]*>([\s\S]+?)<\/xmp\b[^>]*>/i], - [ - "lang-handlebars", - /^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i, - ], - ["lang-js", /^]*>([\s\S]*?)(<\/script\b[^>]*>)/i], - ["lang-css", /^]*>([\s\S]*?)(<\/style\b[^>]*>)/i], - ["lang-in.tag", /^(<\/?[a-z][^<>]*>)/i], - [PR.PR_DECLARATION, /^{{[#^>/]?\s*[\w.][^}]*}}/], - [PR.PR_DECLARATION, /^{{&?\s*[\w.][^}]*}}/], - [PR.PR_DECLARATION, /^{{{>?\s*[\w.][^}]*}}}/], - [PR.PR_COMMENT, /^{{![^}]*}}/], - ], - ), - ["handlebars", "hbs"], -); -PR.registerLangHandler( - PR.createSimpleLexer( - [[PR.PR_PLAIN, /^[ \t\r\n\f]+/, null, " \t\r\n\f"]], - [ - [ - PR.PR_STRING, - /^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/, - null, - ], - [ - PR.PR_STRING, - /^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/, - null, - ], - ["lang-css-str", /^url\(([^\)\"\']*)\)/i], - [ - PR.PR_KEYWORD, - /^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i, - null, - ], - [ - "lang-css-kw", - /^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i, - ], - [PR.PR_COMMENT, /^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//], - [PR.PR_COMMENT, /^(?:)/], - [PR.PR_LITERAL, /^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i], - [PR.PR_LITERAL, /^#(?:[0-9a-f]{3}){1,2}/i], - [ - PR.PR_PLAIN, - /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i, - ], - [PR.PR_PUNCTUATION, /^[^\s\w\'\"]+/], - ], - ), - ["css"], -); -PR.registerLangHandler( - PR.createSimpleLexer( - [], - [ - [ - PR.PR_KEYWORD, - /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i, - ], - ], - ), - ["css-kw"], -); -PR.registerLangHandler( - PR.createSimpleLexer([], [[PR.PR_STRING, /^[^\)\"\']+/]]), - ["css-str"], -); diff --git a/frontend/coverage/sort-arrow-sprite.png b/frontend/coverage/sort-arrow-sprite.png deleted file mode 100644 index 6ed68316eb3f65dec9063332d2f69bf3093bbfab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc diff --git a/frontend/coverage/sorter.js b/frontend/coverage/sorter.js deleted file mode 100644 index dae7b4a4..00000000 --- a/frontend/coverage/sorter.js +++ /dev/null @@ -1,209 +0,0 @@ -/* eslint-disable */ -var addSorting = (function () { - "use strict"; - var cols, - currentSort = { - index: 0, - desc: false, - }; - - // returns the summary table element - function getTable() { - return document.querySelector(".coverage-summary"); - } - // returns the thead element of the summary table - function getTableHeader() { - return getTable().querySelector("thead tr"); - } - // returns the tbody element of the summary table - function getTableBody() { - return getTable().querySelector("tbody"); - } - // returns the th element for nth column - function getNthColumn(n) { - return getTableHeader().querySelectorAll("th")[n]; - } - - function onFilterInput() { - const searchValue = document.getElementById("fileSearch").value; - const rows = document.getElementsByTagName("tbody")[0].children; - - // Try to create a RegExp from the searchValue. If it fails (invalid regex), - // it will be treated as a plain text search - let searchRegex; - try { - searchRegex = new RegExp(searchValue, "i"); // 'i' for case-insensitive - } catch (error) { - searchRegex = null; - } - - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - let isMatch = false; - - if (searchRegex) { - // If a valid regex was created, use it for matching - isMatch = searchRegex.test(row.textContent); - } else { - // Otherwise, fall back to the original plain text search - isMatch = row.textContent - .toLowerCase() - .includes(searchValue.toLowerCase()); - } - - row.style.display = isMatch ? "" : "none"; - } - } - - // loads the search box - function addSearchBox() { - var template = document.getElementById("filterTemplate"); - var templateClone = template.content.cloneNode(true); - templateClone.getElementById("fileSearch").oninput = onFilterInput; - template.parentElement.appendChild(templateClone); - } - - // loads all columns - function loadColumns() { - var colNodes = getTableHeader().querySelectorAll("th"), - colNode, - cols = [], - col, - i; - - for (i = 0; i < colNodes.length; i += 1) { - colNode = colNodes[i]; - col = { - key: colNode.getAttribute("data-col"), - sortable: !colNode.getAttribute("data-nosort"), - type: colNode.getAttribute("data-type") || "string", - }; - cols.push(col); - if (col.sortable) { - col.defaultDescSort = col.type === "number"; - colNode.innerHTML = colNode.innerHTML + ''; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll("td"), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute("data-value"); - if (col.type === "number") { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll("tr"), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function (a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector(".coverage-summary tbody"), - rowNodes = tableBody.querySelectorAll("tr"), - rows = [], - i; - - if (desc) { - finalSorter = function (a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, "").replace(/ sorted-desc$/, ""); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc - ? " sorted-desc" - : " sorted"; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function () { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i = 0; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector(".sorter").parentElement; - if (el.addEventListener) { - el.addEventListener("click", ithSorter(i)); - } else { - el.attachEvent("onclick", ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function () { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(); - addSearchBox(); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener("load", addSorting); From 935a34d3fb491ad62b6f9bfe9fb7058eb1ebf6db Mon Sep 17 00:00:00 2001 From: Helene Lotsberg Date: Thu, 15 Oct 2026 15:08:11 +0200 Subject: [PATCH 3/4] Remove deleted setupTests.ts from tsconfig include --- frontend/tsconfig.app.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json index 692c05f0..e1e35b53 100644 --- a/frontend/tsconfig.app.json +++ b/frontend/tsconfig.app.json @@ -22,5 +22,5 @@ "erasableSyntaxOnly": true, "noFallthroughCasesInSwitch": true }, - "include": ["src", "setupTests.ts"] + "include": ["src"] } From 74f2f3e9b0a727a5e55562dad12bc1ff05923a79 Mon Sep 17 00:00:00 2001 From: Helene Lotsberg Date: Thu, 15 Oct 2026 15:21:18 +0200 Subject: [PATCH 4/4] add description for running test in tests.md --- docs/tests.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/tests.md b/docs/tests.md index 511d60ff..2283d9bf 100644 --- a/docs/tests.md +++ b/docs/tests.md @@ -52,6 +52,10 @@ TODO! - `npm run test -- --coverage` +### To run tests with test coverage if not all tests are running + +- `npx vitest run --coverage --coverage.reportOnFailure=true` + ## Test coverage The table below shows the test coverage for the application. The test coverage is overall above XX%.