diff --git a/frontend/src/container/GridCardLayout/GridCard/WidgetGraphComponent.test.tsx b/frontend/src/container/GridCardLayout/GridCard/WidgetGraphComponent.test.tsx new file mode 100644 index 0000000000..cc8d35ad9c --- /dev/null +++ b/frontend/src/container/GridCardLayout/GridCard/WidgetGraphComponent.test.tsx @@ -0,0 +1,233 @@ +import { fireEvent, render, screen } from '@testing-library/react'; +import { PANEL_TYPES } from 'constants/queryBuilder'; +import ROUTES from 'constants/routes'; +import { AppProvider } from 'providers/App/App'; +import MockQueryClientProvider from 'providers/test/MockQueryClientProvider'; +import { Provider } from 'react-redux'; +import store from 'store'; +import { DataTypes } from 'types/api/queryBuilder/queryAutocompleteResponse'; +import { EQueryType } from 'types/common/dashboard'; +import { DataSource } from 'types/common/queryBuilder'; + +import { + MENUITEM_KEYS_VS_LABELS, + MenuItemKeys, +} from '../WidgetHeader/contants'; +import { WidgetGraphComponentProps } from './types'; +import WidgetGraphComponent from './WidgetGraphComponent'; + +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useLocation: (): { pathname: string } => ({ + pathname: `${process.env.FRONTEND_API_ENDPOINT}/${ROUTES.DASHBOARD}/624652db-6097-42f5-bbca-e9012901db00`, + }), +})); + +jest.mock('uplot', () => { + const paths = { + spline: jest.fn(), + bars: jest.fn(), + }; + const uplotMock = jest.fn(() => ({ + paths, + })); + return { + paths, + default: uplotMock, + }; +}); + +// Mock data +const mockProps: WidgetGraphComponentProps = { + widget: { + bucketCount: 30, + bucketWidth: 0, + columnUnits: {}, + description: '', + fillSpans: false, + id: '17f905f6-d355-46bd-a78e-cbc87e6f58cc', + isStacked: false, + mergeAllActiveQueries: false, + nullZeroValues: 'zero', + opacity: '1', + panelTypes: PANEL_TYPES.VALUE, + query: { + builder: { + queryData: [ + { + aggregateAttribute: { + dataType: DataTypes.String, + id: 'span_id--string----true', + isColumn: true, + isJSON: false, + key: 'span_id', + type: '', + }, + aggregateOperator: 'count_distinct', + dataSource: DataSource.TRACES, + disabled: false, + expression: 'A', + filters: { + items: [], + op: 'AND', + }, + functions: [], + groupBy: [], + having: [], + legend: '', + limit: null, + orderBy: [], + queryName: 'A', + reduceTo: 'last', + spaceAggregation: 'sum', + stepInterval: 60, + timeAggregation: 'count_distinct', + }, + ], + queryFormulas: [], + }, + clickhouse_sql: [ + { + disabled: false, + legend: '', + name: 'A', + query: '', + }, + ], + id: '47449208-2c76-4465-9c62-a37fb4f5f11f', + promql: [ + { + disabled: false, + legend: '', + name: 'A', + query: '', + }, + ], + queryType: EQueryType.QUERY_BUILDER, + }, + selectedLogFields: [ + { + dataType: 'string', + name: 'body', + type: '', + }, + { + dataType: 'string', + name: 'timestamp', + type: '', + }, + ], + selectedTracesFields: [], + softMax: 0, + softMin: 0, + stackedBarChart: false, + thresholds: [], + timePreferance: 'GLOBAL_TIME', + title: 'Test Dashboard', + yAxisUnit: 'none', + }, + queryResponse: { + status: 'loading', + isLoading: true, + isSuccess: false, + isError: false, + isIdle: false, + dataUpdatedAt: 0, + error: null, + errorUpdatedAt: 0, + failureCount: 0, + errorUpdateCount: 0, + isFetched: false, + isFetchedAfterMount: false, + isFetching: true, + isRefetching: false, + isLoadingError: false, + isPlaceholderData: false, + isPreviousData: false, + isRefetchError: false, + isStale: true, + data: undefined, + refetch: jest.fn(), + remove: jest.fn(), + }, + errorMessage: '', + version: 'v4', + headerMenuList: [ + MenuItemKeys.View, + MenuItemKeys.Clone, + MenuItemKeys.Delete, + MenuItemKeys.Edit, + MenuItemKeys.CreateAlerts, + ], + isWarning: false, + isFetchingResponse: false, + setRequestData: jest.fn(), + onClickHandler: jest.fn(), + onDragSelect: jest.fn(), + openTracesButton: false, + onOpenTraceBtnClick: jest.fn(), +}; + +// Mock useDashabord hook +jest.mock('providers/Dashboard/Dashboard', () => ({ + useDashboard: (): any => ({ + selectedDashboard: { + data: { + variables: [], + }, + }, + }), +})); + +describe('WidgetGraphComponent', () => { + it('should show correct menu items when hovering over more options while loading', async () => { + const { getByTestId, findByRole, getByText, container } = render( + + + + + + + , + ); + + expect(getByText('Test Dashboard')).toBeInTheDocument(); + + // check if skeleton is rendered + const skeleton = container.querySelector('.ant-skeleton'); + expect(skeleton).toBeInTheDocument(); + + const moreOptionsButton = getByTestId('widget-header-options'); + fireEvent.mouseEnter(moreOptionsButton); + + const menu = await findByRole('menu'); + expect(menu).toBeInTheDocument(); + + // Check if all menu items are present + const expectedMenuItems = [ + MENUITEM_KEYS_VS_LABELS[MenuItemKeys.View], + MENUITEM_KEYS_VS_LABELS[MenuItemKeys.Clone], + MENUITEM_KEYS_VS_LABELS[MenuItemKeys.Delete], + MENUITEM_KEYS_VS_LABELS[MenuItemKeys.Edit], + MENUITEM_KEYS_VS_LABELS[MenuItemKeys.CreateAlerts], + ]; + + // check that menu is visible + expectedMenuItems.forEach((item) => { + expect(screen.getByText(item)).toBeInTheDocument(); + }); + }); +}); diff --git a/frontend/src/container/GridCardLayout/GridCard/WidgetGraphComponent.tsx b/frontend/src/container/GridCardLayout/GridCard/WidgetGraphComponent.tsx index 097463f946..74022b2c0a 100644 --- a/frontend/src/container/GridCardLayout/GridCard/WidgetGraphComponent.tsx +++ b/frontend/src/container/GridCardLayout/GridCard/WidgetGraphComponent.tsx @@ -229,21 +229,6 @@ function WidgetGraphComponent({ const [searchTerm, setSearchTerm] = useState(''); - const loadingState = - (queryResponse.isLoading || queryResponse.status === 'idle') && - widget.panelTypes !== PANEL_TYPES.LIST; - - if (loadingState) { - return ( - - ); - } - return (