import { renderHook } from '@testing-library/react'
import useAsyncLifecycle from '../hooks/useAsyncLifecycle'

describe('useAsyncLifecycle', () => {
	it('aborts previous controllers when begin is called again', () => {
		const { result } = renderHook(() => useAsyncLifecycle())

		const first = result.current.begin()
		expect(first.signal.aborted).toBe(false)

		const second = result.current.begin()
		expect(first.signal.aborted).toBe(true)
		expect(second.signal.aborted).toBe(false)
		expect(result.current.controllerRef.current).toBe(second)
	})

	it('marks the hook as unmounted and aborts on cleanup', () => {
		const { result, unmount } = renderHook(() => useAsyncLifecycle())

		const controller = result.current.begin()
		expect(result.current.mountedRef.current).toBe(true)

		unmount()

		expect(result.current.mountedRef.current).toBe(false)
		expect(controller.signal.aborted).toBe(true)
	})
})
