diff --git a/frontend/src/hooks/__tests__/useImport.test.tsx b/frontend/src/hooks/__tests__/useImport.test.tsx index 95aa580c..2b7cc9f1 100644 --- a/frontend/src/hooks/__tests__/useImport.test.tsx +++ b/frontend/src/hooks/__tests__/useImport.test.tsx @@ -41,9 +41,9 @@ describe('useImport', () => { const { result } = renderHook(() => useImport(), { wrapper: createWrapper() }) await waitFor(() => { + expect(result.current.loading).toBe(false) expect(result.current.session).toBeNull() }) - expect(result.current.loading).toBe(false) expect(result.current.error).toBeNull() }) @@ -76,7 +76,7 @@ describe('useImport', () => { expect(result.current.session).toEqual(mockSession) }) - expect(api.uploadCaddyfile).toHaveBeenCalledWith('example.com { reverse_proxy localhost:8080 }', undefined) + expect(api.uploadCaddyfile).toHaveBeenCalledWith('example.com { reverse_proxy localhost:8080 }') expect(result.current.loading).toBe(false) }) @@ -130,7 +130,7 @@ describe('useImport', () => { await result.current.commit({ 'test.com': 'skip' }) }) - expect(api.commitImport).toHaveBeenCalledWith('session-2', { 'test.com': 'skip' }) + expect(api.commitImport).toHaveBeenCalledWith({ 'test.com': 'skip' }) await waitFor(() => { expect(result.current.session).toBeNull() @@ -149,7 +149,9 @@ describe('useImport', () => { vi.mocked(api.uploadCaddyfile).mockResolvedValue({ session: mockSession }) vi.mocked(api.getImportStatus).mockResolvedValue({ has_pending: true, session: mockSession }) vi.mocked(api.getImportPreview).mockResolvedValue({ hosts: [], conflicts: [], errors: [] }) - vi.mocked(api.cancelImport).mockResolvedValue(undefined) + vi.mocked(api.cancelImport).mockImplementation(async () => { + vi.mocked(api.getImportStatus).mockResolvedValue({ has_pending: false }) + }) const { result } = renderHook(() => useImport(), { wrapper: createWrapper() }) @@ -165,7 +167,7 @@ describe('useImport', () => { await result.current.cancel() }) - expect(api.cancelImport).toHaveBeenCalledWith('session-3') + expect(api.cancelImport).toHaveBeenCalled() await waitFor(() => { expect(result.current.session).toBeNull() }) diff --git a/frontend/src/hooks/__tests__/useProxyHosts.test.tsx b/frontend/src/hooks/__tests__/useProxyHosts.test.tsx index 011c709f..f453c4bd 100644 --- a/frontend/src/hooks/__tests__/useProxyHosts.test.tsx +++ b/frontend/src/hooks/__tests__/useProxyHosts.test.tsx @@ -76,7 +76,10 @@ describe('useProxyHosts', () => { const newHost = { domain_names: 'new.com', forward_host: 'localhost', forward_port: 9000 } const createdHost = { uuid: '3', ...newHost, enabled: true } - vi.mocked(api.createProxyHost).mockResolvedValue(createdHost) + vi.mocked(api.createProxyHost).mockImplementation(async () => { + vi.mocked(api.getProxyHosts).mockResolvedValue([createdHost]) + return createdHost + }) const { result } = renderHook(() => useProxyHosts(), { wrapper: createWrapper() }) @@ -96,10 +99,14 @@ describe('useProxyHosts', () => { it('updates an existing proxy host', async () => { const existingHost = { uuid: '1', domain_names: 'test.com', enabled: true, forward_host: 'localhost', forward_port: 8080 } - vi.mocked(api.getProxyHosts).mockResolvedValue([existingHost]) + let hosts = [existingHost] + vi.mocked(api.getProxyHosts).mockImplementation(() => Promise.resolve(hosts)) const updatedHost = { ...existingHost, domain_names: 'updated.com' } - vi.mocked(api.updateProxyHost).mockResolvedValue(updatedHost) + vi.mocked(api.updateProxyHost).mockImplementation(async (uuid, data) => { + hosts = [{ ...existingHost, ...data }] + return hosts[0] + }) const { result } = renderHook(() => useProxyHosts(), { wrapper: createWrapper() }) @@ -123,7 +130,10 @@ describe('useProxyHosts', () => { { uuid: '2', domain_names: 'app.com', enabled: true, forward_host: 'localhost', forward_port: 3000 }, ] vi.mocked(api.getProxyHosts).mockResolvedValue(hosts) - vi.mocked(api.deleteProxyHost).mockResolvedValue(undefined) + vi.mocked(api.deleteProxyHost).mockImplementation(async (uuid) => { + const remaining = hosts.filter(h => h.uuid !== uuid) + vi.mocked(api.getProxyHosts).mockResolvedValue(remaining) + }) const { result } = renderHook(() => useProxyHosts(), { wrapper: createWrapper() }) diff --git a/frontend/src/hooks/__tests__/useRemoteServers.test.tsx b/frontend/src/hooks/__tests__/useRemoteServers.test.tsx index 1b51a96e..d1e4a08a 100644 --- a/frontend/src/hooks/__tests__/useRemoteServers.test.tsx +++ b/frontend/src/hooks/__tests__/useRemoteServers.test.tsx @@ -58,28 +58,6 @@ describe('useRemoteServers', () => { expect(api.getRemoteServers).toHaveBeenCalledOnce() }) - it('filters enabled servers', async () => { - const mockServers = [ - { uuid: '1', name: 'Server 1', host: 'localhost', port: 8080, enabled: true }, - { uuid: '2', name: 'Server 2', host: '192.168.1.100', port: 3000, enabled: false }, - { uuid: '3', name: 'Server 3', host: '10.0.0.1', port: 9000, enabled: true }, - ] - - vi.mocked(api.getRemoteServers).mockResolvedValue(mockServers) - - const { result } = renderHook(() => useRemoteServers(), { wrapper: createWrapper() }) - - await waitFor(() => { - expect(result.current.loading).toBe(false) - }) - - expect(result.current.enabledServers).toHaveLength(2) - expect(result.current.enabledServers).toEqual([ - mockServers[0], - mockServers[2], - ]) - }) - it('handles loading errors', async () => { const mockError = new Error('Network error') vi.mocked(api.getRemoteServers).mockRejectedValue(mockError) @@ -92,15 +70,17 @@ describe('useRemoteServers', () => { expect(result.current.error).toBe('Network error') expect(result.current.servers).toEqual([]) - expect(result.current.enabledServers).toEqual([]) }) it('creates a new remote server', async () => { vi.mocked(api.getRemoteServers).mockResolvedValue([]) - const newServer = { name: 'New Server', host: 'new.local', port: 5000, enabled: true, provider: 'generic' } - const createdServer = { uuid: '4', ...newServer } + const newServer = { name: 'New Server', host: 'new.local', port: 5000, provider: 'generic' } + const createdServer = { uuid: '4', ...newServer, enabled: true } - vi.mocked(api.createRemoteServer).mockResolvedValue(createdServer) + vi.mocked(api.createRemoteServer).mockImplementation(async () => { + vi.mocked(api.getRemoteServers).mockResolvedValue([createdServer]) + return createdServer + }) const { result } = renderHook(() => useRemoteServers(), { wrapper: createWrapper() }) @@ -120,10 +100,14 @@ describe('useRemoteServers', () => { it('updates an existing remote server', async () => { const existingServer = { uuid: '1', name: 'Server 1', host: 'localhost', port: 8080, enabled: true } - vi.mocked(api.getRemoteServers).mockResolvedValue([existingServer]) + let servers = [existingServer] + vi.mocked(api.getRemoteServers).mockImplementation(() => Promise.resolve(servers)) const updatedServer = { ...existingServer, name: 'Updated Server' } - vi.mocked(api.updateRemoteServer).mockResolvedValue(updatedServer) + vi.mocked(api.updateRemoteServer).mockImplementation(async (uuid, data) => { + servers = [{ ...existingServer, ...data }] + return servers[0] + }) const { result } = renderHook(() => useRemoteServers(), { wrapper: createWrapper() }) @@ -147,7 +131,10 @@ describe('useRemoteServers', () => { { uuid: '2', name: 'Server 2', host: '192.168.1.100', port: 3000, enabled: false }, ] vi.mocked(api.getRemoteServers).mockResolvedValue(servers) - vi.mocked(api.deleteRemoteServer).mockResolvedValue(undefined) + vi.mocked(api.deleteRemoteServer).mockImplementation(async (uuid) => { + const remaining = servers.filter(s => s.uuid !== uuid) + vi.mocked(api.getRemoteServers).mockResolvedValue(remaining) + }) const { result } = renderHook(() => useRemoteServers(), { wrapper: createWrapper() }) diff --git a/frontend/src/hooks/useImport.ts b/frontend/src/hooks/useImport.ts index 3345ecf0..7742824e 100644 --- a/frontend/src/hooks/useImport.ts +++ b/frontend/src/hooks/useImport.ts @@ -35,7 +35,7 @@ export function useImport() { }); const uploadMutation = useMutation({ - mutationFn: uploadCaddyfile, + mutationFn: (content: string) => uploadCaddyfile(content), onSuccess: () => { queryClient.invalidateQueries({ queryKey: QUERY_KEY }); queryClient.invalidateQueries({ queryKey: ['import-preview'] }); @@ -43,7 +43,7 @@ export function useImport() { }); const commitMutation = useMutation({ - mutationFn: commitImport, + mutationFn: (resolutions: Record) => commitImport(resolutions), onSuccess: () => { queryClient.invalidateQueries({ queryKey: QUERY_KEY }); queryClient.invalidateQueries({ queryKey: ['import-preview'] }); @@ -53,7 +53,7 @@ export function useImport() { }); const cancelMutation = useMutation({ - mutationFn: cancelImport, + mutationFn: () => cancelImport(), onSuccess: () => { queryClient.invalidateQueries({ queryKey: QUERY_KEY }); queryClient.invalidateQueries({ queryKey: ['import-preview'] }); diff --git a/frontend/src/hooks/useProxyHosts.ts b/frontend/src/hooks/useProxyHosts.ts index 5b717a7b..536fe1f9 100644 --- a/frontend/src/hooks/useProxyHosts.ts +++ b/frontend/src/hooks/useProxyHosts.ts @@ -18,7 +18,7 @@ export function useProxyHosts() { }); const createMutation = useMutation({ - mutationFn: createProxyHost, + mutationFn: (host: Partial) => createProxyHost(host), onSuccess: () => { queryClient.invalidateQueries({ queryKey: QUERY_KEY }); }, @@ -33,7 +33,7 @@ export function useProxyHosts() { }); const deleteMutation = useMutation({ - mutationFn: deleteProxyHost, + mutationFn: (uuid: string) => deleteProxyHost(uuid), onSuccess: () => { queryClient.invalidateQueries({ queryKey: QUERY_KEY }); }, diff --git a/frontend/src/hooks/useRemoteServers.ts b/frontend/src/hooks/useRemoteServers.ts index 279b1544..947844e2 100644 --- a/frontend/src/hooks/useRemoteServers.ts +++ b/frontend/src/hooks/useRemoteServers.ts @@ -19,7 +19,7 @@ export function useRemoteServers(enabledOnly = false) { }); const createMutation = useMutation({ - mutationFn: createRemoteServer, + mutationFn: (server: Partial) => createRemoteServer(server), onSuccess: () => { queryClient.invalidateQueries({ queryKey: QUERY_KEY }); }, @@ -34,14 +34,14 @@ export function useRemoteServers(enabledOnly = false) { }); const deleteMutation = useMutation({ - mutationFn: deleteRemoteServer, + mutationFn: (uuid: string) => deleteRemoteServer(uuid), onSuccess: () => { queryClient.invalidateQueries({ queryKey: QUERY_KEY }); }, }); const testConnectionMutation = useMutation({ - mutationFn: testRemoteServerConnection, + mutationFn: (uuid: string) => testRemoteServerConnection(uuid), }); return {