2025-04-01 10:38:02 +09:00

84 lines
3.0 KiB
TypeScript

import { config } from '@grafana/runtime';
import { sceneGraph } from '@grafana/scenes';
import { DashboardScene } from 'app/features/dashboard-scene/scene/DashboardScene';
import { getClosestScopesFacade } from '../utils';
import { applyScopes, cancelScopes, openSelector, selectResultCloud, updateScopes } from './utils/actions';
import { expectNotDashboardReload, expectScopesSelectorValue } from './utils/assertions';
import { fetchSelectedScopesSpy, getDatasource, getInstanceSettings, getMock, mocksScopes } from './utils/mocks';
import { renderDashboard, resetScenes } from './utils/render';
jest.mock('@grafana/runtime', () => ({
__esModule: true,
...jest.requireActual('@grafana/runtime'),
useChromeHeaderHeight: jest.fn(),
getBackendSrv: () => ({ get: getMock }),
getDataSourceSrv: () => ({ get: getDatasource, getInstanceSettings }),
usePluginLinks: jest.fn().mockReturnValue({ links: [] }),
}));
describe('Selector', () => {
let dashboardScene: DashboardScene;
beforeAll(() => {
config.featureToggles.scopeFilters = true;
config.featureToggles.groupByVariable = true;
});
beforeEach(() => {
dashboardScene = renderDashboard();
});
afterEach(async () => {
await resetScenes();
});
it('Fetches scope details on save', async () => {
await openSelector();
await selectResultCloud();
await applyScopes();
expect(fetchSelectedScopesSpy).toHaveBeenCalled();
expect(getClosestScopesFacade(dashboardScene)?.value).toEqual(
mocksScopes.filter(({ metadata: { name } }) => name === 'cloud')
);
});
it('Does not save the scopes on close', async () => {
await openSelector();
await selectResultCloud();
await cancelScopes();
expect(fetchSelectedScopesSpy).not.toHaveBeenCalled();
expect(getClosestScopesFacade(dashboardScene)?.value).toEqual([]);
});
it('Shows selected scopes', async () => {
await updateScopes(['grafana']);
expectScopesSelectorValue('Grafana');
});
it('Does not reload the dashboard on scope change', async () => {
await updateScopes(['grafana']);
expectNotDashboardReload();
});
it('Adds scopes to enrichers', async () => {
const queryRunner = sceneGraph.getQueryController(dashboardScene)!;
await updateScopes(['grafana']);
let scopes = mocksScopes.filter(({ metadata: { name } }) => name === 'grafana');
expect(dashboardScene.enrichDataRequest(queryRunner).scopes).toEqual(scopes);
expect(dashboardScene.enrichFiltersRequest().scopes).toEqual(scopes);
await updateScopes(['grafana', 'mimir']);
scopes = mocksScopes.filter(({ metadata: { name } }) => name === 'grafana' || name === 'mimir');
expect(dashboardScene.enrichDataRequest(queryRunner).scopes).toEqual(scopes);
expect(dashboardScene.enrichFiltersRequest().scopes).toEqual(scopes);
await updateScopes(['mimir']);
scopes = mocksScopes.filter(({ metadata: { name } }) => name === 'mimir');
expect(dashboardScene.enrichDataRequest(queryRunner).scopes).toEqual(scopes);
expect(dashboardScene.enrichFiltersRequest().scopes).toEqual(scopes);
});
});