*/ | */ | ||||
import { ThemeProvider } from '@emotion/react'; | import { ThemeProvider } from '@emotion/react'; | ||||
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; | |||||
import { QueryClientProvider } from '@tanstack/react-query'; | |||||
import { ToastMessageContainer, lightTheme } from 'design-system'; | import { ToastMessageContainer, lightTheme } from 'design-system'; | ||||
import * as React from 'react'; | import * as React from 'react'; | ||||
import { createRoot } from 'react-dom/client'; | import { createRoot } from 'react-dom/client'; | ||||
import webhooksRoutes from '../../apps/webhooks/routes'; | import webhooksRoutes from '../../apps/webhooks/routes'; | ||||
import { translate } from '../../helpers/l10n'; | import { translate } from '../../helpers/l10n'; | ||||
import { getBaseUrl } from '../../helpers/system'; | import { getBaseUrl } from '../../helpers/system'; | ||||
import { queryClient } from '../../queries/queryClient'; | |||||
import { AppState } from '../../types/appstate'; | import { AppState } from '../../types/appstate'; | ||||
import { Feature } from '../../types/features'; | import { Feature } from '../../types/features'; | ||||
import { CurrentUser } from '../../types/users'; | import { CurrentUser } from '../../types/users'; | ||||
{ basename: getBaseUrl() }, | { basename: getBaseUrl() }, | ||||
); | ); | ||||
const queryClient = new QueryClient(); | |||||
export default function startReactApp( | export default function startReactApp( | ||||
l10nBundle: IntlShape, | l10nBundle: IntlShape, | ||||
currentUser?: CurrentUser, | currentUser?: CurrentUser, |
/* | |||||
* SonarQube | |||||
* Copyright (C) 2009-2024 SonarSource SA | |||||
* mailto:info AT sonarsource DOT com | |||||
* | |||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
import { QueryClient } from '@tanstack/react-query'; | |||||
import { queryClient } from '../queryClient'; | |||||
jest.mock('@tanstack/react-query'); | |||||
it('should return the queryClient and not retry on 4xx errors', () => { | |||||
expect(queryClient).toBeDefined(); | |||||
expect(jest.mocked(QueryClient)).toHaveBeenCalledWith({ | |||||
defaultOptions: { queries: { retry: expect.any(Function) } }, | |||||
}); | |||||
const retryFunction = jest.mocked(QueryClient).mock.calls[0][0]?.defaultOptions?.queries | |||||
?.retry as Function; | |||||
expect(retryFunction(0, undefined)).toEqual(true); | |||||
expect(retryFunction(1, undefined)).toEqual(true); | |||||
expect(retryFunction(2, undefined)).toEqual(false); | |||||
expect(retryFunction(0, null)).toEqual(true); | |||||
expect(retryFunction(0, {})).toEqual(true); | |||||
expect(retryFunction(0, { status: 200 })).toEqual(true); | |||||
expect(retryFunction(0, { status: 400 })).toEqual(false); | |||||
expect(retryFunction(0, { status: 404 })).toEqual(false); | |||||
expect(retryFunction(0, { status: 500 })).toEqual(true); | |||||
}); |
return e; | return e; | ||||
}), | }), | ||||
staleTime: 60_000, | staleTime: 60_000, | ||||
retry: false, | |||||
enabled: projectKey !== null, | enabled: projectKey !== null, | ||||
...options, | ...options, | ||||
}); | }); |
/* | |||||
* SonarQube | |||||
* Copyright (C) 2009-2024 SonarSource SA | |||||
* mailto:info AT sonarsource DOT com | |||||
* | |||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
import { QueryClient } from '@tanstack/react-query'; | |||||
export const queryClient = new QueryClient({ | |||||
defaultOptions: { | |||||
queries: { | |||||
retry: (failureCount, error) => { | |||||
if (typeof error === 'object' && error !== null && 'status' in error) { | |||||
const { status } = error as unknown as Response; | |||||
if (status >= 400 && status < 500) { | |||||
// no point in retrying on 4xx errors | |||||
return false; | |||||
} | |||||
} | |||||
return failureCount < 2; | |||||
}, | |||||
}, | |||||
}, | |||||
}); |