mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			113 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
| import { Dashboard } from '@grafana/schema/dist/esm/index';
 | |
| import { DashboardV2Spec } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha0/types.gen';
 | |
| import { DashboardDTO } from 'app/types';
 | |
| 
 | |
| import { SaveDashboardCommand } from '../components/SaveDashboard/types';
 | |
| 
 | |
| import { UnifiedDashboardAPI } from './UnifiedDashboardAPI';
 | |
| import { DashboardVersionError, DashboardWithAccessInfo } from './types';
 | |
| import { isV2DashboardCommand } from './utils';
 | |
| import { K8sDashboardAPI } from './v1';
 | |
| import { K8sDashboardV2API } from './v2';
 | |
| 
 | |
| jest.mock('./v1');
 | |
| jest.mock('./v2');
 | |
| 
 | |
| describe('UnifiedDashboardAPI', () => {
 | |
|   let api: UnifiedDashboardAPI;
 | |
|   let v1Client: jest.Mocked<K8sDashboardAPI>;
 | |
|   let v2Client: jest.Mocked<K8sDashboardV2API>;
 | |
| 
 | |
|   beforeEach(() => {
 | |
|     jest.clearAllMocks();
 | |
|     api = new UnifiedDashboardAPI();
 | |
|     v1Client = api['v1Client'] as jest.Mocked<K8sDashboardAPI>;
 | |
|     v2Client = api['v2Client'] as jest.Mocked<K8sDashboardV2API>;
 | |
|   });
 | |
| 
 | |
|   describe('getDashboardDTO', () => {
 | |
|     it('should try v1 first and return result if successful', async () => {
 | |
|       const mockResponse = { dashboard: { title: 'test' } };
 | |
|       v1Client.getDashboardDTO.mockResolvedValue(mockResponse as DashboardDTO);
 | |
| 
 | |
|       const result = await api.getDashboardDTO('123');
 | |
| 
 | |
|       expect(result).toBe(mockResponse);
 | |
|       expect(v1Client.getDashboardDTO).toHaveBeenCalledWith('123');
 | |
|       expect(v2Client.getDashboardDTO).not.toHaveBeenCalled();
 | |
|     });
 | |
| 
 | |
|     it('should fallback to v2 if v1 throws DashboardVersionError', async () => {
 | |
|       const mockV2Response = { spec: { title: 'test' } };
 | |
|       v1Client.getDashboardDTO.mockRejectedValue(new DashboardVersionError('v2alpha1', 'Dashboard is V1 format'));
 | |
|       v2Client.getDashboardDTO.mockResolvedValue(mockV2Response as DashboardWithAccessInfo<DashboardV2Spec>);
 | |
| 
 | |
|       const result = await api.getDashboardDTO('123');
 | |
| 
 | |
|       expect(result).toBe(mockV2Response);
 | |
|       expect(v2Client.getDashboardDTO).toHaveBeenCalledWith('123');
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   describe('saveDashboard', () => {
 | |
|     it('should use v1 client for v1 dashboard', async () => {
 | |
|       const mockCommand = { dashboard: { title: 'test' } };
 | |
|       v1Client.saveDashboard.mockResolvedValue({ id: 1, status: 'success', slug: '', uid: '', url: '', version: 1 });
 | |
| 
 | |
|       await api.saveDashboard(mockCommand as SaveDashboardCommand<Dashboard>);
 | |
| 
 | |
|       expect(v1Client.saveDashboard).toHaveBeenCalledWith(mockCommand);
 | |
|       expect(v2Client.saveDashboard).not.toHaveBeenCalled();
 | |
|     });
 | |
| 
 | |
|     it('should use v2 client for v2 dashboard', async () => {
 | |
|       const mockCommand: SaveDashboardCommand<DashboardV2Spec> = {
 | |
|         dashboard: {
 | |
|           title: 'test',
 | |
|           elements: {},
 | |
|           annotations: [],
 | |
|           cursorSync: 'Crosshair',
 | |
|           layout: {
 | |
|             kind: 'GridLayout',
 | |
|             spec: { items: [] },
 | |
|           },
 | |
|           liveNow: false,
 | |
|           tags: [],
 | |
|           links: [],
 | |
|           preload: false,
 | |
|           timeSettings: {
 | |
|             from: 'now-1h',
 | |
|             to: 'now',
 | |
|             autoRefresh: '5s',
 | |
|             autoRefreshIntervals: ['5s', '1m', '5m', '15m', '30m', '1h', '4h', '8h', '12h', '24h'],
 | |
|             timezone: 'utc',
 | |
|             hideTimepicker: false,
 | |
|             fiscalYearStartMonth: 0,
 | |
|           },
 | |
|           variables: [],
 | |
|         },
 | |
|       };
 | |
| 
 | |
|       v2Client.saveDashboard.mockResolvedValue({ id: 1, status: 'success', slug: '', uid: '', url: '', version: 1 });
 | |
| 
 | |
|       await api.saveDashboard(mockCommand as SaveDashboardCommand<DashboardV2Spec>);
 | |
| 
 | |
|       expect(isV2DashboardCommand(mockCommand)).toBe(true);
 | |
|       expect(v2Client.saveDashboard).toHaveBeenCalledWith(mockCommand);
 | |
|       expect(v1Client.saveDashboard).not.toHaveBeenCalled();
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   describe('deleteDashboard', () => {
 | |
|     it('should not try other version if fails', async () => {
 | |
|       v1Client.deleteDashboard.mockRejectedValue(new DashboardVersionError('v2alpha1', 'Dashboard is V1 format'));
 | |
| 
 | |
|       try {
 | |
|         await api.deleteDashboard('123', true);
 | |
|       } catch (error) {}
 | |
|       expect(v1Client.deleteDashboard).toHaveBeenCalledWith('123', true);
 | |
|       expect(v2Client.deleteDashboard).not.toHaveBeenCalled();
 | |
|     });
 | |
|   });
 | |
| });
 |