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 d16802f6..4b3f3c94 100644 --- a/apps/server/tests/unit/services/claude-usage-service.test.ts +++ b/apps/server/tests/unit/services/claude-usage-service.test.ts @@ -551,7 +551,7 @@ Resets in 2h expect(result.sessionPercentage).toBe(35); expect(pty.spawn).toHaveBeenCalledWith( 'cmd.exe', - ['/c', 'claude', '/usage'], + ['/c', 'claude', '--add-dir', 'C:\\Users\\testuser'], expect.any(Object) ); }); @@ -582,8 +582,8 @@ Resets in 2h // Simulate seeing usage data dataCallback!(mockOutput); - // Advance time to trigger escape key sending - vi.advanceTimersByTime(2100); + // Advance time to trigger escape key sending (impl uses 3000ms delay) + vi.advanceTimersByTime(3100); expect(mockPty.write).toHaveBeenCalledWith('\x1b'); @@ -614,9 +614,10 @@ Resets in 2h const promise = windowsService.fetchUsageData(); dataCallback!('authentication_error'); - exitCallback!({ exitCode: 1 }); - await expect(promise).rejects.toThrow('Authentication required'); + await expect(promise).rejects.toThrow( + "Claude CLI authentication issue. Please run 'claude logout' and then 'claude login' in your terminal to refresh permissions." + ); }); it('should handle timeout with no data on Windows', async () => { @@ -628,14 +629,18 @@ Resets in 2h onExit: vi.fn(), write: vi.fn(), kill: vi.fn(), + killed: false, }; vi.mocked(pty.spawn).mockReturnValue(mockPty as any); const promise = windowsService.fetchUsageData(); - vi.advanceTimersByTime(31000); + // Advance time past timeout (45 seconds) + vi.advanceTimersByTime(46000); - await expect(promise).rejects.toThrow('Command timed out'); + await expect(promise).rejects.toThrow( + 'The Claude CLI took too long to respond. This can happen if the CLI is waiting for a trust prompt or is otherwise busy.' + ); expect(mockPty.kill).toHaveBeenCalled(); vi.useRealTimers(); @@ -654,6 +659,7 @@ Resets in 2h onExit: vi.fn(), write: vi.fn(), kill: vi.fn(), + killed: false, }; vi.mocked(pty.spawn).mockReturnValue(mockPty as any); @@ -662,8 +668,8 @@ Resets in 2h // Simulate receiving usage data dataCallback!('Current session\n65% left\nResets in 2h'); - // Advance time past timeout (30 seconds) - vi.advanceTimersByTime(31000); + // Advance time past timeout (45 seconds) + vi.advanceTimersByTime(46000); // Should resolve with data instead of rejecting const result = await promise; @@ -686,6 +692,7 @@ Resets in 2h onExit: vi.fn(), write: vi.fn(), kill: vi.fn(), + killed: false, }; vi.mocked(pty.spawn).mockReturnValue(mockPty as any); @@ -694,8 +701,8 @@ Resets in 2h // Simulate seeing usage data dataCallback!('Current session\n65% left'); - // Advance 2s to trigger ESC - vi.advanceTimersByTime(2100); + // Advance 3s to trigger ESC (impl uses 3000ms delay) + vi.advanceTimersByTime(3100); expect(mockPty.write).toHaveBeenCalledWith('\x1b'); // Advance another 2s to trigger SIGTERM fallback