- Add kubernetesStore.ts with Zustand state management (clusters, namespaces, resources, terminals, search, bulk selection) - Create 15 resource list components (Secret, ReplicaSet, Job, CronJob, Ingress, PVC, PV, ServiceAccount, Role, ClusterRole, RoleBinding, ClusterRoleBinding, HPA, Node, Event, ConfigMap) - Add advanced components (Terminal, YamlEditor, MetricsChart, SearchBar, ContextSwitcher, ApplicationView, PodDetail) - Update KubernetesPage.tsx to integrate kubernetesStore and add cluster management - Add ContextInfo and ResourceInfo types to tauriCommands.ts - All components pass ESLint, TypeScript, and pass 114 tests - Build successful
162 lines
5.7 KiB
TypeScript
162 lines
5.7 KiB
TypeScript
import { describe, it, expect, beforeEach } from "vitest";
|
|
import { useKubernetesStore } from "@/stores/kubernetesStore";
|
|
import type { ResourceInfo } from "@/lib/tauriCommands";
|
|
|
|
describe("Kubernetes Store", () => {
|
|
beforeEach(() => {
|
|
useKubernetesStore.getState().clusters.forEach((c) =>
|
|
useKubernetesStore.getState().removeCluster(c.id)
|
|
);
|
|
});
|
|
|
|
describe("Cluster Management", () => {
|
|
it("should add a cluster", () => {
|
|
const cluster = {
|
|
id: "cluster-1",
|
|
name: "Production",
|
|
context: "prod-context",
|
|
cluster_url: "https://k8s.example.com",
|
|
};
|
|
|
|
useKubernetesStore.getState().addCluster(cluster);
|
|
|
|
expect(useKubernetesStore.getState().clusters).toHaveLength(1);
|
|
expect(useKubernetesStore.getState().clusters[0].name).toBe("Production");
|
|
});
|
|
|
|
it("should remove a cluster", () => {
|
|
const cluster = {
|
|
id: "cluster-1",
|
|
name: "Production",
|
|
context: "prod-context",
|
|
cluster_url: "https://k8s.example.com",
|
|
};
|
|
|
|
useKubernetesStore.getState().addCluster(cluster);
|
|
useKubernetesStore.getState().removeCluster("cluster-1");
|
|
|
|
expect(useKubernetesStore.getState().clusters).toHaveLength(0);
|
|
});
|
|
|
|
it("should update a cluster", () => {
|
|
const cluster = {
|
|
id: "cluster-1",
|
|
name: "Production",
|
|
context: "prod-context",
|
|
cluster_url: "https://k8s.example.com",
|
|
};
|
|
|
|
useKubernetesStore.getState().addCluster(cluster);
|
|
useKubernetesStore.getState().updateCluster("cluster-1", { name: "Production New" });
|
|
|
|
expect(useKubernetesStore.getState().clusters[0].name).toBe("Production New");
|
|
});
|
|
|
|
it("should set selected cluster", () => {
|
|
const cluster = {
|
|
id: "cluster-1",
|
|
name: "Production",
|
|
context: "prod-context",
|
|
cluster_url: "https://k8s.example.com",
|
|
};
|
|
|
|
useKubernetesStore.getState().addCluster(cluster);
|
|
useKubernetesStore.getState().setSelectedCluster("cluster-1");
|
|
|
|
expect(useKubernetesStore.getState().selectedClusterId).toBe("cluster-1");
|
|
});
|
|
});
|
|
|
|
describe("Namespace Management", () => {
|
|
it("should set selected namespace", () => {
|
|
useKubernetesStore.getState().setSelectedNamespace("default");
|
|
expect(useKubernetesStore.getState().selectedNamespace).toBe("default");
|
|
});
|
|
|
|
it("should set namespaces for a cluster", () => {
|
|
useKubernetesStore.getState().setNamespaces("cluster-1", ["default", "kube-system", "production"]);
|
|
expect(useKubernetesStore.getState().namespaces["cluster-1"]).toEqual(["default", "kube-system", "production"]);
|
|
});
|
|
});
|
|
|
|
describe("Resource Loading", () => {
|
|
it("should mark resource as loaded", () => {
|
|
useKubernetesStore.getState().markResourceLoaded("pods");
|
|
expect(useKubernetesStore.getState().isResourceLoaded("pods")).toBe(true);
|
|
});
|
|
|
|
it("should mark resource as unloaded", () => {
|
|
useKubernetesStore.getState().markResourceLoaded("pods");
|
|
useKubernetesStore.getState().markResourceUnloaded("pods");
|
|
expect(useKubernetesStore.getState().isResourceLoaded("pods")).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe("Terminal Sessions", () => {
|
|
it("should add a terminal session", () => {
|
|
const sessionId = useKubernetesStore.getState().addTerminalSession({
|
|
clusterId: "cluster-1",
|
|
namespace: "default",
|
|
pod: "nginx",
|
|
container: "nginx",
|
|
command: "bash",
|
|
});
|
|
|
|
expect(sessionId).toBe("terminal-1");
|
|
expect(useKubernetesStore.getState().terminalSessions[sessionId]).toBeDefined();
|
|
});
|
|
|
|
it("should remove a terminal session", () => {
|
|
const sessionId = useKubernetesStore.getState().addTerminalSession({
|
|
clusterId: "cluster-1",
|
|
namespace: "default",
|
|
pod: "nginx",
|
|
container: "nginx",
|
|
command: "bash",
|
|
});
|
|
|
|
useKubernetesStore.getState().removeTerminalSession(sessionId);
|
|
expect(useKubernetesStore.getState().terminalSessions[sessionId]).toBeUndefined();
|
|
});
|
|
});
|
|
|
|
describe("Search", () => {
|
|
it("should set global search query", () => {
|
|
useKubernetesStore.getState().setGlobalSearchQuery("nginx");
|
|
expect(useKubernetesStore.getState().globalSearchQuery).toBe("nginx");
|
|
});
|
|
|
|
it("should set search results", () => {
|
|
const results = [{ name: "nginx-1", namespace: "default" }];
|
|
useKubernetesStore.getState().setSearchResults("pods", results as ResourceInfo[]);
|
|
|
|
expect(useKubernetesStore.getState().searchResults.pods).toEqual(results);
|
|
});
|
|
});
|
|
|
|
describe("Bulk Selection", () => {
|
|
it("should add to bulk selection", () => {
|
|
useKubernetesStore.getState().addToBulkSelection("pods", "nginx-1");
|
|
expect(useKubernetesStore.getState().bulkSelection.pods).toContain("nginx-1");
|
|
});
|
|
|
|
it("should remove from bulk selection", () => {
|
|
useKubernetesStore.getState().addToBulkSelection("pods", "nginx-1");
|
|
useKubernetesStore.getState().removeFromBulkSelection("pods", "nginx-1");
|
|
expect(useKubernetesStore.getState().bulkSelection.pods).not.toContain("nginx-1");
|
|
});
|
|
|
|
it("should clear bulk selection", () => {
|
|
useKubernetesStore.getState().addToBulkSelection("pods", "nginx-1");
|
|
useKubernetesStore.getState().clearBulkSelection("pods");
|
|
expect(useKubernetesStore.getState().bulkSelection.pods).toEqual([]);
|
|
});
|
|
|
|
it("should get bulk selection count", () => {
|
|
useKubernetesStore.getState().addToBulkSelection("pods", "nginx-1");
|
|
useKubernetesStore.getState().addToBulkSelection("pods", "nginx-2");
|
|
expect(useKubernetesStore.getState().getBulkSelectionCount("pods")).toBe(2);
|
|
});
|
|
});
|
|
});
|