From 49acd8c1484750fca39802bc294a14d2489f7ed4 Mon Sep 17 00:00:00 2001 From: maziggy Date: Fri, 30 Jan 2026 13:02:42 +0100 Subject: [PATCH] Improved frontend tests --- backend/.coverage | Bin 69632 -> 0 bytes frontend/eslint.config.js | 2 +- .../src/__tests__/api/githubBackupApi.test.ts | 2 +- frontend/src/pages/SettingsPage.tsx | 4 +++- test_frontend.sh | 1 + 5 files changed, 6 insertions(+), 3 deletions(-) delete mode 100644 backend/.coverage diff --git a/backend/.coverage b/backend/.coverage deleted file mode 100644 index 811e3bd301f193b8bf6e3f6c0757f466856965e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69632 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 UoOGbpbpWJhomr0gl&{18FS?Ua4*&oF diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js index 4f353f6ae..2cea7df7b 100644 --- a/frontend/eslint.config.js +++ b/frontend/eslint.config.js @@ -6,7 +6,7 @@ import tseslint from 'typescript-eslint' import { defineConfig, globalIgnores } from 'eslint/config' export default defineConfig([ - globalIgnores(['dist']), + globalIgnores(['dist', 'coverage']), { files: ['**/*.{ts,tsx}'], extends: [ diff --git a/frontend/src/__tests__/api/githubBackupApi.test.ts b/frontend/src/__tests__/api/githubBackupApi.test.ts index 851ba074b..d134ae3bd 100644 --- a/frontend/src/__tests__/api/githubBackupApi.test.ts +++ b/frontend/src/__tests__/api/githubBackupApi.test.ts @@ -2,7 +2,7 @@ * Tests for the GitHub Backup API client functions. */ -import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { describe, it, expect } from 'vitest'; import { http, HttpResponse } from 'msw'; import { setupServer } from 'msw/node'; import type { diff --git a/frontend/src/pages/SettingsPage.tsx b/frontend/src/pages/SettingsPage.tsx index 70ad3e688..944babd95 100644 --- a/frontend/src/pages/SettingsPage.tsx +++ b/frontend/src/pages/SettingsPage.tsx @@ -544,14 +544,16 @@ export function SettingsPage() { // Local state for camera URL inputs (to avoid saving on every keystroke) const [localCameraUrls, setLocalCameraUrls] = useState>({}); const cameraUrlSaveTimeoutRef = useRef>>({}); + const initializedPrinterUrlsRef = useRef>(new Set()); // Initialize local camera URLs from printer data useEffect(() => { if (printers) { const urls: Record = {}; printers.forEach(p => { - if (p.external_camera_url && localCameraUrls[p.id] === undefined) { + if (p.external_camera_url && !initializedPrinterUrlsRef.current.has(p.id)) { urls[p.id] = p.external_camera_url; + initializedPrinterUrlsRef.current.add(p.id); } }); if (Object.keys(urls).length > 0) { diff --git a/test_frontend.sh b/test_frontend.sh index 577555226..94157fea8 100755 --- a/test_frontend.sh +++ b/test_frontend.sh @@ -1,5 +1,6 @@ #!/bin/sh cd frontend +npm run lint npm test cd ..