grafana_bak/public/app/features/dashboard-scene/saving/DashboardSceneChangeTracker.test.ts
2025-04-01 10:38:02 +09:00

68 lines
2.3 KiB
TypeScript

import { SceneObjectStateChangedEvent } from '@grafana/scenes';
import { Dashboard } from '@grafana/schema';
import { CorsWorker } from 'app/core/utils/CorsWorker';
import * as createDetectChangesWorker from 'app/features/dashboard-scene/saving/createDetectChangesWorker';
import { DashboardScene } from '../scene/DashboardScene';
import { DashboardSceneChangeTracker } from './DashboardSceneChangeTracker';
jest.mock('../serialization/transformSceneToSaveModel', () => {
return {
transformSceneToSaveModel: () => {
return {
title: 'updated dashboard',
invalidProp: () => 'function',
};
},
};
});
describe('DashboardSceneChangeTracker', () => {
it('should set _changesWorker to undefined when terminate is called', () => {
const terminate = jest.fn();
jest.spyOn(createDetectChangesWorker, 'createWorker').mockImplementation(
() =>
({
terminate,
}) as unknown as CorsWorker
);
const changeTracker = new DashboardSceneChangeTracker({
subscribeToEvent: jest.fn().mockReturnValue({ unsubscribe: jest.fn() }),
} as unknown as DashboardScene);
changeTracker.startTrackingChanges();
expect(changeTracker['_changesWorker']).not.toBeUndefined();
changeTracker.terminate();
expect(changeTracker['_changesWorker']).toBeUndefined();
});
it('should remove non clonable properties before sending to worker', () => {
const scene = new DashboardScene({});
const postMessage = jest.fn();
jest.spyOn(createDetectChangesWorker, 'createWorker').mockImplementation(() => {
return {
postMessage,
} as unknown as CorsWorker;
});
jest.spyOn(DashboardSceneChangeTracker, 'isUpdatingPersistedState').mockImplementation(() => {
return true;
});
jest.spyOn(scene, 'getInitialSaveModel').mockReturnValue({
title: 'initial dashboard',
invalidProp: () => 'function',
} as unknown as Dashboard);
const changeTracker = new DashboardSceneChangeTracker(scene);
changeTracker.startTrackingChanges();
scene.publishEvent({ type: SceneObjectStateChangedEvent.type, payload: { a: 1 } });
expect(postMessage).toHaveBeenCalledWith({
initial: { title: 'initial dashboard' },
changed: { title: 'updated dashboard' },
});
});
});