]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-17465 Handle missing port number for SonarLint Connection
authorJeremy Davis <jeremy.davis@sonarsource.com>
Mon, 31 Oct 2022 13:14:26 +0000 (14:14 +0100)
committersonartech <sonartech@sonarsource.com>
Tue, 1 Nov 2022 20:03:09 +0000 (20:03 +0000)
server/sonar-web/src/main/js/app/components/SonarLintConnection.tsx
server/sonar-web/src/main/js/app/components/__tests__/SonarLintConnection-test.tsx

index 591a14d4ee3a62219b74bdc7509466bd3c16aec8..1a997e66bc77b8789fbe7ebc25ca9a45961a7305 100644 (file)
@@ -19,7 +19,7 @@
  */
 import * as React from 'react';
 import { FormattedMessage } from 'react-intl';
-import { useNavigate, useSearchParams } from 'react-router-dom';
+import { useSearchParams } from 'react-router-dom';
 import { generateToken, getTokens } from '../../api/user-tokens';
 import Link from '../../components/common/Link';
 import { Button } from '../../components/controls/buttons';
@@ -40,8 +40,8 @@ import './SonarLintConnection.css';
 enum Status {
   request,
   tokenError,
-  connectionError,
-  success
+  tokenCreated,
+  tokenSent
 }
 
 interface Props {
@@ -64,7 +64,6 @@ async function computeExpirationDate() {
 }
 
 export function SonarLintConnection({ currentUser }: Props) {
-  const navigate = useNavigate();
   const [searchParams] = useSearchParams();
   const [status, setStatus] = React.useState(Status.request);
   const [newToken, setNewToken] = React.useState<NewUserToken | undefined>(undefined);
@@ -72,13 +71,6 @@ export function SonarLintConnection({ currentUser }: Props) {
   const port = parseInt(searchParams.get('port') ?? '0', 10);
   const ideName = searchParams.get('ideName') ?? translate('sonarlint-connection.unspecified-ide');
 
-  // If the port is not in the expected range, redirect to home page
-  React.useEffect(() => {
-    if (!portIsValid(port)) {
-      navigate('/');
-    }
-  }, [navigate, port]);
-
   const { login } = currentUser;
 
   const authorize = React.useCallback(async () => {
@@ -95,11 +87,16 @@ export function SonarLintConnection({ currentUser }: Props) {
 
     setNewToken(token);
 
+    if (!portIsValid(port)) {
+      setStatus(Status.tokenCreated);
+      return;
+    }
+
     try {
       await sendUserToken(port, token);
-      setStatus(Status.success);
+      setStatus(Status.tokenSent);
     } catch (_) {
-      setStatus(Status.connectionError);
+      setStatus(Status.tokenCreated);
     }
   }, [port, ideName, login]);
 
@@ -162,7 +159,7 @@ export function SonarLintConnection({ currentUser }: Props) {
             </>
           )}
 
-          {status === Status.connectionError && newToken && (
+          {status === Status.tokenCreated && newToken && (
             <>
               <img
                 alt=""
@@ -200,7 +197,7 @@ export function SonarLintConnection({ currentUser }: Props) {
             </>
           )}
 
-          {status === Status.success && newToken && (
+          {status === Status.tokenSent && newToken && (
             <>
               <h1 className="big-spacer-top big-spacer-bottom">
                 {translate('sonarlint-connection.success.title')}
index 2137385bb1bdc921f4b64fdb09ffd3b58e61d474..4c1daef425d7c28e68a0064e46addf6aa1f88bf3 100644 (file)
@@ -123,12 +123,18 @@ it('should require authentication if user is not logged in', () => {
   expect(handleRequiredAuthentication).toHaveBeenCalled();
 });
 
-it('should redirect if port is not provided', () => {
+it('should let the user copy the token if the port is not valid', async () => {
+  const user = userEvent.setup();
+
   renderSonarLintConnection({ port: '' });
 
+  await user.click(
+    await screen.findByRole('button', { name: 'sonarlint-connection.request.action' })
+  );
+
   expect(
-    screen.queryByRole('heading', { name: 'sonarlint-connection.title' })
-  ).not.toBeInTheDocument();
+    await screen.findByText('sonarlint-connection.connection-error.description')
+  ).toBeInTheDocument();
 });
 
 function renderSonarLintConnection(overrides: { currentUser?: CurrentUser; port?: string } = {}) {