import { QueryClientProvider } from '@tanstack/react-query' import { renderHook, waitFor } from '@testing-library/react-native' import React from 'react' import { buildTestQueryClient } from '../../__utils__/query_client' import { useApiClient } from '../../hooks/use_api_client' import { useDirectMessageEligibility } from '../../hooks/use_direct_message_eligibility' jest.mock('../../hooks/use_api_client') const mockedUseApiClient = useApiClient as jest.MockedFunction const mockGet = jest.fn() beforeEach(() => { mockGet.mockReset() mockedUseApiClient.mockReturnValue({ chat: { get: mockGet } } as any) }) const createWrapper = () => { const queryClient = buildTestQueryClient() return ({ children }: { children: React.ReactNode }) => ( {children} ) } const args = { groupId: 'Groups-Group-42', personId: 75179873 } test("reads the member's eligibility from the chat group", async () => { mockGet.mockResolvedValue({ data: { id: '75179873', type: 'Member', canDirectMessage: false, directMessagesDisabled: true, }, }) const { result } = renderHook(() => useDirectMessageEligibility(args), { wrapper: createWrapper(), }) await waitFor(() => expect(result.current.eligibility).toBeDefined()) expect(mockGet).toHaveBeenCalledWith({ url: '/me/groups/Groups-Group-42/members/75179873', data: { fields: { Member: ['can_direct_message', 'direct_messages_disabled'] } }, }) expect(result.current.eligibility).toEqual({ canDirectMessage: false, directMessagesDisabled: true, }) }) test('has no answer until the member loads', () => { mockGet.mockReturnValue(new Promise(() => {})) const { result } = renderHook(() => useDirectMessageEligibility(args), { wrapper: createWrapper(), }) expect(result.current.eligibility).toBeUndefined() expect(result.current.isLoading).toBe(true) }) test('reports a failed lookup without an answer', async () => { mockGet.mockRejectedValue(new Error('404')) const { result } = renderHook(() => useDirectMessageEligibility(args), { wrapper: createWrapper(), }) await waitFor(() => expect(result.current.isError).toBe(true)) expect(result.current.eligibility).toBeUndefined() expect(result.current.isLoading).toBe(false) }) test('does not ask when disabled', () => { renderHook(() => useDirectMessageEligibility({ ...args, enabled: false }), { wrapper: createWrapper(), }) expect(mockGet).not.toHaveBeenCalled() })