From 19e77db4e7ea96953ac8610d9b6ff991e6acace3 Mon Sep 17 00:00:00 2001 From: Andres Martinez Gotor Date: Tue, 15 Apr 2025 11:21:41 +0200 Subject: [PATCH] Advisor: Avoid redirect if app is not installed (#103988) --- .../AdvisorRedirectNotice.test.tsx | 29 +++++++++++++++++++ .../AdvisorRedirectNotice.tsx | 3 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/public/app/features/connections/components/AdvisorRedirectNotice/AdvisorRedirectNotice.test.tsx b/public/app/features/connections/components/AdvisorRedirectNotice/AdvisorRedirectNotice.test.tsx index f6b530d54c8..a63f5bcb004 100644 --- a/public/app/features/connections/components/AdvisorRedirectNotice/AdvisorRedirectNotice.test.tsx +++ b/public/app/features/connections/components/AdvisorRedirectNotice/AdvisorRedirectNotice.test.tsx @@ -1,6 +1,7 @@ import { render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { PluginLoadingStrategy } from '@grafana/data'; import { config } from '@grafana/runtime'; import { contextSrv } from 'app/core/core'; @@ -23,6 +24,27 @@ describe('AdvisorRedirectNotice', () => { afterEach(() => { jest.clearAllMocks(); config.featureToggles.grafanaAdvisor = originalFeatureToggleValue; + config.apps['grafana-advisor-app'] = { + id: 'grafana-advisor-app', + path: '/a/grafana-advisor-app', + version: '1.0.0', + preload: false, + angular: { detected: false, hideDeprecation: false }, + loadingStrategy: PluginLoadingStrategy.fetch, + dependencies: { + grafanaDependency: '*', + grafanaVersion: '*', + plugins: [], + extensions: { exposedComponents: [] }, + }, + extensions: { + addedLinks: [], + addedComponents: [], + exposedComponents: [], + extensionPoints: [], + addedFunctions: [], + }, + }; }); it('should not render when user is not admin', async () => { @@ -36,6 +58,13 @@ describe('AdvisorRedirectNotice', () => { render(); expect(screen.queryByRole('status')).not.toBeInTheDocument(); }); + + it('should not render when app is not installed', async () => { + delete config.apps['grafana-advisor-app']; + render(); + expect(screen.queryByRole('status')).not.toBeInTheDocument(); + }); + it('should render notice with correct content', async () => { render(); diff --git a/public/app/features/connections/components/AdvisorRedirectNotice/AdvisorRedirectNotice.tsx b/public/app/features/connections/components/AdvisorRedirectNotice/AdvisorRedirectNotice.tsx index b83c864d26c..28b9dbfbe19 100644 --- a/public/app/features/connections/components/AdvisorRedirectNotice/AdvisorRedirectNotice.tsx +++ b/public/app/features/connections/components/AdvisorRedirectNotice/AdvisorRedirectNotice.tsx @@ -26,8 +26,9 @@ const userStorage = new UserStorage('advisor-redirect-notice'); export function AdvisorRedirectNotice() { const styles = useStyles2(getStyles); const hasAdminRights = contextSrv.hasRole('Admin') || contextSrv.isGrafanaAdmin; - const canUseAdvisor = hasAdminRights && config.featureToggles.grafanaAdvisor; const [showNotice, setShowNotice] = useState(false); + const canUseAdvisor = hasAdminRights && config.featureToggles.grafanaAdvisor && !!config.apps['grafana-advisor-app']; + useEffect(() => { if (canUseAdvisor) { userStorage.getItem('showNotice').then((showNotice) => {