/** * SIMPLIFIED INTEGRATION TEST: WebView Communication * Starting with minimal test to understand the flow */ import React from 'react'; import { render, waitFor, fireEvent } from '@testing-library/react-native'; import { SoluCXWidgetView as SoluCXWidget } from '../../SoluCXWidgetView'; // Mock only external dependencies jest.mock('react-native-webview', () => { const React = require('react'); const { View, Text } = require('react-native'); return { __esModule: true, WebView: React.forwardRef((props: any, ref: any) => { React.useImperativeHandle(ref, () => ({ injectJavaScript: jest.fn(), })); return ( WebView Mock ); }), }; }); jest.mock('../../services/WidgetBootstrapService', () => ({ requestWidgetUrl: jest.fn().mockResolvedValue({ available: true, url: 'https://survey.url/test' }), })); jest.mock('../../services/WidgetValidationService', () => ({ WidgetValidationService: jest.fn().mockImplementation(() => ({ shouldDisplayForTransaction: jest.fn().mockResolvedValue({ canDisplay: true }), shouldDisplayForTransactionAlreadyAnswered: jest.fn().mockResolvedValue({ canDisplay: true }), shouldDisplayWidget: jest.fn().mockResolvedValue({ canDisplay: true }), })), })); const mockStorage: Record = {}; jest.mock('@react-native-async-storage/async-storage', () => ({ __esModule: true, default: { getItem: jest.fn((key: string) => Promise.resolve(mockStorage[key] || null)), setItem: jest.fn((key: string, value: string) => { mockStorage[key] = value; return Promise.resolve(); }), }, })); describe('Integration: WebView Communication - Simplified', () => { beforeEach(() => { jest.clearAllMocks(); Object.keys(mockStorage).forEach(key => delete mockStorage[key]); }); it('should render WebView in form mode', async () => { const { getByTestId, debug } = render( ); debug(); // Log component tree await waitFor(() => { expect(getByTestId('webview')).toBeTruthy(); }, { timeout: 10000 }); }, 15000); it('should handle FORM_CLOSE message in form mode', async () => { const mockOnClosed = jest.fn(); const { getByTestId } = render( ); await waitFor(() => { expect(getByTestId('webview')).toBeTruthy(); }, { timeout: 3000 }); // Simulate message const webview = getByTestId('webview'); fireEvent(webview, 'message', { nativeEvent: { data: 'FORM_CLOSE' }, }); await waitFor(() => { expect(mockOnClosed).toHaveBeenCalledTimes(1);}, { timeout: 1000 }); }); it('should render WebView in survey mode', async () => { const { getByTestId } = render( ); await waitFor(() => { expect(getByTestId('webview')).toBeTruthy(); }, { timeout: 3000 }); }); it('should handle closeSoluCXWidget message in survey mode', async () => { const mockOnClosed = jest.fn(); const { getByTestId } = render( ); await waitFor(() => { expect(getByTestId('webview')).toBeTruthy(); }, { timeout: 3000 }); const webview = getByTestId('webview'); fireEvent(webview, 'message', { nativeEvent: { data: 'closeSoluCXWidget' }, }); await waitFor(() => { expect(mockOnClosed).toHaveBeenCalledTimes(1); }, { timeout: 1000 }); }); });