Loading src/common/gilab/check_version.ts +1 −1 Original line number Diff line number Diff line Loading @@ -5,7 +5,7 @@ import { ifVersionGte } from '../utils/if_version_gte'; import { GitLabPlatformForAccount, GitLabPlatformManager } from '../platform/gitlab_platform'; import { GetRequest } from '../platform/web_ide'; export const versionRequest: GetRequest<{ version: string }> = { export const versionRequest: GetRequest<{ version: string; enterprise?: boolean }> = { type: 'rest', method: 'GET', path: '/version', Loading src/desktop/gitlab/gitlab_service.test.ts +20 −6 Original line number Diff line number Diff line Loading @@ -551,17 +551,15 @@ describe('gitlab_service', () => { const TEST_FEATURE_NAME = 'Test Feature Name'; const TEST_NEXT_VERSION = '10.2.0'; const TEST_PREV_VERSION = '10.1.1'; const mock = jest.spyOn(GitLabService.prototype, 'getVersion'); beforeAll(() => { mock.mockImplementation(() => Promise.resolve(TEST_CURRENT_VERSION)); }); const mock = jest.spyOn(GitLabService.prototype, 'getVersionAndEdition'); afterAll(() => { mock.mockRestore(); }); it('rejects when current version is less than feature version', async () => { mock.mockImplementation(() => Promise.resolve({ version: TEST_CURRENT_VERSION })); const featureVersion = TEST_NEXT_VERSION; await expect(service.validateVersion(TEST_FEATURE_NAME, featureVersion)).rejects.toThrow( Loading @@ -569,11 +567,27 @@ describe('gitlab_service', () => { ); }); it('rejects when expecting Enterprise Edition', async () => { mock.mockImplementation(() => Promise.resolve({ version: TEST_CURRENT_VERSION, enterprise: false }), ); const featureVersion = TEST_PREV_VERSION; await expect( service.validateVersion(TEST_FEATURE_NAME, featureVersion, true), ).rejects.toThrow(); }); it('resolves when current version is gte than feature version', async () => { mock.mockImplementation(() => Promise.resolve({ version: TEST_CURRENT_VERSION, enterprise: true }), ); const featureVersion = TEST_PREV_VERSION; await expect( service.validateVersion(TEST_FEATURE_NAME, featureVersion), service.validateVersion(TEST_FEATURE_NAME, featureVersion, true), ).resolves.toBeUndefined(); }); }); Loading src/desktop/gitlab/gitlab_service.ts +26 −8 Original line number Diff line number Diff line Loading @@ -158,6 +158,11 @@ const getTotalPages = (response: Response): number => const getCurrentPage = (query: Record<string, QueryValue>): number => query.page && typeof query.page === 'number' ? query.page : 1; interface VersionResponse { version: string; enterprise?: boolean; } export interface ValidationResponse { valid?: boolean; merged_yaml?: string; Loading Loading @@ -236,20 +241,24 @@ export class GitLabService { return result.json() as Promise<T[]>; } async getVersion(): Promise<string | undefined> { async getVersionAndEdition(): Promise<VersionResponse | undefined> { try { const result = await this.#apiClient.fetch<{ version: string }>( const result = await this.#apiClient.fetch<VersionResponse>( '/version', {}, 'instance version', ); return result.version; return result; } catch (e) { log.error(e); return undefined; } } async getVersion(): Promise<string | undefined> { return (await this.getVersionAndEdition())?.version; } // TODO: Remove this method and replace references to `GitLabService.fetchFromApi` with `ApiClient.fetchFromApi` fetchFromApi<T>(request: ApiRequest<T>): Promise<T> { return this.#apiClient.fetchFromApi(request); Loading Loading @@ -649,16 +658,25 @@ export class GitLabService { ); } async validateVersion(featureName: string, requiredVersion: string) { const currentVersion = await this.getVersion(); await ifVersionGte( currentVersion, async validateVersion( featureName: string, requiredVersion: string, requireEnterprise: boolean = false, ) { const currentVersion = (await this.getVersionAndEdition())!; ifVersionGte( currentVersion.version, requiredVersion, () => undefined, () => { throw new UnsupportedVersionError(featureName, currentVersion!, requiredVersion); throw new UnsupportedVersionError(featureName, currentVersion.version, requiredVersion); }, ); if (requireEnterprise && currentVersion && !currentVersion.enterprise) { throw new Error(`${featureName} requires GitLab Enterprise.`); } } async getFirstUserByUsername(username: string): Promise<RestUser | undefined> { Loading src/desktop/gitlab/security_findings/get_all_security_reports.test.ts +1 −1 Original line number Diff line number Diff line Loading @@ -204,6 +204,6 @@ describe('getAllSecurityReports', () => { await getAllSecurityReports(service, project, mr); expect(getLoggedMessage()).toEqual(testError); expect(service.validateVersion).toHaveBeenCalledWith('Security Findings', '16.1.0'); expect(service.validateVersion).toHaveBeenCalledWith('Security Findings', '16.1.0', true); }); }); src/desktop/gitlab/security_findings/get_all_security_reports.ts +5 −1 Original line number Diff line number Diff line Loading @@ -55,7 +55,11 @@ export const getAllSecurityReports = async ( mr: RestMr, ): Promise<GqlSecurityFindingReport | undefined> => { try { await gitlabService.validateVersion('Security Findings', REQUIRED_VERSIONS.SECURITY_FINDINGS); await gitlabService.validateVersion( 'Security Findings', REQUIRED_VERSIONS.SECURITY_FINDINGS, true, ); } catch (e) { log.warn(e); return undefined; Loading Loading
src/common/gilab/check_version.ts +1 −1 Original line number Diff line number Diff line Loading @@ -5,7 +5,7 @@ import { ifVersionGte } from '../utils/if_version_gte'; import { GitLabPlatformForAccount, GitLabPlatformManager } from '../platform/gitlab_platform'; import { GetRequest } from '../platform/web_ide'; export const versionRequest: GetRequest<{ version: string }> = { export const versionRequest: GetRequest<{ version: string; enterprise?: boolean }> = { type: 'rest', method: 'GET', path: '/version', Loading
src/desktop/gitlab/gitlab_service.test.ts +20 −6 Original line number Diff line number Diff line Loading @@ -551,17 +551,15 @@ describe('gitlab_service', () => { const TEST_FEATURE_NAME = 'Test Feature Name'; const TEST_NEXT_VERSION = '10.2.0'; const TEST_PREV_VERSION = '10.1.1'; const mock = jest.spyOn(GitLabService.prototype, 'getVersion'); beforeAll(() => { mock.mockImplementation(() => Promise.resolve(TEST_CURRENT_VERSION)); }); const mock = jest.spyOn(GitLabService.prototype, 'getVersionAndEdition'); afterAll(() => { mock.mockRestore(); }); it('rejects when current version is less than feature version', async () => { mock.mockImplementation(() => Promise.resolve({ version: TEST_CURRENT_VERSION })); const featureVersion = TEST_NEXT_VERSION; await expect(service.validateVersion(TEST_FEATURE_NAME, featureVersion)).rejects.toThrow( Loading @@ -569,11 +567,27 @@ describe('gitlab_service', () => { ); }); it('rejects when expecting Enterprise Edition', async () => { mock.mockImplementation(() => Promise.resolve({ version: TEST_CURRENT_VERSION, enterprise: false }), ); const featureVersion = TEST_PREV_VERSION; await expect( service.validateVersion(TEST_FEATURE_NAME, featureVersion, true), ).rejects.toThrow(); }); it('resolves when current version is gte than feature version', async () => { mock.mockImplementation(() => Promise.resolve({ version: TEST_CURRENT_VERSION, enterprise: true }), ); const featureVersion = TEST_PREV_VERSION; await expect( service.validateVersion(TEST_FEATURE_NAME, featureVersion), service.validateVersion(TEST_FEATURE_NAME, featureVersion, true), ).resolves.toBeUndefined(); }); }); Loading
src/desktop/gitlab/gitlab_service.ts +26 −8 Original line number Diff line number Diff line Loading @@ -158,6 +158,11 @@ const getTotalPages = (response: Response): number => const getCurrentPage = (query: Record<string, QueryValue>): number => query.page && typeof query.page === 'number' ? query.page : 1; interface VersionResponse { version: string; enterprise?: boolean; } export interface ValidationResponse { valid?: boolean; merged_yaml?: string; Loading Loading @@ -236,20 +241,24 @@ export class GitLabService { return result.json() as Promise<T[]>; } async getVersion(): Promise<string | undefined> { async getVersionAndEdition(): Promise<VersionResponse | undefined> { try { const result = await this.#apiClient.fetch<{ version: string }>( const result = await this.#apiClient.fetch<VersionResponse>( '/version', {}, 'instance version', ); return result.version; return result; } catch (e) { log.error(e); return undefined; } } async getVersion(): Promise<string | undefined> { return (await this.getVersionAndEdition())?.version; } // TODO: Remove this method and replace references to `GitLabService.fetchFromApi` with `ApiClient.fetchFromApi` fetchFromApi<T>(request: ApiRequest<T>): Promise<T> { return this.#apiClient.fetchFromApi(request); Loading Loading @@ -649,16 +658,25 @@ export class GitLabService { ); } async validateVersion(featureName: string, requiredVersion: string) { const currentVersion = await this.getVersion(); await ifVersionGte( currentVersion, async validateVersion( featureName: string, requiredVersion: string, requireEnterprise: boolean = false, ) { const currentVersion = (await this.getVersionAndEdition())!; ifVersionGte( currentVersion.version, requiredVersion, () => undefined, () => { throw new UnsupportedVersionError(featureName, currentVersion!, requiredVersion); throw new UnsupportedVersionError(featureName, currentVersion.version, requiredVersion); }, ); if (requireEnterprise && currentVersion && !currentVersion.enterprise) { throw new Error(`${featureName} requires GitLab Enterprise.`); } } async getFirstUserByUsername(username: string): Promise<RestUser | undefined> { Loading
src/desktop/gitlab/security_findings/get_all_security_reports.test.ts +1 −1 Original line number Diff line number Diff line Loading @@ -204,6 +204,6 @@ describe('getAllSecurityReports', () => { await getAllSecurityReports(service, project, mr); expect(getLoggedMessage()).toEqual(testError); expect(service.validateVersion).toHaveBeenCalledWith('Security Findings', '16.1.0'); expect(service.validateVersion).toHaveBeenCalledWith('Security Findings', '16.1.0', true); }); });
src/desktop/gitlab/security_findings/get_all_security_reports.ts +5 −1 Original line number Diff line number Diff line Loading @@ -55,7 +55,11 @@ export const getAllSecurityReports = async ( mr: RestMr, ): Promise<GqlSecurityFindingReport | undefined> => { try { await gitlabService.validateVersion('Security Findings', REQUIRED_VERSIONS.SECURITY_FINDINGS); await gitlabService.validateVersion( 'Security Findings', REQUIRED_VERSIONS.SECURITY_FINDINGS, true, ); } catch (e) { log.warn(e); return undefined; Loading