fix: report desktop log cleanup failure

This commit is contained in:
debpalash
2026-08-09 21:42:46 +00:00
parent aa5de23bd1
commit 511d21a8b9
3 changed files with 66 additions and 4 deletions
+6 -1
View File
@@ -476,7 +476,12 @@ async def clear_tauri_logs():
cleared.append(p)
except OSError:
failed += 1
return {"cleared": cleared, "failed": failed}
if failed:
raise HTTPException(
status_code=500,
detail="One or more desktop log files could not be cleared. Close any app using them and retry.",
)
return {"cleared": cleared, "failed": 0}
@router.get("/sysinfo", response_model=SysinfoResponse)
def get_sys_info():
@@ -0,0 +1,56 @@
import React from 'react';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
const { clearTauriLogs, toastError, toastSuccess } = vi.hoisted(() => ({
clearTauriLogs: vi.fn(),
toastError: vi.fn(),
toastSuccess: vi.fn(),
}));
vi.mock('../api/system', () => ({
clearSystemLogs: vi.fn(),
clearTauriLogs,
}));
vi.mock('../api/hooks', () => ({
useSystemLogs: () => ({ data: null, refetch: vi.fn() }),
useTauriLogs: () => ({ data: null, refetch: vi.fn() }),
useVisibleNotifications: () => ({ notifications: [] }),
isDismissibleNotification: () => false,
}));
vi.mock('../components/NetworkToggle', () => ({ default: () => null }));
vi.mock('react-hot-toast', () => ({
default: Object.assign(vi.fn(), { error: toastError, success: toastSuccess }),
}));
import LogsFooter from '../components/LogsFooter';
function renderFooter() {
return render(
<QueryClientProvider client={new QueryClient()}>
<LogsFooter />
</QueryClientProvider>,
);
}
describe('LogsFooter Tauri cleanup failure', () => {
beforeEach(() => {
localStorage.clear();
localStorage.setItem('omnivoice.logs.active', 'tauri');
clearTauriLogs.mockReset();
toastError.mockReset();
toastSuccess.mockReset();
});
it('shows failure and never claims the log was cleared', async () => {
clearTauriLogs.mockRejectedValueOnce(new Error('desktop log is locked'));
renderFooter();
fireEvent.click(screen.getByRole('button', { name: /expand logs panel/i }));
fireEvent.click(screen.getByRole('button', { name: /clear log/i }));
await waitFor(() => expect(toastError).toHaveBeenCalled());
expect(toastSuccess).not.toHaveBeenCalled();
});
});
+4 -3
View File
@@ -104,7 +104,8 @@ async def test_tauri_log_clear_reports_truncate_failure(monkeypatch, tmp_path):
lambda _path: (_ for _ in ()).throw(PermissionError("locked")),
)
result = await system.clear_tauri_logs()
with pytest.raises(HTTPException) as caught:
await system.clear_tauri_logs()
assert result == {"cleared": [], "failed": 1}
assert str(log) not in str(result)
assert caught.value.status_code == 500
assert str(log) not in caught.value.detail