Files
Charon/frontend/src/hooks/__tests__/useAuditLogs.test.tsx
T
GitHub Actions 3169b05156 fix: skip incomplete system log viewer tests
- Marked 12 tests as skip pending feature implementation
- Features tracked in GitHub issue #686 (system log viewer feature completion)
- Tests cover sorting by timestamp/level/method/URI/status, pagination controls, filtering by text/level, download functionality
- Unblocks Phase 2 at 91.7% pass rate to proceed to Phase 3 security enforcement validation
- TODO comments in code reference GitHub #686 for feature completion tracking
- Tests skipped: Pagination (3), Search/Filter (2), Download (2), Sorting (1), Log Display (4)
2026-02-09 21:55:55 +00:00

137 lines
4.2 KiB
TypeScript

import { renderHook, waitFor } from '@testing-library/react'
import { describe, it, expect, vi, beforeEach } from 'vitest'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { useAuditLogs, useAuditLog, useAuditLogsByProvider } from '../useAuditLogs'
// Mock the API module
vi.mock('../../api/auditLogs', () => ({
getAuditLogs: vi.fn(),
getAuditLog: vi.fn(),
getAuditLogsByProvider: vi.fn(),
}))
import { getAuditLogs, getAuditLog, getAuditLogsByProvider } from '../../api/auditLogs'
const mockAuditLog = {
id: 1,
uuid: 'test-uuid-123',
actor: 'admin@test.com',
action: 'dns_provider_create' as const,
event_category: 'dns_provider' as const,
resource_id: 1,
details: 'Created DNS provider',
ip_address: '127.0.0.1',
created_at: '2026-01-24T12:00:00Z',
}
const mockListResponse = {
logs: [mockAuditLog],
total: 1,
page: 1,
limit: 50,
}
function createWrapper() {
const queryClient = new QueryClient({
defaultOptions: {
queries: { retry: false },
},
})
return ({ children }: { children: React.ReactNode }) => (
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
)
}
describe('useAuditLogs hook', () => {
beforeEach(() => {
vi.clearAllMocks()
})
it('fetches audit logs with default parameters', async () => {
vi.mocked(getAuditLogs).mockResolvedValue(mockListResponse)
const { result } = renderHook(() => useAuditLogs(), { wrapper: createWrapper() })
await waitFor(() => expect(result.current.isSuccess).toBe(true))
expect(getAuditLogs).toHaveBeenCalledWith(undefined, 1, 50)
expect(result.current.data).toEqual(mockListResponse)
})
it('fetches audit logs with filters', async () => {
vi.mocked(getAuditLogs).mockResolvedValue(mockListResponse)
const filters = { event_category: 'dns_provider' as const }
const { result } = renderHook(() => useAuditLogs(filters, 2, 25), { wrapper: createWrapper() })
await waitFor(() => expect(result.current.isSuccess).toBe(true))
expect(getAuditLogs).toHaveBeenCalledWith(filters, 2, 25)
})
})
describe('useAuditLog hook', () => {
beforeEach(() => {
vi.clearAllMocks()
})
it('fetches a single audit log by UUID', async () => {
vi.mocked(getAuditLog).mockResolvedValue(mockAuditLog)
const { result } = renderHook(() => useAuditLog('test-uuid-123'), { wrapper: createWrapper() })
await waitFor(() => expect(result.current.isSuccess).toBe(true))
expect(getAuditLog).toHaveBeenCalledWith('test-uuid-123')
expect(result.current.data).toEqual(mockAuditLog)
})
it('does not fetch when uuid is null', () => {
const { result } = renderHook(() => useAuditLog(null), { wrapper: createWrapper() })
expect(result.current.fetchStatus).toBe('idle')
expect(getAuditLog).not.toHaveBeenCalled()
})
})
describe('useAuditLogsByProvider hook', () => {
beforeEach(() => {
vi.clearAllMocks()
})
it('fetches audit logs for a provider', async () => {
vi.mocked(getAuditLogsByProvider).mockResolvedValue(mockListResponse)
const { result } = renderHook(() => useAuditLogsByProvider(123), { wrapper: createWrapper() })
await waitFor(() => expect(result.current.isSuccess).toBe(true))
expect(getAuditLogsByProvider).toHaveBeenCalledWith(123, 1, 50)
expect(result.current.data).toEqual(mockListResponse)
})
it('does not fetch when providerId is null', () => {
const { result } = renderHook(() => useAuditLogsByProvider(null), { wrapper: createWrapper() })
expect(result.current.fetchStatus).toBe('idle')
expect(getAuditLogsByProvider).not.toHaveBeenCalled()
})
it('does not fetch when providerId is 0', () => {
const { result } = renderHook(() => useAuditLogsByProvider(0), { wrapper: createWrapper() })
expect(result.current.fetchStatus).toBe('idle')
expect(getAuditLogsByProvider).not.toHaveBeenCalled()
})
it('fetches with custom pagination', async () => {
vi.mocked(getAuditLogsByProvider).mockResolvedValue(mockListResponse)
const { result } = renderHook(() => useAuditLogsByProvider(456, 3, 100), { wrapper: createWrapper() })
await waitFor(() => expect(result.current.isSuccess).toBe(true))
expect(getAuditLogsByProvider).toHaveBeenCalledWith(456, 3, 100)
})
})