diff --git a/apps/server/tests/unit/services/claude-usage-service.test.ts b/apps/server/tests/unit/services/claude-usage-service.test.ts index ed1ef69f..983e5806 100644 --- a/apps/server/tests/unit/services/claude-usage-service.test.ts +++ b/apps/server/tests/unit/services/claude-usage-service.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import { ClaudeUsageService } from '@/services/claude-usage-service.js'; import { spawn } from 'child_process'; import * as pty from 'node-pty'; @@ -563,18 +563,21 @@ Resets in 2h const mockOutput = 'Current session\n65% left'; let dataCallback: Function | undefined; + let exitCallback: Function | undefined; const mockPty = { onData: vi.fn((callback: Function) => { dataCallback = callback; }), - onExit: vi.fn(), + onExit: vi.fn((callback: Function) => { + exitCallback = callback; + }), write: vi.fn(), kill: vi.fn(), }; vi.mocked(pty.spawn).mockReturnValue(mockPty as any); - windowsService.fetchUsageData(); + const promise = windowsService.fetchUsageData(); // Simulate seeing usage data dataCallback!(mockOutput); @@ -584,6 +587,10 @@ Resets in 2h expect(mockPty.write).toHaveBeenCalledWith('\x1b'); + // Complete the promise to avoid unhandled rejection + exitCallback!({ exitCode: 0 }); + await promise; + vi.useRealTimers(); }); diff --git a/apps/ui/src/components/layout/sidebar/hooks/use-sidebar-auto-collapse.ts b/apps/ui/src/components/layout/sidebar/hooks/use-sidebar-auto-collapse.ts index 994da088..9da2954e 100644 --- a/apps/ui/src/components/layout/sidebar/hooks/use-sidebar-auto-collapse.ts +++ b/apps/ui/src/components/layout/sidebar/hooks/use-sidebar-auto-collapse.ts @@ -1,4 +1,4 @@ -import { useEffect } from 'react'; +import { useEffect, useRef } from 'react'; interface UseSidebarAutoCollapseProps { sidebarOpen: boolean; @@ -9,6 +9,8 @@ export function useSidebarAutoCollapse({ sidebarOpen, toggleSidebar, }: UseSidebarAutoCollapseProps) { + const isMountedRef = useRef(false); + // Auto-collapse sidebar on small screens useEffect(() => { const mediaQuery = window.matchMedia('(max-width: 1024px)'); // lg breakpoint @@ -20,8 +22,11 @@ export function useSidebarAutoCollapse({ } }; - // Check on mount - handleResize(); + // Check on mount only + if (!isMountedRef.current) { + isMountedRef.current = true; + handleResize(); + } // Listen for changes mediaQuery.addEventListener('change', handleResize);