chore: remediate 61 Go linting issues and tighten pre-commit config

Complete lint remediation addressing errcheck, gosec, and staticcheck
violations across backend test files. Tighten pre-commit configuration
to prevent future blind spots.

Key Changes:
- Fix 61 Go linting issues (errcheck, gosec G115/G301/G304/G306, bodyclose)
- Add proper error handling for json.Unmarshal, os.Setenv, db.Close(), w.Write()
- Fix gosec G115 integer overflow with strconv.FormatUint
- Add #nosec annotations with justifications for test fixtures
- Fix SecurityService goroutine leaks (add Close() calls)
- Fix CrowdSec tar.gz non-deterministic ordering with sorted keys

Pre-commit Hardening:
- Remove test file exclusion from golangci-lint hook
- Add gosec to .golangci-fast.yml with critical checks (G101, G110, G305)
- Replace broad .golangci.yml exclusions with targeted path-specific rules
- Test files now linted on every commit

Test Fixes:
- Fix emergency route count assertions (1→2 for dual-port setup)
- Fix DNS provider service tests with proper mock setup
- Fix certificate service tests with deterministic behavior

Backend: 27 packages pass, 83.5% coverage
Frontend: 0 lint warnings, 0 TypeScript errors
Pre-commit: All 14 hooks pass (~37s)
This commit is contained in:
GitHub Actions
2026-02-02 06:17:48 +00:00
parent 64b804329b
commit 032d475fba
117 changed files with 4742 additions and 2587 deletions

View File

@@ -6,6 +6,7 @@ import { QueryClientProvider } from '@tanstack/react-query'
import * as api from '../../api/import'
import { useImport } from '../useImport'
import type { ImportSession, ImportPreview } from '../../api/import'
vi.mock('../../api/import', () => ({
uploadCaddyfile: vi.fn(),
@@ -58,14 +59,18 @@ describe('useImport (unit)', () => {
})
it('enables preview query when session state is pending', async () => {
const session = {
const session: ImportSession = {
id: 's-pending',
state: 'pending' as const,
state: 'pending',
created_at: '2026-01-31T00:00:00.000Z',
updated_at: '2026-01-31T00:00:00.000Z',
}
vi.mocked(api.getImportStatus).mockResolvedValue({ has_pending: true, session })
vi.mocked(api.getImportPreview).mockResolvedValue({ session, preview: { hosts: [], conflicts: [], errors: [] } } as any)
const mockPreviewResponse: ImportPreview = {
session,
preview: { hosts: [], conflicts: [], errors: [] }
}
vi.mocked(api.getImportPreview).mockResolvedValue(mockPreviewResponse)
const { result } = renderHook(() => useImport(), { wrapper })
@@ -74,12 +79,12 @@ describe('useImport (unit)', () => {
})
it('upload stores immediate uploadPreview and exposes preview', async () => {
const mockPreview = {
const mockPreview: ImportPreview = {
session: { id: 's1', state: 'reviewing', created_at: '2026-01-31T00:00:00.000Z', updated_at: '2026-01-31T00:00:00.000Z' },
preview: { hosts: [], conflicts: [], errors: [] },
}
vi.mocked(api.getImportStatus).mockResolvedValue({ has_pending: false })
vi.mocked(api.uploadCaddyfile).mockResolvedValue(mockPreview as any)
vi.mocked(api.uploadCaddyfile).mockResolvedValue(mockPreview)
const { result } = renderHook(() => useImport(), { wrapper })