From 1b2d1ff431ab8c917a6dc378cd748ce4e1a5a781 Mon Sep 17 00:00:00 2001 From: Neemys <36508659+Neemys@users.noreply.github.com> Date: Mon, 1 Aug 2022 10:42:43 +0200 Subject: [PATCH] Make instanceName an optional parameter in plugin `sonarqube-backend` APIs Signed-off-by: Neemys <36508659+Neemys@users.noreply.github.com> --- plugins/sonarqube-backend/api-report.md | 8 ++-- .../src/service/router.test.ts | 16 +++++++- .../sonarqube-backend/src/service/router.ts | 37 +++++++------------ .../src/service/sonarqubeInfoProvider.test.ts | 13 +++++++ .../src/service/sonarqubeInfoProvider.ts | 23 +++++++----- 5 files changed, 58 insertions(+), 39 deletions(-) diff --git a/plugins/sonarqube-backend/api-report.md b/plugins/sonarqube-backend/api-report.md index b4f1ad4589..8f0c672c6c 100644 --- a/plugins/sonarqube-backend/api-report.md +++ b/plugins/sonarqube-backend/api-report.md @@ -13,12 +13,12 @@ export function createRouter(options: RouterOptions): Promise; // @public export class DefaultSonarqubeInfoProvider implements SonarqubeInfoProvider { static fromConfig(config: Config): DefaultSonarqubeInfoProvider; - getBaseUrl({ instanceName }: { instanceName: string }): { + getBaseUrl({ instanceName }?: { instanceName?: string }): { baseUrl: string; }; getFindings( componentKey: string, - instanceName: string, + instanceName?: string, ): Promise; } @@ -45,12 +45,12 @@ export interface SonarqubeFindings { // @public export interface SonarqubeInfoProvider { - getBaseUrl({ instanceName }: { instanceName: string }): { + getBaseUrl({ instanceName }?: { instanceName?: string }): { baseUrl: string; }; getFindings( componentKey: string, - instanceName: string, + instanceName?: string, ): Promise; } diff --git a/plugins/sonarqube-backend/src/service/router.test.ts b/plugins/sonarqube-backend/src/service/router.test.ts index 719db6787e..e082215abc 100644 --- a/plugins/sonarqube-backend/src/service/router.test.ts +++ b/plugins/sonarqube-backend/src/service/router.test.ts @@ -83,7 +83,7 @@ describe('createRouter', () => { expect(response.status).toEqual(400); }); - it('use an empty string as instance name when instance key not provided', async () => { + it('use the value as instance name when instance key not provided', async () => { const measures = { analysisDate: '2021-04-08', measures: [{ metric: 'vulnerabilities', value: '54' }], @@ -94,11 +94,12 @@ describe('createRouter', () => { .get('/findings') .query({ componentKey: DUMMY_COMPONENT_KEY, + instanceKey: undefined, }) .send(); expect(getFindingsMock).toBeCalledTimes(1); - expect(getFindingsMock).toBeCalledWith(DUMMY_COMPONENT_KEY, ''); + expect(getFindingsMock).toBeCalledWith(DUMMY_COMPONENT_KEY, undefined); expect(response.status).toEqual(200); expect(response.body).toEqual(measures); }); @@ -121,5 +122,16 @@ describe('createRouter', () => { expect(response.status).toEqual(200); expect(response.body).toEqual({ instanceUrl: DUMMY_INSTANCE_URL }); }); + + it('query default instance when instanceKey not provided', async () => { + getBaseUrlMock.mockReturnValue({ baseUrl: DUMMY_INSTANCE_URL }); + const response = await request(app).get('/instanceUrl').send(); + expect(getBaseUrlMock).toBeCalledTimes(1); + expect(getBaseUrlMock).toBeCalledWith({ + instanceName: undefined, + }); + expect(response.status).toEqual(200); + expect(response.body).toEqual({ instanceUrl: DUMMY_INSTANCE_URL }); + }); }); }); diff --git a/plugins/sonarqube-backend/src/service/router.ts b/plugins/sonarqube-backend/src/service/router.ts index d6f5da7691..674045121f 100644 --- a/plugins/sonarqube-backend/src/service/router.ts +++ b/plugins/sonarqube-backend/src/service/router.ts @@ -54,21 +54,16 @@ export async function createRouter( router.use(express.json()); router.get('/findings', async (request, response) => { const componentKey = request.query.componentKey as string; - let instanceKey = request.query.instanceKey as string; + const instanceKey = request.query.instanceKey as string; if (!componentKey) throw new InputError('ComponentKey must be provided as a single string.'); - if (!instanceKey) { - instanceKey = ''; - logger.info( - `Retrieving findings for component ${componentKey} in default sonarqube instance`, - ); - } else { - logger.info( - `Retrieving findings for component ${componentKey} in sonarqube instance name ${instanceKey}`, - ); - } + logger.info( + instanceKey + ? `Retrieving findings for component ${componentKey} in sonarqube instance name ${instanceKey}` + : `Retrieving findings for component ${componentKey} in default sonarqube instance`, + ); response.json( await sonarqubeInfoProvider.getFindings(componentKey, instanceKey), @@ -76,19 +71,15 @@ export async function createRouter( }); router.get('/instanceUrl', (request, response) => { - let requestedInstanceKey = request.query.instanceKey as string; - if (requestedInstanceKey) { - logger.info( - `Retrieving sonarqube instance URL for key ${requestedInstanceKey}`, - ); - } else { - requestedInstanceKey = ''; - logger.info( - `Retrieving default sonarqube instance URL as parameter is inexistant, empty or malformed`, - ); - } + const instanceKey = request.query.instanceKey as string; + + logger.info( + instanceKey + ? `Retrieving sonarqube instance URL for key ${instanceKey}` + : `Retrieving default sonarqube instance URL as instanceKey is not provided`, + ); const { baseUrl } = sonarqubeInfoProvider.getBaseUrl({ - instanceName: requestedInstanceKey, + instanceName: instanceKey, }); response.json({ instanceUrl: baseUrl, diff --git a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts index 774fdca238..f7298888fe 100644 --- a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts +++ b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts @@ -229,6 +229,19 @@ describe('DefaultSonarqubeInfoProvider', () => { } describe('getBaseUrl', () => { + it('Provide base url for default from simple config and non provided instanceName', async () => { + const provider = configureProvider({ + sonarqube: { + baseUrl: 'https://sonarqube.example.com', + apiKey: '123456789abcdef0123456789abcedf012', + }, + }); + + expect(provider.getBaseUrl()).toEqual({ + baseUrl: 'https://sonarqube.example.com', + }); + }); + it('Provide base url for default from simple config and empty string', async () => { const provider = configureProvider({ sonarqube: { diff --git a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts index 6f75171f65..f03593b012 100644 --- a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts +++ b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts @@ -23,18 +23,21 @@ import fetch from 'node-fetch'; */ export interface SonarqubeInfoProvider { /** - * Get the sonarqube URL in configuration from a provided name. + * Get the sonarqube URL in configuration from a provided instanceName. * - * If name is omitted, default sonarqube instance is queried in config + * If instanceName is omitted, default sonarqube instance is queried in config * * @param instanceName - Name of the sonarqube instance to get the info from * @returns the url of the instance */ - getBaseUrl({ instanceName }: { instanceName: string }): { baseUrl: string }; + getBaseUrl({ instanceName }?: { instanceName?: string }): { baseUrl: string }; /** * Query the sonarqube instance corresponding to the instanceName to get all * measures for the component of key componentKey. + * + * If instanceName is omitted, default sonarqube instance is queried in config + * * @param componentKey - component key of the project we want to get measure from. * @param instanceName - name of the instance (in config) where the project is hosted. * @returns All measures with the analysis date. Will return undefined if we @@ -42,7 +45,7 @@ export interface SonarqubeInfoProvider { */ getFindings( componentKey: string, - instanceName: string, + instanceName?: string, ): Promise; } @@ -295,8 +298,10 @@ export class DefaultSonarqubeInfoProvider implements SonarqubeInfoProvider { * {@inheritDoc SonarqubeInfoProvider.getBaseUrl} * @throws Error If configuration can't be retrieved. */ - getBaseUrl({ instanceName }: { instanceName: string }): { baseUrl: string } { - const instanceConfig = this.config.getInstanceConfig(instanceName ?? ''); + getBaseUrl({ instanceName }: { instanceName?: string } = {}): { + baseUrl: string; + } { + const instanceConfig = this.config.getInstanceConfig(instanceName); return { baseUrl: instanceConfig.baseUrl }; } @@ -306,11 +311,9 @@ export class DefaultSonarqubeInfoProvider implements SonarqubeInfoProvider { */ async getFindings( componentKey: string, - instanceName: string, + instanceName?: string, ): Promise { - const { baseUrl, apiKey } = this.config.getInstanceConfig( - instanceName ?? '', - ); + const { baseUrl, apiKey } = this.config.getInstanceConfig(instanceName); // get component info to retrieve analysis date const component =