The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
grafana/public/app/features/dashboard-scene/settings/GeneralSettingsEditView.tes...

139 lines
4.3 KiB

import { behaviors, SceneTimeRange } from '@grafana/scenes';
import { DashboardCursorSync } from '@grafana/schema';
import * as utils from '../pages/utils';
import { DashboardControls } from '../scene/DashboardControls';
import { DashboardScene } from '../scene/DashboardScene';
import { activateFullSceneTree } from '../utils/test-utils';
import { GeneralSettingsEditView } from './GeneralSettingsEditView';
describe('GeneralSettingsEditView', () => {
describe('Dashboard state', () => {
let dashboard: DashboardScene;
let settings: GeneralSettingsEditView;
beforeEach(async () => {
const result = await buildTestScene();
dashboard = result.dashboard;
settings = result.settings;
});
it('should return the correct urlKey', () => {
expect(settings.getUrlKey()).toBe('settings');
});
it('should return the dashboard', () => {
expect(settings.getDashboard()).toBe(dashboard);
});
it('should return the dashboard time range', () => {
expect(settings.getTimeRange()).toBe(dashboard.state.$timeRange);
});
it('should return the cursor sync', () => {
expect(settings.getCursorSync()).toBe(dashboard.state.$behaviors?.[0]);
});
});
describe('Dashboard updates', () => {
let dashboard: DashboardScene;
let settings: GeneralSettingsEditView;
beforeEach(async () => {
const result = await buildTestScene();
dashboard = result.dashboard;
settings = result.settings;
});
it('should have isDirty false', () => {
expect(dashboard.state.isDirty).toBeFalsy();
});
it('A change to title updates the dashboard state', () => {
settings.onTitleChange('new title');
expect(dashboard.state.title).toBe('new title');
});
it('A change to description updates the dashboard state', () => {
settings.onDescriptionChange('new description');
expect(dashboard.state.description).toBe('new description');
});
it('A change to description updates the dashboard state', () => {
settings.onTagsChange(['tag1', 'tag2']);
expect(dashboard.state.tags).toEqual(['tag1', 'tag2']);
});
it('A change to editable permissions updates the dashboard state', () => {
settings.onEditableChange(false);
expect(dashboard.state.editable).toBe(false);
});
it('A change to timezone updates the dashboard state', () => {
settings.onTimeZoneChange('UTC');
expect(dashboard.state.$timeRange?.state.timeZone).toBe('UTC');
});
it('A change to week start updates the dashboard state', () => {
settings.onWeekStartChange('monday');
expect(settings.getTimeRange().state.weekStart).toBe('monday');
});
it('A change to refresh interval updates the dashboard state', () => {
settings.onRefreshIntervalChange(['5s']);
expect(settings.getRefreshPicker()?.state?.intervals).toEqual(['5s']);
});
it('A change to folder updates the dashboard state', async () => {
const updateNavModel = jest.spyOn(utils, 'updateNavModel').mockImplementation(jest.fn());
await settings.onFolderChange('folder-2', 'folder 2');
expect(dashboard.state.meta.folderUid).toBe('folder-2');
expect(dashboard.state.meta.folderTitle).toBe('folder 2');
expect(updateNavModel).toHaveBeenCalledWith('folder-2');
});
it('A change to tooltip settings updates the dashboard state', () => {
settings.onTooltipChange(DashboardCursorSync.Crosshair);
expect(settings.getCursorSync()?.state.sync).toBe(DashboardCursorSync.Crosshair);
});
it('A change to time picker visiblity settings updates the dashboard state', () => {
settings.onHideTimePickerChange(true);
expect(settings.getDashboardControls()?.state.hideTimeControls).toBe(true);
});
});
});
async function buildTestScene() {
const settings = new GeneralSettingsEditView({});
const dashboard = new DashboardScene({
$timeRange: new SceneTimeRange({}),
$behaviors: [new behaviors.CursorSync({ sync: DashboardCursorSync.Off })],
controls: new DashboardControls({}),
title: 'hello',
uid: 'dash-1',
meta: {
canEdit: true,
},
editview: settings,
});
activateFullSceneTree(dashboard);
await new Promise((r) => setTimeout(r, 1));
dashboard.onEnterEditMode();
settings.activate();
return { dashboard, settings };
}