import { act, renderHook } from '@testing-library/react'
import { HookError } from '../hooks/types'
import { useSecureOperation } from '../hooks/useSecureOperation'

describe('useSecureOperation', () => {
	it('reports success when the callback resolves', async () => {
		const { result } = renderHook(() => useSecureOperation())

		await act(async () => {
			await result.current.execute(async () => {
				await Promise.resolve()
			})
		})

		expect(result.current.error).toBeNull()
		expect(result.current.isLoading).toBe(false)
		expect(result.current.isPending).toBe(false)
	})

	it('wraps thrown errors in HookError', async () => {
		const { result } = renderHook(() => useSecureOperation())

		await act(async () => {
			await result.current.execute(async () => {
				throw new Error('boom')
			})
		})

		expect(result.current.error).toBeInstanceOf(HookError)
		expect(result.current.isLoading).toBe(false)
		expect(result.current.isPending).toBe(false)
		expect(result.current.error?.message).toContain(
			'useSecureOperation.execute'
		)
	})
})
