// @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);
});
});