mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			148 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
| import { test, expect } from '@grafana/plugin-e2e';
 | |
| 
 | |
| test.describe(
 | |
|   'Keyboard shortcuts',
 | |
|   {
 | |
|     tag: ['@various'],
 | |
|   },
 | |
|   () => {
 | |
|     test.beforeEach(async ({ page, selectors }) => {
 | |
|       await page.goto('/');
 | |
| 
 | |
|       // Wait for the page to load
 | |
|       const panelTitle = page.getByTestId(selectors.components.Panels.Panel.title('Latest from the blog'));
 | |
|       await expect(panelTitle).toBeVisible();
 | |
|     });
 | |
| 
 | |
|     test('sequence shortcuts should work', async ({ page, selectors }) => {
 | |
|       // Navigate to explore with 'ge' shortcut
 | |
|       await page.keyboard.type('ge');
 | |
|       const exploreContainer = page.getByTestId(selectors.pages.Explore.General.container);
 | |
|       await expect(exploreContainer).toBeVisible();
 | |
| 
 | |
|       // Navigate to profile with 'gp' shortcut
 | |
|       await page.keyboard.type('gp');
 | |
|       const preferencesSaveButton = page.getByTestId(selectors.components.UserProfile.preferencesSaveButton);
 | |
|       await expect(preferencesSaveButton).toBeVisible();
 | |
| 
 | |
|       // Navigate back to home with 'gh' shortcut
 | |
|       await page.keyboard.type('gh');
 | |
|       const panelTitle = page.getByTestId(selectors.components.Panels.Panel.title('Latest from the blog'));
 | |
|       await expect(panelTitle).toBeVisible();
 | |
|     });
 | |
| 
 | |
|     test('ctrl+z should zoom out the time range', async ({ page, selectors }) => {
 | |
|       // Navigate to explore
 | |
|       await page.keyboard.type('ge');
 | |
|       const exploreContainer = page.getByTestId(selectors.pages.Explore.General.container);
 | |
|       await expect(exploreContainer).toBeVisible();
 | |
| 
 | |
|       // Set time range
 | |
|       const timePickerButton = page.getByTestId(selectors.components.TimePicker.openButton);
 | |
|       await timePickerButton.click();
 | |
| 
 | |
|       const fromField = page.getByTestId(selectors.components.TimePicker.fromField);
 | |
|       await fromField.fill('2024-06-05 10:05:00');
 | |
| 
 | |
|       const toField = page.getByTestId(selectors.components.TimePicker.toField);
 | |
|       await toField.fill('2024-06-05 10:06:00');
 | |
| 
 | |
|       const applyTimeRangeButton = page.getByTestId(selectors.components.TimePicker.applyTimeRange);
 | |
|       await applyTimeRangeButton.click();
 | |
| 
 | |
|       await page.keyboard.press('Control+z');
 | |
| 
 | |
|       const expectedRange = 'Time range selected: 2024-06-05 10:03:30 to 2024-06-05 10:07:30';
 | |
|       await expect(timePickerButton).toHaveAttribute('aria-label', expectedRange);
 | |
|     });
 | |
| 
 | |
|     test('time range shortcuts should work', async ({ page, selectors }) => {
 | |
|       // Navigate to explore
 | |
|       await page.keyboard.type('ge');
 | |
|       const exploreContainer = page.getByTestId(selectors.pages.Explore.General.container);
 | |
|       await expect(exploreContainer).toBeVisible();
 | |
| 
 | |
|       // Set time range
 | |
|       const timePickerButton = page.getByTestId(selectors.components.TimePicker.openButton);
 | |
|       await timePickerButton.click();
 | |
| 
 | |
|       const fromField = page.getByTestId(selectors.components.TimePicker.fromField);
 | |
|       await fromField.fill('2024-06-05 10:05:00');
 | |
| 
 | |
|       const toField = page.getByTestId(selectors.components.TimePicker.toField);
 | |
|       await toField.fill('2024-06-05 10:06:00');
 | |
| 
 | |
|       const applyTimeRangeButton = page.getByTestId(selectors.components.TimePicker.applyTimeRange);
 | |
|       await applyTimeRangeButton.click();
 | |
| 
 | |
|       let expectedRange = 'Time range selected: 2024-06-05 10:05:00 to 2024-06-05 10:06:00';
 | |
|       await expect(timePickerButton).toHaveAttribute('aria-label', expectedRange);
 | |
| 
 | |
|       // Use time range shortcut to move back
 | |
|       await page.keyboard.press('t');
 | |
|       await page.keyboard.press('ArrowLeft');
 | |
| 
 | |
|       expectedRange = 'Time range selected: 2024-06-05 10:04:00 to 2024-06-05 10:05:00'; // 1 min back
 | |
|       await expect(timePickerButton).toHaveAttribute('aria-label', expectedRange);
 | |
|     });
 | |
| 
 | |
|     test('ctrl+o should toggle shared crosshair', async ({ page, selectors }) => {
 | |
|       // Navigate to a new dashboard
 | |
|       await page.goto('/dashboard/new?orgId=1');
 | |
| 
 | |
|       // Wait for dashboard to load
 | |
|       await page.waitForLoadState('networkidle');
 | |
| 
 | |
|       // Wait for dashboard to be fully initialized by checking for dashboard content
 | |
|       await page
 | |
|         .locator('[data-testid*="dashboard"]')
 | |
|         .or(page.locator('text=Start your new dashboard'))
 | |
|         .first()
 | |
|         .waitFor({ state: 'visible' });
 | |
| 
 | |
|       // Test the keyboard shortcut first in the main dashboard view
 | |
|       const currentUrl = page.url();
 | |
|       const modKey = process.platform === 'darwin' ? 'Meta' : 'Control';
 | |
| 
 | |
|       // Test that mod+o works in the main dashboard (should not trigger file dialog)
 | |
|       console.log('Testing mod+o in main dashboard view...');
 | |
|       await page.keyboard.press(`${modKey}+o`);
 | |
|       expect(page.url()).toBe(currentUrl); // Should not navigate away
 | |
| 
 | |
|       // Now open settings to check if the state actually changed
 | |
|       await page.keyboard.press('d');
 | |
|       await page.keyboard.press('s');
 | |
| 
 | |
|       // Wait for settings page to load by checking for the General tab or settings content
 | |
|       await page
 | |
|         .locator('text=General')
 | |
|         .or(page.locator('[data-testid*="dashboard-settings"]'))
 | |
|         .waitFor({ state: 'visible' });
 | |
| 
 | |
|       // Wait for Panel options section to be visible and scroll to it
 | |
|       const panelOptionsSection = page.locator('text=Panel options');
 | |
|       await panelOptionsSection.waitFor({ state: 'visible' });
 | |
|       await panelOptionsSection.scrollIntoViewIfNeeded();
 | |
| 
 | |
|       // Wait for radio buttons to be visible
 | |
|       await page
 | |
|         .locator('[role="radiogroup"]')
 | |
|         .last()
 | |
|         .locator('input[type="radio"]')
 | |
|         .first()
 | |
|         .waitFor({ state: 'visible' });
 | |
| 
 | |
|       // Check current state - after one mod+o press, it should be crosshair (1)
 | |
|       await expect(page.locator('[role="radiogroup"]').last().locator('input[type="radio"]').nth(1)).toBeChecked(); // Shared crosshair
 | |
| 
 | |
|       // Test second press in the main dashboard view (should go to tooltip)
 | |
|       await page.keyboard.press(`${modKey}+o`);
 | |
|       await expect(page.locator('[role="radiogroup"]').last().locator('input[type="radio"]').nth(2)).toBeChecked(); // Shared tooltip
 | |
| 
 | |
|       // Test third press in the main dashboard view (should go back to default)
 | |
|       await page.keyboard.press(`${modKey}+o`);
 | |
|       await expect(page.locator('[role="radiogroup"]').last().locator('input[type="radio"]').nth(0)).toBeChecked(); // Default
 | |
|     });
 | |
|   }
 | |
| );
 |