import { render, screen } from '@testing-library/react'; import { AssistantHook, useAssistant } from '@grafana/assistant'; import { CoreApp, DataSourceInstanceSettings } from '@grafana/data'; import { DataQuery } from '@grafana/schema'; import { QueryActionAssistantButton } from './QueryActionAssistantButton'; // Mock the assistant hook jest.mock('@grafana/assistant', () => ({ useAssistant: jest.fn(), createAssistantContextItem: jest.fn(), })); // Mock the runtime services that assistant depends on const mockConfig = { featureToggles: { queryWithAssistant: false, }, }; jest.mock('@grafana/runtime', () => ({ ...jest.requireActual('@grafana/runtime'), usePluginLinks: jest.fn().mockReturnValue({ links: [], isLoading: false }), get config() { return mockConfig; }, })); const useAssistantMock = jest.mocked(useAssistant); const mockDataSourceInstance: DataSourceInstanceSettings = { uid: 'test-uid', name: 'Test Datasource', type: 'loki', } as DataSourceInstanceSettings; const mockQuery: DataQuery = { refId: 'A', }; const mockQueries: DataQuery[] = [mockQuery]; const defaultProps = { query: mockQuery, queries: mockQueries, dataSourceInstanceSettings: mockDataSourceInstance, app: CoreApp.Explore, datasourceApi: null, }; describe('QueryActionAssistantButton', () => { beforeEach(() => { jest.clearAllMocks(); // Default: feature toggle enabled, assistant available mockConfig.featureToggles.queryWithAssistant = true; useAssistantMock.mockReturnValue({ isAvailable: true, openAssistant: jest.fn(), } as unknown as AssistantHook); }); it('should render nothing when feature toggle is disabled', () => { mockConfig.featureToggles.queryWithAssistant = false; useAssistantMock.mockReturnValue({ isAvailable: true, openAssistant: jest.fn(), } as unknown as AssistantHook); const { container } = render(); expect(container.firstChild).toBeNull(); }); it('should render nothing when app is not Explore, Dashboard, or PanelEditor', () => { const { container } = render(); expect(container.firstChild).toBeNull(); }); it('should render nothing when Assistant is not available', () => { mockConfig.featureToggles.queryWithAssistant = true; useAssistantMock.mockReturnValue({ isAvailable: false, openAssistant: undefined, } as unknown as AssistantHook); const { container } = render(); expect(container.firstChild).toBeNull(); }); it('should render nothing when openAssistant is not provided', () => { mockConfig.featureToggles.queryWithAssistant = true; useAssistantMock.mockReturnValue({ isAvailable: true, openAssistant: undefined, } as unknown as AssistantHook); const { container } = render(); expect(container.firstChild).toBeNull(); }); it('should render button when feature toggle is enabled and assistant is available', () => { mockConfig.featureToggles.queryWithAssistant = true; const mockOpenAssistant = jest.fn(); useAssistantMock.mockReturnValue({ isAvailable: true, openAssistant: mockOpenAssistant, } as unknown as AssistantHook); render(); const button = screen.getByRole('button', { name: /query with assistant/i }); expect(button).toBeInTheDocument(); }); });