From df63b720214ff9a19c10de24c91b7d40ac0ec7c8 Mon Sep 17 00:00:00 2001 From: Michael Anstis Date: Mon, 26 Feb 2024 19:33:43 +0000 Subject: [PATCH] AAP-20935: Console: Use correct Admin Dashboard URL (#839) Co-authored-by: Michael Anstis --- ansible_wisdom/main/settings/development.py | 5 ++++ ansible_wisdom/main/settings/production.py | 3 +++ .../main/templates/console/console.html | 2 ++ .../main/tests/test_console_views.py | 5 ++++ ansible_wisdom/main/views.py | 9 ++++++- .../public/index.html | 1 + .../static/locales/en/translation.json | 1 - ansible_wisdom_console_react/src/App.tsx | 7 ++--- .../src/TelemetrySettings.tsx | 12 +++++++-- .../src/__tests__/App.test.tsx | 8 +++++- .../src/__tests__/TelemetrySettings.test.tsx | 26 +++++++++++++++---- ansible_wisdom_console_react/src/index.tsx | 9 ++++++- 12 files changed, 74 insertions(+), 14 deletions(-) diff --git a/ansible_wisdom/main/settings/development.py b/ansible_wisdom/main/settings/development.py index f5e370103..dd5bc9562 100644 --- a/ansible_wisdom/main/settings/development.py +++ b/ansible_wisdom/main/settings/development.py @@ -54,3 +54,8 @@ # WCA_SECRET_DUMMY_SECRETS=1009103:valid,11009104:not-valid WCA_SECRET_DUMMY_SECRETS = os.getenv("WCA_SECRET_DUMMY_SECRETS", "") WCA_CLIENT_BACKEND_TYPE = os.getenv("WCA_CLIENT_BACKEND_TYPE", "dummy") # or wcaclient + +# "Schema 2" Telemetry Admin Dashboard URL +TELEMETRY_ADMIN_DASHBOARD_URL = ( + "https://console.stage.redhat.com/ansible/lightspeed-admin-dashboard" +) diff --git a/ansible_wisdom/main/settings/production.py b/ansible_wisdom/main/settings/production.py index c34dfb5ae..a2b815265 100644 --- a/ansible_wisdom/main/settings/production.py +++ b/ansible_wisdom/main/settings/production.py @@ -10,3 +10,6 @@ SESSION_ENGINE = "django.contrib.sessions.backends.cache" SESSION_CACHE_ALIAS = "default" + +# "Schema 2" Telemetry Admin Dashboard URL +TELEMETRY_ADMIN_DASHBOARD_URL = "https://console.redhat.com/ansible/lightspeed-admin-dashboard" diff --git a/ansible_wisdom/main/templates/console/console.html b/ansible_wisdom/main/templates/console/console.html index 4db1bcf2c..e55bad9ff 100644 --- a/ansible_wisdom/main/templates/console/console.html +++ b/ansible_wisdom/main/templates/console/console.html @@ -19,4 +19,6 @@ + + {% endblock content %} diff --git a/ansible_wisdom/main/tests/test_console_views.py b/ansible_wisdom/main/tests/test_console_views.py index 4b7023bab..1585c08fe 100644 --- a/ansible_wisdom/main/tests/test_console_views.py +++ b/ansible_wisdom/main/tests/test_console_views.py @@ -88,6 +88,10 @@ def test_extra_data_telemetry_feature_enabled(self, LDClient, *args): context = response.context_data # The default setting for tests is True self.assertTrue(context['telemetry_schema_2_enabled']) + self.assertEqual( + context['telemetry_schema_2_admin_dashboard_url'], + 'https://console.stage.redhat.com/ansible/lightspeed-admin-dashboard', + ) @override_settings(LAUNCHDARKLY_SDK_KEY='dummy_key') @patch.object(feature_flags, 'LDClient') @@ -101,3 +105,4 @@ def test_extra_data_telemetry__feature_disabled(self, LDClient, *args): self.assertIsInstance(response.context_data, dict) context = response.context_data self.assertFalse(context['telemetry_schema_2_enabled']) + self.assertIsNone(context.get('telemetry_schema_2_admin_dashboard_url')) diff --git a/ansible_wisdom/main/views.py b/ansible_wisdom/main/views.py index df26ff27b..571617260 100644 --- a/ansible_wisdom/main/views.py +++ b/ansible_wisdom/main/views.py @@ -76,5 +76,12 @@ def get_context_data(self, **kwargs): context["rh_org_has_subscription"] = user.rh_org_has_subscription organization = user.organization if organization: - context["telemetry_schema_2_enabled"] = organization.is_schema_2_telemetry_enabled + is_schema_2_telemetry_enabled = organization.is_schema_2_telemetry_enabled + context["telemetry_schema_2_enabled"] = is_schema_2_telemetry_enabled + + if is_schema_2_telemetry_enabled: + context[ + "telemetry_schema_2_admin_dashboard_url" + ] = settings.TELEMETRY_ADMIN_DASHBOARD_URL + return context diff --git a/ansible_wisdom_console_react/public/index.html b/ansible_wisdom_console_react/public/index.html index 8d83dce00..83514c5f4 100644 --- a/ansible_wisdom_console_react/public/index.html +++ b/ansible_wisdom_console_react/public/index.html @@ -12,5 +12,6 @@ + diff --git a/ansible_wisdom_console_react/public/static/console/static/locales/en/translation.json b/ansible_wisdom_console_react/public/static/console/static/locales/en/translation.json index ae825281a..2c31d3d1d 100644 --- a/ansible_wisdom_console_react/public/static/console/static/locales/en/translation.json +++ b/ansible_wisdom_console_react/public/static/console/static/locales/en/translation.json @@ -56,7 +56,6 @@ "TelemetryManageUsage": "Manage telemetry usage", "TelemetryManageUsageDescription": "Telemetry data is used to enable app usage and the ", "TelemetryManageUsageAdminDashboardURLText": "admin dashboard.", - "TelemetryManageUsageAdminDashboardURL": "http://www.redhat.com", "TelemetryManageUsageLearnMoreURLText": "Learn more about how Ansible Lightspeed uses data. ", "TelemetryManageUsageLearnMoreURL": "https://access.redhat.com/documentation/en-us/red_hat_ansible_lightspeed_with_ibm_watsonx_code_assistant/2.x_latest/html/red_hat_ansible_lightspeed_with_ibm_watsonx_code_assistant_user_guide/lightspeed-intro#training-data_lightspeed-intro", "TelemetryOptInLabel": "Admin dashboard telemetry data.", diff --git a/ansible_wisdom_console_react/src/App.tsx b/ansible_wisdom_console_react/src/App.tsx index 156ea2fb2..e899ef959 100644 --- a/ansible_wisdom_console_react/src/App.tsx +++ b/ansible_wisdom_console_react/src/App.tsx @@ -9,11 +9,12 @@ import { PageApp } from "./PageApp"; export interface AppProps { readonly userName: string; readonly telemetryOptEnabled: boolean; + readonly adminDashboardUrl: string; } export function App(props: AppProps) { const { t } = useTranslation(); - const { userName, telemetryOptEnabled } = props; + const { userName, telemetryOptEnabled, adminDashboardUrl } = props; const navigationItems = useMemo(() => { const items = [ @@ -29,7 +30,7 @@ export function App(props: AppProps) { // Telemetry label: t("Telemetry"), path: "telemetry", - element: , + element: , }); } return [ @@ -40,7 +41,7 @@ export function App(props: AppProps) { children: items, }, ]; - }, [t, telemetryOptEnabled]); + }, [t, telemetryOptEnabled, adminDashboardUrl]); return ( ({ status: "NOT_ASKED", @@ -141,7 +146,10 @@ export function TelemetrySettings() { {t("TelemetryManageUsage")} {t("TelemetryManageUsageDescription")} - + {t("TelemetryManageUsageAdminDashboardURLText")} diff --git a/ansible_wisdom_console_react/src/__tests__/App.test.tsx b/ansible_wisdom_console_react/src/__tests__/App.test.tsx index 15398eb14..4f02ee546 100644 --- a/ansible_wisdom_console_react/src/__tests__/App.test.tsx +++ b/ansible_wisdom_console_react/src/__tests__/App.test.tsx @@ -5,7 +5,13 @@ import { App } from "../App"; describe("App", () => { it("Rendering::With Username", async () => { window.history.pushState({}, "Test page", "/console"); - render(); + render( + , + ); const accountMenu = await screen.findByTestId("page-masthead-dropdown"); expect(accountMenu).toBeInTheDocument(); expect(accountMenu).toHaveTextContent("Batman"); diff --git a/ansible_wisdom_console_react/src/__tests__/TelemetrySettings.test.tsx b/ansible_wisdom_console_react/src/__tests__/TelemetrySettings.test.tsx index 0b223a33f..87b7a935c 100644 --- a/ansible_wisdom_console_react/src/__tests__/TelemetrySettings.test.tsx +++ b/ansible_wisdom_console_react/src/__tests__/TelemetrySettings.test.tsx @@ -15,7 +15,9 @@ describe("TelemetrySettings", () => { it("Loading", async () => { (axios.get as jest.Mock).mockResolvedValue({ optOut: "false" }); - render(); + render( + , + ); expect(axios.get as jest.Mock).toBeCalledWith(API_TELEMETRY_PATH); expect( await screen.findByTestId("telemetry-settings__telemetry-loading"), @@ -24,7 +26,9 @@ describe("TelemetrySettings", () => { it("Loaded::Found", async () => { (axios.get as jest.Mock).mockResolvedValue({ data: { optOut: true } }); - render(); + render( + , + ); expect(axios.get as jest.Mock).toBeCalledWith(API_TELEMETRY_PATH); expect( await screen.findByTestId("telemetry-settings__opt_in_radiobutton"), @@ -43,13 +47,21 @@ describe("TelemetrySettings", () => { expect(cancelButton).toBeInTheDocument(); expect(saveButton.disabled).toBeFalsy(); expect(cancelButton.disabled).toBeTruthy(); + + const adminDashboardUrl: HTMLAnchorElement = await screen.findByTestId( + "telemetry-settings__admin_dashboard_url", + ); + expect(adminDashboardUrl).toBeInTheDocument(); + expect(adminDashboardUrl.href).toEqual("http://admin_dashboard-url/"); }); it("Click::Save::Success", async () => { (axios.get as jest.Mock).mockResolvedValue({ data: { optOut: false } }); (axios.post as jest.Mock).mockResolvedValue({}); - render(); + render( + , + ); // Check initial settings let optInRadioButton: HTMLInputElement = await screen.findByTestId( @@ -100,7 +112,9 @@ describe("TelemetrySettings", () => { (axios.get as jest.Mock).mockResolvedValue({ data: { optOut: false } }); (axios.post as jest.Mock).mockRejectedValue({ response: { status: 500 } }); - render(); + render( + , + ); // Emulate click on "Opt Out" radio button const optOutRadioButton: HTMLInputElement = await screen.findByTestId( @@ -128,7 +142,9 @@ describe("TelemetrySettings", () => { it("Click::Cancel", async () => { (axios.get as jest.Mock).mockResolvedValue({ data: { optOut: false } }); - render(); + render( + , + ); // Check initial settings let optInRadioButton: HTMLInputElement = await screen.findByTestId( diff --git a/ansible_wisdom_console_react/src/index.tsx b/ansible_wisdom_console_react/src/index.tsx index ff516c773..cdc82b860 100644 --- a/ansible_wisdom_console_react/src/index.tsx +++ b/ansible_wisdom_console_react/src/index.tsx @@ -15,9 +15,16 @@ const telemetrySchema2EnabledInnerText = document.getElementById( )?.innerText; const telemetrySchema2Enabled = telemetrySchema2EnabledInnerText?.toLowerCase() === "true"; +const adminDashboardUrl = + document.getElementById("telemetry_schema_2_admin_dashboard_url") + ?.innerText ?? ""; createRoot(document.getElementById("root") as HTMLElement).render( - + , );