|
|
|
@ -112,7 +112,7 @@ describe('DashboardScenePageStateManager v1', () => { |
|
|
|
|
const loader = new DashboardScenePageStateManager({}); |
|
|
|
|
await loader.loadDashboard({ uid: 'fake-dash', route: DashboardRoutes.Normal }); |
|
|
|
|
|
|
|
|
|
expect(loadDashboardMock).toHaveBeenCalledWith('db', '', 'fake-dash', undefined); |
|
|
|
|
expect(loadDashboardMock).toHaveBeenCalledWith('db', '', 'fake-dash'); |
|
|
|
|
|
|
|
|
|
// should use cache second time
|
|
|
|
|
await loader.loadDashboard({ uid: 'fake-dash', route: DashboardRoutes.Normal }); |
|
|
|
@ -664,8 +664,8 @@ describe('DashboardScenePageStateManager v2', () => { |
|
|
|
|
getDashSpy |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
const options = { version: 2, scopes: [], timeRange: { from: 'now-1h', to: 'now' }, variables: {} }; |
|
|
|
|
await loader.reloadDashboard(options); |
|
|
|
|
const params = { version: 2, scopes: [], from: 'now-1h', to: 'now' }; |
|
|
|
|
await loader.reloadDashboard(params); |
|
|
|
|
|
|
|
|
|
expect(getDashSpy).toHaveBeenCalledTimes(2); |
|
|
|
|
expect(loader.state.dashboard?.state.version).toBe(2); |
|
|
|
@ -695,28 +695,11 @@ describe('DashboardScenePageStateManager v2', () => { |
|
|
|
|
expect(getDashSpy).toHaveBeenCalledTimes(1); |
|
|
|
|
const initialDashboard = loader.state.dashboard; |
|
|
|
|
|
|
|
|
|
const mockDashboard: DashboardWithAccessInfo<DashboardV2Spec> = { |
|
|
|
|
access: {}, |
|
|
|
|
apiVersion: 'v2alpha1', |
|
|
|
|
kind: 'DashboardWithAccessInfo', |
|
|
|
|
metadata: { |
|
|
|
|
name: 'fake-dash', |
|
|
|
|
creationTimestamp: '', |
|
|
|
|
resourceVersion: '1', |
|
|
|
|
generation: 1, |
|
|
|
|
}, |
|
|
|
|
spec: { ...defaultDashboardV2Spec() }, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const fetchDashboardSpy = jest.spyOn(loader, 'fetchDashboard').mockResolvedValue(mockDashboard); |
|
|
|
|
|
|
|
|
|
const options = { version: 1, scopes: [], timeRange: { from: 'now-1h', to: 'now' }, variables: {} }; |
|
|
|
|
await loader.reloadDashboard(options); |
|
|
|
|
const params = { version: 1, scopes: [], from: 'now-1h', to: 'now' }; |
|
|
|
|
await loader.reloadDashboard(params); |
|
|
|
|
|
|
|
|
|
expect(fetchDashboardSpy).toHaveBeenCalledTimes(1); |
|
|
|
|
expect(getDashSpy).toHaveBeenCalledTimes(2); |
|
|
|
|
expect(loader.state.dashboard).toBe(initialDashboard); |
|
|
|
|
|
|
|
|
|
fetchDashboardSpy.mockRestore(); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
it('should not use cache if cache version and current dashboard state version differ', async () => { |
|
|
|
@ -742,32 +725,32 @@ describe('DashboardScenePageStateManager v2', () => { |
|
|
|
|
|
|
|
|
|
expect(getDashSpy).toHaveBeenCalledTimes(1); |
|
|
|
|
|
|
|
|
|
const mockDashboard: DashboardWithAccessInfo<DashboardV2Spec> = { |
|
|
|
|
access: {}, |
|
|
|
|
apiVersion: 'v2alpha1', |
|
|
|
|
kind: 'DashboardWithAccessInfo', |
|
|
|
|
metadata: { |
|
|
|
|
name: 'fake-dash', |
|
|
|
|
creationTimestamp: '', |
|
|
|
|
resourceVersion: '1', |
|
|
|
|
generation: 2, |
|
|
|
|
setupDashboardAPI( |
|
|
|
|
{ |
|
|
|
|
access: {}, |
|
|
|
|
apiVersion: 'v2alpha1', |
|
|
|
|
kind: 'DashboardWithAccessInfo', |
|
|
|
|
metadata: { |
|
|
|
|
name: 'fake-dash', |
|
|
|
|
creationTimestamp: '', |
|
|
|
|
resourceVersion: '1', |
|
|
|
|
generation: 2, |
|
|
|
|
}, |
|
|
|
|
spec: { ...defaultDashboardV2Spec() }, |
|
|
|
|
}, |
|
|
|
|
spec: { ...defaultDashboardV2Spec() }, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const fetchDashboardSpy = jest.spyOn(loader, 'fetchDashboard').mockResolvedValue(mockDashboard); |
|
|
|
|
getDashSpy |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// mimic navigating from db1 to db2 and then back to db1, which maintains the cache. but on
|
|
|
|
|
// db1 load the initial version will be 1. Since the cache is set we also need to verify against the
|
|
|
|
|
// current dashboard state whether we should reload or not
|
|
|
|
|
loader.setSceneCache('fake-dash', loader.state.dashboard!.clone({ version: 2 })); |
|
|
|
|
const options = { version: 2, scopes: [], timeRange: { from: 'now-1h', to: 'now' }, variables: {} }; |
|
|
|
|
await loader.reloadDashboard(options); |
|
|
|
|
|
|
|
|
|
expect(fetchDashboardSpy).toHaveBeenCalledTimes(1); |
|
|
|
|
expect(loader.state.dashboard?.state.version).toBe(2); |
|
|
|
|
const params = { version: 2, scopes: [], from: 'now-1h', to: 'now' }; |
|
|
|
|
await loader.reloadDashboard(params); |
|
|
|
|
|
|
|
|
|
fetchDashboardSpy.mockRestore(); |
|
|
|
|
expect(getDashSpy).toHaveBeenCalledTimes(2); |
|
|
|
|
expect(loader.state.dashboard?.state.version).toBe(2); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
it('should handle errors during reload', async () => { |
|
|
|
@ -797,8 +780,8 @@ describe('DashboardScenePageStateManager v2', () => { |
|
|
|
|
|
|
|
|
|
loader['dashboardLoader'] = mockLoader as unknown as DashboardLoaderSrvV2; |
|
|
|
|
|
|
|
|
|
const options = { version: 2, scopes: [], timeRange: { from: 'now-1h', to: 'now' }, variables: {} }; |
|
|
|
|
await loader.reloadDashboard(options); |
|
|
|
|
const params = { version: 2, scopes: [], from: 'now-1h', to: 'now' }; |
|
|
|
|
await loader.reloadDashboard(params); |
|
|
|
|
|
|
|
|
|
expect(loader.state.loadError).toBeDefined(); |
|
|
|
|
expect(loader.state.loadError?.message).toBe('Failed to load dashboard'); |
|
|
|
@ -831,9 +814,9 @@ describe('DashboardScenePageStateManager v2', () => { |
|
|
|
|
|
|
|
|
|
loader['dashboardLoader'] = mockLoader as unknown as DashboardLoaderSrvV2; |
|
|
|
|
|
|
|
|
|
const options = { version: 2, scopes: [], timeRange: { from: 'now-1h', to: 'now' }, variables: {} }; |
|
|
|
|
const params = { version: 2, scopes: [], from: 'now-1h', to: 'now' }; |
|
|
|
|
|
|
|
|
|
await expect(loader.reloadDashboard(options)).rejects.toThrow(DashboardVersionError); |
|
|
|
|
await expect(loader.reloadDashboard(params)).rejects.toThrow(DashboardVersionError); |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
@ -852,7 +835,7 @@ describe('UnifiedDashboardScenePageStateManager', () => { |
|
|
|
|
const manager = new UnifiedDashboardScenePageStateManager({}); |
|
|
|
|
await manager.loadDashboard({ uid: 'fake-dash', route: DashboardRoutes.Normal }); |
|
|
|
|
|
|
|
|
|
expect(loadDashboardMock).toHaveBeenCalledWith('db', '', 'fake-dash', undefined); |
|
|
|
|
expect(loadDashboardMock).toHaveBeenCalledWith('db', '', 'fake-dash'); |
|
|
|
|
expect(manager['activeManager']).toBeInstanceOf(DashboardScenePageStateManager); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
@ -892,7 +875,7 @@ describe('UnifiedDashboardScenePageStateManager', () => { |
|
|
|
|
expect(manager['activeManager']).toBeInstanceOf(DashboardScenePageStateManagerV2); |
|
|
|
|
|
|
|
|
|
// Reload should now work with v2 manager
|
|
|
|
|
const options = { version: 1, scopes: [], timeRange: { from: 'now-1h', to: 'now' }, variables: {} }; |
|
|
|
|
const params = { version: 1, scopes: [], from: 'now-1h', to: 'now' }; |
|
|
|
|
|
|
|
|
|
// Mock the fetchDashboard method to return a dashboard
|
|
|
|
|
const v2Manager = manager['activeManager'] as DashboardScenePageStateManagerV2; |
|
|
|
@ -910,7 +893,7 @@ describe('UnifiedDashboardScenePageStateManager', () => { |
|
|
|
|
spec: { ...defaultDashboardV2Spec() }, |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
await manager.reloadDashboard(options); |
|
|
|
|
await manager.reloadDashboard(params); |
|
|
|
|
|
|
|
|
|
// Restore the original method
|
|
|
|
|
v2Manager.fetchDashboard = originalFetchDashboard; |
|
|
|
@ -959,21 +942,16 @@ describe('UnifiedDashboardScenePageStateManager', () => { |
|
|
|
|
|
|
|
|
|
await manager.loadDashboard({ uid: 'fake-dash', route: DashboardRoutes.Normal }); |
|
|
|
|
|
|
|
|
|
expect(loadDashboardMock).toHaveBeenCalledWith('db', '', 'fake-dash', undefined); |
|
|
|
|
expect(loadDashboardMock).toHaveBeenCalledWith('db', '', 'fake-dash'); |
|
|
|
|
expect(manager['activeManager']).toBeInstanceOf(DashboardScenePageStateManager); |
|
|
|
|
|
|
|
|
|
loadDashboardMock.mockClear(); |
|
|
|
|
const reloadMock = jest.fn(); |
|
|
|
|
manager['activeManager'].reloadDashboard = reloadMock; |
|
|
|
|
|
|
|
|
|
const options = { version: 2, scopes: [], timeRange: { from: 'now-1h', to: 'now' }, variables: {} }; |
|
|
|
|
await manager.reloadDashboard(options); |
|
|
|
|
const params = { version: 2, scopes: [], from: 'now-1h', to: 'now' }; |
|
|
|
|
await manager.reloadDashboard(params); |
|
|
|
|
|
|
|
|
|
expect(manager['activeManager']).toBeInstanceOf(DashboardScenePageStateManager); |
|
|
|
|
expect(loadDashboardMock).toHaveBeenCalledWith('db', '', 'fake-dash', { |
|
|
|
|
from: 'now-1h', |
|
|
|
|
to: 'now', |
|
|
|
|
version: 2, |
|
|
|
|
scopes: [], |
|
|
|
|
}); |
|
|
|
|
expect(reloadMock).toHaveBeenCalledTimes(1); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
it('should reload v2 dashboard with v2 manager', async () => { |
|
|
|
@ -984,9 +962,10 @@ describe('UnifiedDashboardScenePageStateManager', () => { |
|
|
|
|
|
|
|
|
|
expect(manager['activeManager']).toBeInstanceOf(DashboardScenePageStateManagerV2); |
|
|
|
|
|
|
|
|
|
const options = { version: 2, scopes: [], timeRange: { from: 'now-1h', to: 'now' }, variables: {} }; |
|
|
|
|
const params = { version: 2, scopes: [], from: 'now-1h', to: 'now' }; |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
await manager.reloadDashboard(options); |
|
|
|
|
await manager.reloadDashboard(params); |
|
|
|
|
} catch (e) { |
|
|
|
|
expect(e).toBeInstanceOf(Error); |
|
|
|
|
expect((e as Error).message).toBe('Method not implemented.'); |
|
|
|
@ -1004,11 +983,9 @@ describe('UnifiedDashboardScenePageStateManager', () => { |
|
|
|
|
const manager = new UnifiedDashboardScenePageStateManager({}); |
|
|
|
|
await manager.loadDashboard({ uid: 'fake-dash', route: DashboardRoutes.Normal }); |
|
|
|
|
|
|
|
|
|
expect(loadDashboardMock).toHaveBeenCalledWith('db', '', 'fake-dash', undefined); |
|
|
|
|
expect(loadDashboardMock).toHaveBeenCalledWith('db', '', 'fake-dash'); |
|
|
|
|
expect(manager['activeManager']).toBeInstanceOf(DashboardScenePageStateManager); |
|
|
|
|
|
|
|
|
|
loadDashboardMock.mockClear(); |
|
|
|
|
|
|
|
|
|
const mockDashboard: DashboardDTO = { |
|
|
|
|
dashboard: { |
|
|
|
|
uid: 'fake-dash', |
|
|
|
@ -1018,19 +995,18 @@ describe('UnifiedDashboardScenePageStateManager', () => { |
|
|
|
|
meta: {}, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const fetchDashboardSpy = jest.spyOn(manager['activeManager'], 'fetchDashboard').mockResolvedValue(mockDashboard); |
|
|
|
|
loadDashboardMock.mockResolvedValue(mockDashboard); |
|
|
|
|
|
|
|
|
|
// mimic navigating from db1 to db2 and then back to db1, which maintains the cache. but on
|
|
|
|
|
// db1 load the initial version will be 1. Since the cache is set we also need to verify against the
|
|
|
|
|
// current dashboard state whether we should reload or not
|
|
|
|
|
manager.setSceneCache('fake-dash', manager.state.dashboard!.clone({ version: 2 })); |
|
|
|
|
const options = { version: 2, scopes: [], timeRange: { from: 'now-1h', to: 'now' }, variables: {} }; |
|
|
|
|
await manager.reloadDashboard(options); |
|
|
|
|
|
|
|
|
|
expect(fetchDashboardSpy).toHaveBeenCalledTimes(1); |
|
|
|
|
expect(manager.state.dashboard?.state.version).toBe(2); |
|
|
|
|
const params = { version: 2, scopes: [], from: 'now-1h', to: 'now' }; |
|
|
|
|
await manager.reloadDashboard(params); |
|
|
|
|
|
|
|
|
|
fetchDashboardSpy.mockRestore(); |
|
|
|
|
expect(loadDashboardMock).toHaveBeenCalledTimes(2); |
|
|
|
|
expect(manager.state.dashboard?.state.version).toBe(2); |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|