From f12f60f0c7dc896a1bfb7cc482e477ab11ca247b Mon Sep 17 00:00:00 2001 From: saudademjj <128795969+saudademjj@users.noreply.github.com> Date: Thu, 19 Mar 2026 18:11:27 +0800 Subject: [PATCH] fix(frontend): use unique installed package keys (#667) --- .../InstalledPackagesList.cy.tsx | 99 +++++++++++++++++++ .../InstalledPackagesList.tsx | 7 +- 2 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 frontend/src/components/InstalledPackages/InstalledPackagesList.cy.tsx diff --git a/frontend/src/components/InstalledPackages/InstalledPackagesList.cy.tsx b/frontend/src/components/InstalledPackages/InstalledPackagesList.cy.tsx new file mode 100644 index 0000000..add0881 --- /dev/null +++ b/frontend/src/components/InstalledPackages/InstalledPackagesList.cy.tsx @@ -0,0 +1,99 @@ +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { useState } from "react"; +import { BrowserRouter } from "react-router"; + +import { AppContextProvider } from "../../context/AppContext"; +import type { Release } from "../../data/types"; +import { DeploymentStatus } from "../common/StatusLabel"; + +import InstalledPackagesList from "./InstalledPackagesList"; + +const baseRelease: Release = { + id: "release-id", + name: "shared-release", + namespace: "default", + revision: 1, + updated: "2024-01-23T15:37:35.0992836+02:00", + status: DeploymentStatus.DEPLOYED, + chart: "shared-release-0.1.10", + chart_name: "shared-release", + chart_ver: "0.1.10", + app_version: "1.3.3", + icon: "", + description: "A shared release used for namespace filtering tests.", + has_tests: true, + chartName: "shared-release", + chartVersion: "0.1.10", +}; + +const createRelease = (overrides: Partial = {}): Release => ({ + ...baseRelease, + ...overrides, +}); + +function InstalledPackagesListTestWrapper() { + const [showOnlyTargetNamespace, setShowOnlyTargetNamespace] = useState(false); + const releases = [ + createRelease({ id: "release-a", namespace: "airbyte" }), + createRelease({ id: "release-b", namespace: "cert-manager" }), + ]; + const filteredReleases = showOnlyTargetNamespace + ? releases.filter((release) => release.namespace === "cert-manager") + : releases; + + return ( +
+ + +
+ ); +} + +const renderInstalledPackagesList = () => { + const queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: false, + }, + }, + }); + + cy.mount( + + + + + + + + ); +}; + +describe("InstalledPackagesList", () => { + it("updates visible cards when filtering duplicate release names by namespace", () => { + cy.intercept("GET", "/status", { + Analytics: false, + CacheHitRatio: 0, + ClusterMode: false, + CurVer: "1.0.0", + LatestVer: "1.0.0", + NoHealth: true, + NoLatest: true, + }).as("getStatus"); + + renderInstalledPackagesList(); + + cy.wait("@getStatus"); + cy.get("img[alt='helm release icon']").should("have.length", 2); + cy.contains(/^airbyte$/).should("exist"); + cy.contains(/^cert-manager$/).should("exist"); + + cy.contains("button", "Filter to cert-manager").click(); + + cy.get("img[alt='helm release icon']").should("have.length", 1); + cy.contains(/^cert-manager$/).should("exist"); + cy.contains(/^airbyte$/).should("not.exist"); + }); +}); diff --git a/frontend/src/components/InstalledPackages/InstalledPackagesList.tsx b/frontend/src/components/InstalledPackages/InstalledPackagesList.tsx index 07c2101..010c3f5 100644 --- a/frontend/src/components/InstalledPackages/InstalledPackagesList.tsx +++ b/frontend/src/components/InstalledPackages/InstalledPackagesList.tsx @@ -12,11 +12,10 @@ export default function InstalledPackagesList({ return (
{filteredReleases.map((installedPackage: Release) => { + const releaseKey = `${installedPackage.namespace}/${installedPackage.name}`; + return ( - + ); })}