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

113 lines
4.4 KiB
TypeScript

import { act, fireEvent } from '@testing-library/react';
import { DateTime, makeTimeRange, dateMath } from '@grafana/data';
import { MultiValueVariable, sceneGraph, VariableValue } from '@grafana/scenes';
import { defaultTimeZone, TimeZone } from '@grafana/schema';
import { DashboardScene } from 'app/features/dashboard-scene/scene/DashboardScene';
import { scopesSelectorScene } from '../../instance';
import {
dashboardReloadSpy,
fetchDashboardsSpy,
fetchNodesSpy,
fetchScopeSpy,
fetchSelectedScopesSpy,
getMock,
} from './mocks';
import {
getDashboardFolderExpand,
getDashboardsExpand,
getDashboardsSearch,
getNotFoundForFilterClear,
getPersistedApplicationsMimirSelect,
getResultApplicationsCloudDevSelect,
getResultApplicationsCloudExpand,
getResultApplicationsCloudSelect,
getResultApplicationsExpand,
getResultApplicationsGrafanaSelect,
getResultApplicationsMimirSelect,
getResultCloudDevRadio,
getResultCloudExpand,
getResultCloudOpsRadio,
getResultCloudSelect,
getSelectorApply,
getSelectorCancel,
getSelectorInput,
getTreeSearch,
} from './selectors';
export const clearMocks = () => {
fetchNodesSpy.mockClear();
fetchScopeSpy.mockClear();
fetchSelectedScopesSpy.mockClear();
fetchDashboardsSpy.mockClear();
dashboardReloadSpy.mockClear();
getMock.mockClear();
};
const click = async (selector: () => HTMLElement) => act(() => fireEvent.click(selector()));
const type = async (selector: () => HTMLInputElement, value: string) => {
await act(() => fireEvent.input(selector(), { target: { value } }));
await jest.runOnlyPendingTimersAsync();
};
export const updateScopes = async (scopes: string[]) =>
act(async () =>
scopesSelectorScene?.updateScopes(
scopes.map((scopeName) => ({
scopeName,
path: [],
}))
)
);
export const openSelector = async () => click(getSelectorInput);
export const applyScopes = async () => {
await click(getSelectorApply);
await jest.runOnlyPendingTimersAsync();
};
export const cancelScopes = async () => click(getSelectorCancel);
export const searchScopes = async (value: string) => type(getTreeSearch, value);
export const clearScopesSearch = async () => type(getTreeSearch, '');
export const expandResultApplications = async () => click(getResultApplicationsExpand);
export const expandResultApplicationsCloud = async () => click(getResultApplicationsCloudExpand);
export const expandResultCloud = async () => click(getResultCloudExpand);
export const selectResultApplicationsGrafana = async () => click(getResultApplicationsGrafanaSelect);
export const selectPersistedApplicationsMimir = async () => click(getPersistedApplicationsMimirSelect);
export const selectResultApplicationsMimir = async () => click(getResultApplicationsMimirSelect);
export const selectResultApplicationsCloud = async () => click(getResultApplicationsCloudSelect);
export const selectResultApplicationsCloudDev = async () => click(getResultApplicationsCloudDevSelect);
export const selectResultCloud = async () => click(getResultCloudSelect);
export const selectResultCloudDev = async () => click(getResultCloudDevRadio);
export const selectResultCloudOps = async () => click(getResultCloudOpsRadio);
export const toggleDashboards = async () => click(getDashboardsExpand);
export const searchDashboards = async (value: string) => type(getDashboardsSearch, value);
export const clearNotFound = async () => click(getNotFoundForFilterClear);
export const expandDashboardFolder = (folder: string) => click(() => getDashboardFolderExpand(folder));
export const enterEditMode = async (dashboardScene: DashboardScene) =>
act(async () => dashboardScene.onEnterEditMode());
export const updateTimeRange = async (
dashboardScene: DashboardScene,
from: DateTime | string = 'now-6h',
to: DateTime | string = 'now',
timeZone: TimeZone = defaultTimeZone
) =>
act(async () =>
sceneGraph
.getTimeRange(dashboardScene)
.onTimeRangeChange(makeTimeRange(dateMath.parse(from, false, timeZone)!, dateMath.parse(to, false, timeZone)!))
);
export const updateVariable = async (dashboardScene: DashboardScene, name: string, value: VariableValue) => {
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
const variable = sceneGraph.lookupVariable(name, dashboardScene) as MultiValueVariable;
return act(async () => variable.changeValueTo(value));
};
export const updateMyVar = async (dashboardScene: DashboardScene, value: '1' | '2') =>
updateVariable(dashboardScene, 'myVar', value);