| 
									
										
										
										
											2025-07-11 17:31:33 +08:00
										 |  |  | import { test, expect } from '@grafana/plugin-e2e'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test.use({ | 
					
						
							|  |  |  |   featureToggles: { | 
					
						
							|  |  |  |     scenes: true, | 
					
						
							| 
									
										
										
										
											2025-08-05 17:09:49 +08:00
										 |  |  |     kubernetesDashboards: process.env.KUBERNETES_DASHBOARDS === 'true', | 
					
						
							| 
									
										
										
										
											2025-07-11 17:31:33 +08:00
										 |  |  |   }, | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const DASHBOARD_UID = 'd41dbaa2-a39e-4536-ab2b-caca52f1a9c8'; | 
					
						
							|  |  |  | const DASHBOARD_UID_2 = 'edediimbjhdz4b'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test.describe( | 
					
						
							|  |  |  |   'Shared dashboards', | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     tag: ['@dashboards'], | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   () => { | 
					
						
							|  |  |  |     test('Close share externally drawer', async ({ page, gotoDashboardPage, selectors }) => { | 
					
						
							|  |  |  |       const dashboardPage = await gotoDashboardPage({ uid: DASHBOARD_UID }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Open share externally drawer
 | 
					
						
							|  |  |  |       await dashboardPage.getByGrafanaSelector(selectors.pages.Dashboard.DashNav.newShareButton.arrowMenu).click(); | 
					
						
							|  |  |  |       await dashboardPage | 
					
						
							|  |  |  |         .getByGrafanaSelector(selectors.pages.Dashboard.DashNav.newShareButton.menu.shareExternally) | 
					
						
							|  |  |  |         .click(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       await expect(page).toHaveURL(/.*shareView=public_dashboard.*/); | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector(selectors.pages.ShareDashboardDrawer.ShareExternally.container) | 
					
						
							|  |  |  |       ).toBeVisible(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       await dashboardPage | 
					
						
							|  |  |  |         .getByGrafanaSelector(selectors.pages.ShareDashboardDrawer.ShareExternally.Creation.PublicShare.cancelButton) | 
					
						
							|  |  |  |         .click(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       await expect(page).not.toHaveURL(/.*shareView=public_dashboard.*/); | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector(selectors.pages.ShareDashboardDrawer.ShareExternally.container) | 
					
						
							|  |  |  |       ).toBeHidden(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test('Create and disable a shared dashboard and check API', async ({ | 
					
						
							|  |  |  |       page, | 
					
						
							|  |  |  |       gotoDashboardPage, | 
					
						
							|  |  |  |       selectors, | 
					
						
							|  |  |  |       request, | 
					
						
							|  |  |  |     }) => { | 
					
						
							|  |  |  |       const dashboardPage = await gotoDashboardPage({ uid: DASHBOARD_UID_2 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Open share externally drawer
 | 
					
						
							|  |  |  |       await dashboardPage.getByGrafanaSelector(selectors.pages.Dashboard.DashNav.newShareButton.arrowMenu).click(); | 
					
						
							|  |  |  |       await dashboardPage | 
					
						
							|  |  |  |         .getByGrafanaSelector(selectors.pages.Dashboard.DashNav.newShareButton.menu.shareExternally) | 
					
						
							|  |  |  |         .click(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Create button should be disabled
 | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector( | 
					
						
							|  |  |  |           selectors.pages.ShareDashboardDrawer.ShareExternally.Creation.PublicShare.createButton | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ).toBeDisabled(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Create flow shouldn't show these elements
 | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector( | 
					
						
							|  |  |  |           selectors.pages.ShareDashboardDrawer.ShareExternally.Configuration.enableTimeRangeSwitch | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ).toBeHidden(); | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector( | 
					
						
							|  |  |  |           selectors.pages.ShareDashboardDrawer.ShareExternally.Configuration.enableAnnotationsSwitch | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ).toBeHidden(); | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector( | 
					
						
							|  |  |  |           selectors.pages.ShareDashboardDrawer.ShareExternally.Configuration.copyUrlButton | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ).toBeHidden(); | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector( | 
					
						
							|  |  |  |           selectors.pages.ShareDashboardDrawer.ShareExternally.Configuration.revokeAccessButton | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ).toBeHidden(); | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector( | 
					
						
							|  |  |  |           selectors.pages.ShareDashboardDrawer.ShareExternally.Configuration.toggleAccessButton | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ).toBeHidden(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Acknowledge checkbox
 | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector( | 
					
						
							|  |  |  |           selectors.pages.ShareDashboardDrawer.ShareExternally.Creation.willBePublicCheckbox | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ).toBeEnabled(); | 
					
						
							|  |  |  |       await dashboardPage | 
					
						
							|  |  |  |         .getByGrafanaSelector(selectors.pages.ShareDashboardDrawer.ShareExternally.Creation.willBePublicCheckbox) | 
					
						
							|  |  |  |         .click({ force: true }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Create shared dashboard
 | 
					
						
							|  |  |  |       const createResponse = page.waitForResponse( | 
					
						
							|  |  |  |         (response) => | 
					
						
							|  |  |  |           response.url().includes(`/api/dashboards/uid/${DASHBOARD_UID_2}/public-dashboards`) && | 
					
						
							|  |  |  |           response.request().method() === 'POST' | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector( | 
					
						
							|  |  |  |           selectors.pages.ShareDashboardDrawer.ShareExternally.Creation.PublicShare.createButton | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ).toBeEnabled(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       await dashboardPage | 
					
						
							|  |  |  |         .getByGrafanaSelector(selectors.pages.ShareDashboardDrawer.ShareExternally.Creation.PublicShare.createButton) | 
					
						
							|  |  |  |         .click(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       let response = await createResponse; | 
					
						
							|  |  |  |       let publicDashboard = await response.json(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Test API access with the created dashboard
 | 
					
						
							|  |  |  |       let apiResponse = await request.get(`/api/public/dashboards/${publicDashboard.accessToken}`); | 
					
						
							|  |  |  |       expect(apiResponse.status()).toBe(200); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // These elements shouldn't be rendered after creating public dashboard
 | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector( | 
					
						
							|  |  |  |           selectors.pages.ShareDashboardDrawer.ShareExternally.Creation.willBePublicCheckbox | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ).toBeHidden(); | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector( | 
					
						
							|  |  |  |           selectors.pages.ShareDashboardDrawer.ShareExternally.Creation.PublicShare.createButton | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ).toBeHidden(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // These elements should be rendered
 | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector( | 
					
						
							|  |  |  |           selectors.pages.ShareDashboardDrawer.ShareExternally.Configuration.enableTimeRangeSwitch | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ).toBeVisible(); | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector( | 
					
						
							|  |  |  |           selectors.pages.ShareDashboardDrawer.ShareExternally.Configuration.enableAnnotationsSwitch | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ).toBeVisible(); | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector( | 
					
						
							|  |  |  |           selectors.pages.ShareDashboardDrawer.ShareExternally.Configuration.copyUrlButton | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ).toBeVisible(); | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector( | 
					
						
							|  |  |  |           selectors.pages.ShareDashboardDrawer.ShareExternally.Configuration.revokeAccessButton | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ).toBeVisible(); | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector( | 
					
						
							|  |  |  |           selectors.pages.ShareDashboardDrawer.ShareExternally.Configuration.toggleAccessButton | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ).toBeVisible(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Switch off enabling toggle
 | 
					
						
							|  |  |  |       const updateResponse = page.waitForResponse( | 
					
						
							|  |  |  |         (response) => | 
					
						
							|  |  |  |           response.url().includes(`/api/dashboards/uid/${DASHBOARD_UID_2}/public-dashboards/`) && | 
					
						
							|  |  |  |           response.request().method() === 'PATCH' | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       await expect( | 
					
						
							|  |  |  |         dashboardPage.getByGrafanaSelector( | 
					
						
							|  |  |  |           selectors.pages.ShareDashboardDrawer.ShareExternally.Configuration.toggleAccessButton | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ).toBeEnabled(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       await dashboardPage | 
					
						
							|  |  |  |         .getByGrafanaSelector(selectors.pages.ShareDashboardDrawer.ShareExternally.Configuration.toggleAccessButton) | 
					
						
							|  |  |  |         .click({ force: true }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       response = await updateResponse; | 
					
						
							|  |  |  |       expect(response.status()).toBe(200); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       publicDashboard = await response.json(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Test that API access is now forbidden
 | 
					
						
							|  |  |  |       apiResponse = await request.get(`/api/public/dashboards/${publicDashboard.accessToken}`); | 
					
						
							|  |  |  |       expect(apiResponse.status()).toBe(403); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | ); |