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

64 lines
1.9 KiB
TypeScript

import { act } from '@testing-library/react';
import { FeatureToggles } from '@grafana/data';
import { config } from '@grafana/runtime';
import { AccessControlAction } from 'app/types';
import { grantUserPermissions } from '../mocks';
import { setFolderAccessControl } from '../mocks/server/configure';
/**
* Flushes out microtasks so we don't get warnings from `@floating-ui/react`
* as per https://floating-ui.com/docs/react#testing
*/
export const flushMicrotasks = async () => {
await act(async () => {
await new Promise((resolve) => setTimeout(resolve, 0));
});
};
/**
* Enables feature toggles `beforeEach` test, and sets back to original settings `afterEach` test
*/
export const testWithFeatureToggles = (featureToggles: Array<keyof FeatureToggles>) => {
const originalToggles = { ...config.featureToggles };
beforeEach(() => {
featureToggles.forEach((featureToggle) => {
config.featureToggles[featureToggle] = true;
});
});
afterEach(() => {
config.featureToggles = originalToggles;
});
};
/**
* Enables license features `beforeEach` test, and sets back to original settings `afterEach` test
*/
export const testWithLicenseFeatures = (features: string[]) => {
const originalFeatures = { ...config.licenseInfo.enabledFeatures };
beforeEach(() => {
config.licenseInfo.enabledFeatures = config.licenseInfo.enabledFeatures || {};
features.forEach((feature) => {
config.licenseInfo.enabledFeatures[feature] = true;
});
});
afterEach(() => {
config.licenseInfo.enabledFeatures = originalFeatures;
});
};
/**
* "Grants" permissions via contextSrv mock, and additionally sets folder access control
* API response to match
*/
export const grantPermissionsHelper = (permissions: AccessControlAction[]) => {
const permissionsHash = permissions.reduce((hash, permission) => ({ ...hash, [permission]: true }), {});
grantUserPermissions(permissions);
setFolderAccessControl(permissionsHash);
};