| import { describe, it, expect, beforeEach } from "vitest"; |
| import { useAppStore } from "./useAppStore"; |
|
|
| describe("useAppStore", () => { |
| beforeEach(() => { |
| |
| useAppStore.setState({ |
| profiles: [], |
| profilesLoading: false, |
| instances: [], |
| instancesLoading: false, |
| tabsChartData: [], |
| currentTabs: {}, |
| agents: [], |
| selectedAgentId: null, |
| events: [], |
| eventFilter: "all", |
| serverInfo: null, |
| }); |
| }); |
|
|
| describe("profiles", () => { |
| it("sets profiles", () => { |
| const profiles = [{ name: "test", id: "prof_123" }] as any; |
| useAppStore.getState().setProfiles(profiles); |
| expect(useAppStore.getState().profiles).toEqual(profiles); |
| }); |
|
|
| it("sets profiles loading state", () => { |
| useAppStore.getState().setProfilesLoading(true); |
| expect(useAppStore.getState().profilesLoading).toBe(true); |
| }); |
| }); |
|
|
| describe("instances", () => { |
| it("sets instances", () => { |
| const instances = [{ id: "inst_123", profileName: "test" }] as any; |
| useAppStore.getState().setInstances(instances); |
| expect(useAppStore.getState().instances).toEqual(instances); |
| }); |
| }); |
|
|
| describe("chart data", () => { |
| it("adds chart data point", () => { |
| const point = { timestamp: Date.now(), inst_123: 5 }; |
| useAppStore.getState().addChartDataPoint(point); |
| expect(useAppStore.getState().tabsChartData).toHaveLength(1); |
| expect(useAppStore.getState().tabsChartData[0]).toEqual(point); |
| }); |
|
|
| it("keeps only last 60 data points", () => { |
| |
| for (let i = 0; i < 65; i++) { |
| useAppStore.getState().addChartDataPoint({ timestamp: i, inst_123: i }); |
| } |
|
|
| const data = useAppStore.getState().tabsChartData; |
| expect(data).toHaveLength(60); |
| |
| expect(data[0].timestamp).toBe(5); |
| expect(data[59].timestamp).toBe(64); |
| }); |
|
|
| it("sets current tabs", () => { |
| const tabs = { |
| inst_123: [{ id: "tab_1", url: "https://pinchtab.com" }], |
| } as any; |
| useAppStore.getState().setCurrentTabs(tabs); |
| expect(useAppStore.getState().currentTabs).toEqual(tabs); |
| }); |
| }); |
|
|
| describe("events", () => { |
| it("adds event to beginning of list", () => { |
| const event1 = { type: "action", timestamp: "2024-01-01" } as any; |
| const event2 = { type: "action", timestamp: "2024-01-02" } as any; |
|
|
| useAppStore.getState().addEvent(event1); |
| useAppStore.getState().addEvent(event2); |
|
|
| const events = useAppStore.getState().events; |
| expect(events[0]).toEqual(event2); |
| expect(events[1]).toEqual(event1); |
| }); |
|
|
| it("limits events to 100", () => { |
| |
| for (let i = 0; i < 105; i++) { |
| useAppStore.getState().addEvent({ type: "action", id: i } as any); |
| } |
|
|
| const events = useAppStore.getState().events; |
| expect(events).toHaveLength(100); |
| |
| expect(events[0].id).toBe(104); |
| }); |
|
|
| it("clears events", () => { |
| useAppStore.getState().addEvent({ type: "action" } as any); |
| useAppStore.getState().clearEvents(); |
| expect(useAppStore.getState().events).toHaveLength(0); |
| }); |
|
|
| it("sets event filter", () => { |
| useAppStore.getState().setEventFilter("errors"); |
| expect(useAppStore.getState().eventFilter).toBe("errors"); |
| }); |
| }); |
|
|
| describe("agents", () => { |
| it("sets agents", () => { |
| const agents = [{ id: "agent_1", name: "Test Agent" }] as any; |
| useAppStore.getState().setAgents(agents); |
| expect(useAppStore.getState().agents).toEqual(agents); |
| }); |
|
|
| it("sets selected agent id", () => { |
| useAppStore.getState().setSelectedAgentId("agent_1"); |
| expect(useAppStore.getState().selectedAgentId).toBe("agent_1"); |
| }); |
|
|
| it("clears selected agent id", () => { |
| useAppStore.getState().setSelectedAgentId("agent_1"); |
| useAppStore.getState().setSelectedAgentId(null); |
| expect(useAppStore.getState().selectedAgentId).toBeNull(); |
| }); |
| }); |
|
|
| describe("settings", () => { |
| it("has default settings", () => { |
| const settings = useAppStore.getState().settings; |
| expect(settings.stealth).toBe("light"); |
| expect(settings.screencast?.fps).toBe(1); |
| expect(settings.monitoring?.memoryMetrics).toBe(false); |
| }); |
|
|
| it("updates settings", () => { |
| const newSettings = { |
| screencast: { fps: 5, quality: 50, maxWidth: 1024 }, |
| stealth: "strict" as const, |
| browser: { blockImages: true, blockMedia: true, noAnimations: true }, |
| monitoring: { memoryMetrics: true, pollInterval: 30 }, |
| }; |
| useAppStore.getState().setSettings(newSettings); |
| expect(useAppStore.getState().settings).toEqual(newSettings); |
| }); |
|
|
| it("persists settings to localStorage", () => { |
| const newSettings = { |
| screencast: { fps: 10, quality: 80, maxWidth: 1280 }, |
| stealth: "full" as const, |
| browser: { blockImages: false, blockMedia: false, noAnimations: false }, |
| monitoring: { memoryMetrics: true, pollInterval: 30 }, |
| }; |
| useAppStore.getState().setSettings(newSettings); |
|
|
| const saved = localStorage.getItem("pinchtab_settings"); |
| expect(saved).toBeTruthy(); |
| expect(JSON.parse(saved!)).toEqual(newSettings); |
| }); |
| }); |
|
|
| describe("memory chart data", () => { |
| it("adds memory data points", () => { |
| const point = { timestamp: Date.now(), inst_1: 50.5 }; |
| useAppStore.getState().addMemoryDataPoint(point); |
| expect(useAppStore.getState().memoryChartData).toContainEqual(point); |
| }); |
|
|
| it("limits memory data to 60 points", () => { |
| for (let i = 0; i < 65; i++) { |
| useAppStore.getState().addMemoryDataPoint({ timestamp: i, inst_1: i }); |
| } |
| expect(useAppStore.getState().memoryChartData).toHaveLength(60); |
| |
| expect(useAppStore.getState().memoryChartData[0].timestamp).toBe(5); |
| }); |
|
|
| it("sets current memory", () => { |
| const memory = { inst_1: 85.5, inst_2: 120.3 }; |
| useAppStore.getState().setCurrentMemory(memory); |
| expect(useAppStore.getState().currentMemory).toEqual(memory); |
| }); |
| }); |
| }); |
|
|