Files
grafana/public/app/features/dashboard-scene/saving/DashboardPrompt.test.tsx
Dominik Prokop f8686be56a Schema v2: Make DashboardScene accept v1 and v2 schema (#96931)
* WIP

* Refactor useSaveDashboard to make it dashboard type independent when used

* DashboardPrompt: makeit Dashboard type independent

* DashboardScene: accept both v1 and v2 schema

* Update save dashboard command interface

* Fix test

* Lint

* Refactor

* Add onSaveComplete to DashboardSceneSerializer

* Cleanup tests

* Remove unused code

* Refactor dashboard tracking information

* added a todo

* Fix betterer

* Update betterer results
2024-12-13 10:20:22 +01:00

160 lines
4.7 KiB
TypeScript

import { SceneQueryRunner, SceneTimeRange, VizPanel, behaviors } from '@grafana/scenes';
import { ContextSrv, setContextSrv } from 'app/core/services/context_srv';
import { DashboardControls } from '../scene/DashboardControls';
import { DashboardScene, DashboardSceneState } from '../scene/DashboardScene';
import { DefaultGridLayoutManager } from '../scene/layout-default/DefaultGridLayoutManager';
import { transformSceneToSaveModel } from '../serialization/transformSceneToSaveModel';
import { ignoreChanges } from './DashboardPrompt';
function getTestContext() {
const contextSrv = { isSignedIn: true, isEditor: true } as ContextSrv;
setContextSrv(contextSrv);
return { contextSrv };
}
describe('DashboardPrompt', () => {
describe('ignoreChanges', () => {
beforeEach(() => {
getTestContext();
});
describe('when called without original dashboard', () => {
it('then it should return true', () => {
const scene = buildTestScene();
scene.setInitialSaveModel(undefined);
expect(ignoreChanges(scene)).toBe(true);
});
});
describe('when called without current dashboard', () => {
it('then it should return true', () => {
expect(ignoreChanges(null)).toBe(true);
});
});
describe('when called for a viewer without save permissions', () => {
it('then it should return true', () => {
const { contextSrv } = getTestContext();
const scene = buildTestScene({
meta: {
canSave: false,
},
});
contextSrv.isEditor = false;
expect(ignoreChanges(scene)).toBe(true);
});
});
describe('when called for a viewer with save permissions', () => {
it('then it should return undefined', () => {
const { contextSrv } = getTestContext();
const scene = buildTestScene({
meta: {
canSave: true,
},
});
const initialSaveModel = transformSceneToSaveModel(scene);
scene.setInitialSaveModel(initialSaveModel);
contextSrv.isEditor = false;
expect(ignoreChanges(scene)).toBe(undefined);
});
});
describe('when called for an user that is not signed in', () => {
it('then it should return true', () => {
const { contextSrv } = getTestContext();
const scene = buildTestScene({
meta: {
canSave: true,
},
});
const initialSaveModel = transformSceneToSaveModel(scene);
scene.setInitialSaveModel(initialSaveModel);
contextSrv.isSignedIn = false;
expect(ignoreChanges(scene)).toBe(true);
});
});
describe('when called with fromScript', () => {
it('then it should return true', () => {
const scene = buildTestScene({
meta: {
canSave: true,
fromScript: true,
},
});
const initialSaveModel = transformSceneToSaveModel(scene);
scene.setInitialSaveModel(initialSaveModel);
expect(ignoreChanges(scene)).toBe(true);
});
});
describe('when called with fromFile', () => {
it('then it should return true', () => {
const scene = buildTestScene({
meta: {
canSave: true,
fromScript: undefined,
fromFile: true,
},
});
const initialSaveModel = transformSceneToSaveModel(scene);
scene.setInitialSaveModel(initialSaveModel);
expect(ignoreChanges(scene)).toBe(true);
});
});
describe('when called with canSave but without fromScript and fromFile', () => {
it('then it should return false', () => {
const scene = buildTestScene({
meta: {
canSave: true,
fromScript: undefined,
fromFile: undefined,
},
});
const initialSaveModel = transformSceneToSaveModel(scene);
scene.setInitialSaveModel(initialSaveModel);
expect(ignoreChanges(scene)).toBe(undefined);
});
});
});
});
function buildTestScene(overrides?: Partial<DashboardSceneState>) {
const scene = new DashboardScene({
title: 'hello',
uid: 'dash-1',
description: 'hello description',
tags: ['tag1', 'tag2'],
editable: true,
$timeRange: new SceneTimeRange({
timeZone: 'browser',
}),
controls: new DashboardControls({}),
$behaviors: [new behaviors.CursorSync({})],
body: DefaultGridLayoutManager.fromVizPanels([
new VizPanel({
title: 'Panel A',
key: 'panel-1',
pluginId: 'table',
$data: new SceneQueryRunner({ key: 'data-query-runner', queries: [{ refId: 'A' }] }),
}),
]),
...overrides,
});
return scene;
}