import { renderHook, waitFor } from '@testing-library/react';
import useRequest from '../useRequest';

describe('when loading', () => {
    test('returns { loading: true }', () => {
        // Use a stable reference to avoid infinite re-renders
        const request = async () => await new Promise(() => {});
        const { result } = renderHook(() => useRequest(request));
        expect(result.current).toEqual({ loading: true });
    });
});

describe('on done', () => {
    test('returns { loading: false, data }', async () => {
        const data = { value: 'of something' };
        // Use a stable reference to avoid infinite re-renders
        const request = async () => await Promise.resolve(data);
        const { result } = renderHook(() => useRequest(request));

        await waitFor(() =>
            expect(result.current).toEqual({ loading: false, data })
        );
    });
});

describe('on failed', () => {
    test('returns { loading: false, error }', async () => {
        const error = 'ERROR';
        // Use a stable reference to avoid infinite re-renders
        const request = async () => await Promise.reject(error);
        const { result } = renderHook(() => useRequest(request));

        await waitFor(() =>
            expect(result.current).toEqual({ loading: false, error })
        );
    });
});
