// @vitest-environment jsdom import { cleanup, render, screen, waitFor } from '@testing-library/react'; import { afterEach, describe, expect, it, vi } from 'vitest'; import type { ComponentProps } from 'react'; import type { ConnectorDetail } from '@open-design/contracts'; import { CONNECTORS_CHANGED_EVENT } from '../../src/components/connectors-events'; import { EntryView } from '../../src/components/EntryView'; import { fetchConnectorDiscovery, fetchConnectors, fetchConnectorStatuses, } from '../../src/providers/registry'; vi.mock('../../src/components/EntryShell', () => ({ EntryShell: ({ connectors }: { connectors: ConnectorDetail[] }) => (
{connectors.map((connector) => ( {connector.name}:{connector.status} ))}
), })); vi.mock('../../src/providers/registry', async () => { const actual = await vi.importActual( '../../src/providers/registry', ); return { ...actual, fetchConnectorDiscovery: vi.fn(), fetchConnectors: vi.fn(), fetchConnectorStatuses: vi.fn(), }; }); const githubConnector: ConnectorDetail = { id: 'github', name: 'GitHub', provider: 'Composio', category: 'Developer', status: 'available', auth: { provider: 'composio', configured: true }, tools: [], }; const gmailConnector: ConnectorDetail = { id: 'gmail', name: 'Gmail', provider: 'Composio', category: 'Email', status: 'available', auth: { provider: 'composio', configured: true }, tools: [], }; function renderEntryView(overrides: Partial> = {}) { return render( , ); } afterEach(() => { cleanup(); vi.mocked(fetchConnectors).mockReset(); vi.mocked(fetchConnectorDiscovery).mockReset(); vi.mocked(fetchConnectorStatuses).mockReset(); }); describe('EntryView connector refresh', () => { it('inserts newly discovered connected connectors after a connector change event', async () => { vi.mocked(fetchConnectors) .mockResolvedValueOnce([githubConnector]) .mockResolvedValueOnce([githubConnector]); vi.mocked(fetchConnectorDiscovery) .mockResolvedValueOnce([gmailConnector]); vi.mocked(fetchConnectorStatuses) .mockResolvedValueOnce({}) .mockResolvedValueOnce({ gmail: { status: 'connected', accountLabel: 'inbox@example.com' } }); renderEntryView(); await waitFor(() => expect(screen.getByTestId('entry-connectors').textContent).toContain('GitHub:available')); expect(screen.getByTestId('entry-connectors').textContent).not.toContain('Gmail'); window.dispatchEvent(new Event(CONNECTORS_CHANGED_EVENT)); window.dispatchEvent(new Event(CONNECTORS_CHANGED_EVENT)); await waitFor(() => { expect(screen.getByTestId('entry-connectors').textContent).toContain('Gmail:connected'); }); expect(fetchConnectorDiscovery).toHaveBeenCalledWith({ refresh: true }); expect(fetchConnectorDiscovery).toHaveBeenCalledTimes(1); }); });