import { DefaultTheme, ThemeProvider } from '@react-navigation/native' import { render } from '@testing-library/react-native' import React from 'react' import { SafeAreaProvider } from 'react-native-safe-area-context' import { useFindOrCreateServicesConversation } from '../../../../hooks/services/use_find_or_create_services_conversation' import { useTeamMembersForNewConversation } from '../../../../hooks/services/use_team_members_for_new_conversation' import { ServicesForm } from '../../../../screens/conversation_new/components/services_form' jest.mock('react-native-reanimated', () => ({ ...jest.requireActual('react-native-reanimated/mock'), LayoutAnimationConfig: ({ children }: { children: React.ReactNode }) => children, useReducedMotion: () => false, })) jest.mock('@react-navigation/native', () => ({ ...jest.requireActual('@react-navigation/native'), useNavigation: () => ({ navigate: jest.fn(), dispatch: jest.fn(), getParent: () => undefined }), })) jest.mock('../../../../hooks/use_api_client', () => ({ useApiClient: () => ({}) })) jest.mock('../../../../hooks/use_upload_client', () => ({ useUploadClient: () => ({}) })) jest.mock('../../../../hooks/use_features', () => ({ ...jest.requireActual('../../../../hooks/use_features'), useFeatures: () => ({ features: [], featureEnabled: () => false }), })) jest.mock('../../../../hooks/use_conversation_validate', () => ({ useConversationValidate: () => ({ warnings: [], validationPending: false }), })) jest.mock('../../../../hooks/services/use_services_chat_conversation_payload', () => ({ useServicesChatConversationPayload: () => ({ payload: undefined, isLoading: false }), })) jest.mock('../../../../hooks/services/use_services_team', () => ({ useServicesTeams: () => [], })) jest.mock('../../../../hooks/services/use_team_plans', () => ({ useTeamPlans: () => ({ planOptions: [], isFetching: false, isError: false, findPlan: () => undefined, }), })) jest.mock('../../../../hooks/services/use_team_members_for_new_conversation', () => ({ useTeamMembersForNewConversation: jest.fn(() => ({ members: [], isError: false })), })) jest.mock('../../../../hooks/services/use_find_or_create_services_conversation', () => ({ useFindOrCreateServicesConversation: jest.fn(() => ({ mutate: jest.fn(), isPending: false, selectionHasConversation: false, isLoadingConversationCheck: false, })), })) const mockedFindOrCreate = jest.mocked(useFindOrCreateServicesConversation) const mockedTeamMembers = jest.mocked(useTeamMembersForNewConversation) const latestArgs = (mock: T) => mock.mock.calls.at(-1)?.[0] const safeAreaMetrics = { frame: { x: 0, y: 0, width: 390, height: 844 }, insets: { top: 0, right: 0, bottom: 0, left: 0 }, } const renderForm = (props: { initialPlanId?: number } = {}) => render( ) describe('ServicesForm', () => { beforeEach(() => { jest.clearAllMocks() }) it('filters by plan when opened from a plan', () => { const { getByRole } = renderForm({ initialPlanId: 42 }) expect(getByRole('switch').props.value).toBe(true) expect(latestArgs(mockedFindOrCreate)).toMatchObject({ teamIds: [1, 2], planId: 42 }) expect(latestArgs(mockedTeamMembers)).toMatchObject({ teamIds: [1, 2], planId: 42 }) }) it('does not filter by plan when opened without a plan', () => { const { getByRole } = renderForm() expect(getByRole('switch').props.value).toBe(false) expect(latestArgs(mockedFindOrCreate)).toMatchObject({ teamIds: [1, 2], planId: undefined }) expect(latestArgs(mockedTeamMembers)).toMatchObject({ teamIds: [1, 2], planId: undefined }) }) })