68 lines
2.3 KiB
TypeScript
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' },
|
|
});
|
|
});
|
|
});
|