From 4f7c8b3b77dd11e655b20fdf40654881d98176f3 Mon Sep 17 00:00:00 2001 From: Viktor Vorona Date: Mon, 14 Aug 2023 13:07:45 +0200 Subject: [PATCH] SONAR-19870 Github sync warning message --- .../js/api/mocks/AuthenticationServiceMock.ts | 5 +- .../GitHubSynchronisationWarning.tsx | 87 ++++++++++++------- .../__tests__/Authentication-it.tsx | 16 +++- .../js/apps/users/__tests__/UsersApp-it.tsx | 14 +++ .../src/main/js/types/provisioning.ts | 1 + .../resources/org/sonar/l10n/core.properties | 3 +- 6 files changed, 92 insertions(+), 34 deletions(-) diff --git a/server/sonar-web/src/main/js/api/mocks/AuthenticationServiceMock.ts b/server/sonar-web/src/main/js/api/mocks/AuthenticationServiceMock.ts index a274646fa14..800cd0ef8a0 100644 --- a/server/sonar-web/src/main/js/api/mocks/AuthenticationServiceMock.ts +++ b/server/sonar-web/src/main/js/api/mocks/AuthenticationServiceMock.ts @@ -129,11 +129,11 @@ export default class AuthenticationServiceMock { return Promise.resolve({ enabled: false }); } - const nextSync = this.tasks.find((t: any) => + const nextSync = this.tasks.find((t: Task) => [TaskStatuses.InProgress, TaskStatuses.Pending].includes(t.status) ); const lastSync = this.tasks.find( - (t: any) => ![TaskStatuses.InProgress, TaskStatuses.Pending].includes(t.status) + (t: Task) => ![TaskStatuses.InProgress, TaskStatuses.Pending].includes(t.status) ); return Promise.resolve({ @@ -147,6 +147,7 @@ export default class AuthenticationServiceMock { executionTimeMs: lastSync.executionTimeMs, summary: lastSync.status === TaskStatuses.Success ? 'Test summary' : undefined, errorMessage: lastSync.errorMessage, + warningMessage: lastSync.warnings?.join() ?? undefined, } : undefined, }); diff --git a/server/sonar-web/src/main/js/app/components/GitHubSynchronisationWarning.tsx b/server/sonar-web/src/main/js/app/components/GitHubSynchronisationWarning.tsx index 5b637c729df..0fafaea3e73 100644 --- a/server/sonar-web/src/main/js/app/components/GitHubSynchronisationWarning.tsx +++ b/server/sonar-web/src/main/js/app/components/GitHubSynchronisationWarning.tsx @@ -22,6 +22,7 @@ import * as React from 'react'; import { FormattedMessage } from 'react-intl'; import Link from '../../components/common/Link'; import CheckIcon from '../../components/icons/CheckIcon'; +import WarningIcon from '../../components/icons/WarningIcon'; import { Alert } from '../../components/ui/Alert'; import { translate, translateWithParameters } from '../../helpers/l10n'; import { useGitHubSyncStatusQuery } from '../../queries/identity-provider'; @@ -42,7 +43,7 @@ function LastSyncAlert({ info, short }: LastSyncProps) { if (info === undefined) { return null; } - const { finishedAt, errorMessage, status, summary } = info; + const { finishedAt, errorMessage, status, summary, warningMessage } = info; const formattedDate = finishedAt ? formatDistance(new Date(finishedAt), new Date()) : ''; @@ -50,12 +51,33 @@ function LastSyncAlert({ info, short }: LastSyncProps) { return status === TaskStatuses.Success ? (
- + {warningMessage ? ( + + ) : ( + + )} - {translateWithParameters( - 'settings.authentication.github.synchronization_successful', - formattedDate + {warningMessage ? ( + + {translate('settings.authentication.github.synchronization_details_link')} + + ), + }} + /> + ) : ( + translateWithParameters( + 'settings.authentication.github.synchronization_successful', + formattedDate + ) )}
@@ -67,7 +89,7 @@ function LastSyncAlert({ info, short }: LastSyncProps) { values={{ details: ( - {translate('settings.authentication.github.synchronization_failed_link')} + {translate('settings.authentication.github.synchronization_details_link')} ), }} @@ -77,33 +99,38 @@ function LastSyncAlert({ info, short }: LastSyncProps) { } return ( - - {status === TaskStatuses.Success ? ( - <> - {translateWithParameters( - 'settings.authentication.github.synchronization_successful', - formattedDate - )} -
- {summary ?? ''} - - ) : ( - -
+ <> + + {status === TaskStatuses.Success ? ( + <> {translateWithParameters( - 'settings.authentication.github.synchronization_failed', + 'settings.authentication.github.synchronization_successful', formattedDate )} -
-
- {errorMessage ?? ''} -
- )} -
+
+ {summary ?? ''} + + ) : ( + +
+ {translateWithParameters( + 'settings.authentication.github.synchronization_failed', + formattedDate + )} +
+
+ {errorMessage ?? ''} +
+ )} + + + {warningMessage} + + ); } diff --git a/server/sonar-web/src/main/js/apps/settings/components/authentication/__tests__/Authentication-it.tsx b/server/sonar-web/src/main/js/apps/settings/components/authentication/__tests__/Authentication-it.tsx index d5a119ebbc1..b61e05b3f86 100644 --- a/server/sonar-web/src/main/js/apps/settings/components/authentication/__tests__/Authentication-it.tsx +++ b/server/sonar-web/src/main/js/apps/settings/components/authentication/__tests__/Authentication-it.tsx @@ -172,6 +172,8 @@ const ui = { configurationValidityError: byRole('status', { name: /github.configuration.validation.invalid/, }), + syncWarning: byText(/Warning/), + syncSummary: byText(/Test summary/), configurationValidityWarning: byRole('status', { name: /github.configuration.validation.valid.short/, }), @@ -473,7 +475,7 @@ describe('Github tab', () => { renderAuthentication([Feature.GithubProvisioning]); await github.enableProvisioning(user); expect(github.githubProvisioningSuccess.get()).toBeInTheDocument(); - expect(github.githubProvisioningButton.get()).toHaveTextContent('Test summary'); + expect(github.syncSummary.get()).toBeInTheDocument(); }); it('should display a success status even when another task is pending', async () => { @@ -777,6 +779,18 @@ describe('Github tab', () => { expect(github.configurationValiditySuccess.get()).toBeInTheDocument(); expect(github.configurationValidityError.query()).not.toBeInTheDocument(); }); + + it('should show warning', async () => { + handler.addProvisioningTask({ + status: TaskStatuses.Success, + warnings: ['Warning'], + }); + renderAuthentication([Feature.GithubProvisioning]); + await github.enableProvisioning(user); + + expect(await github.syncWarning.find()).toBeInTheDocument(); + expect(github.syncSummary.get()).toBeInTheDocument(); + }); }); }); diff --git a/server/sonar-web/src/main/js/apps/users/__tests__/UsersApp-it.tsx b/server/sonar-web/src/main/js/apps/users/__tests__/UsersApp-it.tsx index 702e348f7c4..d7a0eda66de 100644 --- a/server/sonar-web/src/main/js/apps/users/__tests__/UsersApp-it.tsx +++ b/server/sonar-web/src/main/js/apps/users/__tests__/UsersApp-it.tsx @@ -128,6 +128,7 @@ const ui = { githubProvisioningPending: byText(/synchronization_pending/), githubProvisioningInProgress: byText(/synchronization_in_progress/), githubProvisioningSuccess: byText(/synchronization_successful/), + githubProvisioningWarning: byText(/synchronization_successful.with_warning/), githubProvisioningAlert: byText(/synchronization_failed_short/), }; @@ -607,6 +608,19 @@ describe('in manage mode', () => { expect(ui.githubProvisioningSuccess.query()).not.toBeInTheDocument(); expect(ui.githubProvisioningInProgress.query()).not.toBeInTheDocument(); }); + + it('should display an warning alert', async () => { + const warningMessage = 'Very long warning about something that user is not interested in'; + authenticationHandler.addProvisioningTask({ + status: TaskStatuses.Success, + warnings: [warningMessage], + }); + renderUsersApp([Feature.GithubProvisioning]); + await act(async () => expect(await ui.githubProvisioningWarning.find()).toBeInTheDocument()); + // We don't want to display the full warning message. + expect(screen.queryByText(warningMessage)).not.toBeInTheDocument(); + expect(ui.githubProvisioningWarning.byRole('link').get()).toBeInTheDocument(); + }); }); }); diff --git a/server/sonar-web/src/main/js/types/provisioning.ts b/server/sonar-web/src/main/js/types/provisioning.ts index 521fdb8de44..81ff4c6d1c9 100644 --- a/server/sonar-web/src/main/js/types/provisioning.ts +++ b/server/sonar-web/src/main/js/types/provisioning.ts @@ -32,6 +32,7 @@ export type GithubStatusEnabled = { executionTimeMs: number; finishedAt: number; startedAt: number; + warningMessage?: string; } & ( | { status: TaskStatuses.Success; diff --git a/sonar-core/src/main/resources/org/sonar/l10n/core.properties b/sonar-core/src/main/resources/org/sonar/l10n/core.properties index cd7c7f23d0d..eda63d5a599 100644 --- a/sonar-core/src/main/resources/org/sonar/l10n/core.properties +++ b/sonar-core/src/main/resources/org/sonar/l10n/core.properties @@ -1425,9 +1425,10 @@ settings.authentication.github.synchronization_in_progress=Synchronization is in settings.authentication.github.synchronization_pending=Synchronization is scheduled. settings.authentication.github.synchronization_finish=Synchronization is done. settings.authentication.github.synchronization_successful=Last synchronization was done {0} ago. +settings.authentication.github.synchronization_successful.with_warning=Last synchronization was done {date} ago with warnings. {details} settings.authentication.github.synchronization_failed=Last synchronization failed {0} ago. settings.authentication.github.synchronization_failed_short=Last synchronization failed. {details} -settings.authentication.github.synchronization_failed_link=More details +settings.authentication.github.synchronization_details_link=More details settings.authentication.github.configuration.validation.details=View details settings.authentication.github.configuration.validation.test=Test configuration settings.authentication.github.configuration.validation.loading=Checking the configuration -- 2.39.5