From f23349832b9bbbb38287bd8677ff62edc5882e68 Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Sat, 25 Sep 2021 11:48:37 -0500 Subject: [PATCH] Extracted function and added tests Signed-off-by: Andre Wanlin --- .../src/api/AzureDevOpsApi.test.ts | 97 +++++++++++++++++++ .../src/api/AzureDevOpsApi.ts | 28 +++--- 2 files changed, 114 insertions(+), 11 deletions(-) create mode 100644 plugins/azure-devops-backend/src/api/AzureDevOpsApi.test.ts diff --git a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.test.ts b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.test.ts new file mode 100644 index 0000000000..077badfba1 --- /dev/null +++ b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.test.ts @@ -0,0 +1,97 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { repoBuildFromBuild } from './AzureDevOpsApi'; +import { RepoBuild } from './types'; +import { + Build, + BuildResult, + BuildStatus, + DefinitionReference, +} from 'azure-devops-node-api/interfaces/BuildInterfaces'; + +describe('AzureDevOpsApi', () => { + describe('repoBuildFromBuild', () => { + it('should return RepoBuild from Build', () => { + const inputBuildDefinition: DefinitionReference = { + name: 'My Build Definition', + }; + + const inputLinks: any = { + web: { + href: 'https://host.com/myOrg/0bcc0c0d-2d02/_build/results?buildId=1', + }, + }; + + const inputBuild: Build = { + id: 1, + buildNumber: 'Build-1', + status: BuildStatus.Completed, + result: BuildResult.Succeeded, + queueTime: new Date('2020-09-12T06:10:23.9325232Z'), + sourceBranch: 'refs/heads/develop', + sourceVersion: 'f4f78b3100b2923982bdf60c89c57ce6fd2d9a1c', + definition: inputBuildDefinition, + _links: inputLinks, + }; + + const outputRepoBuild: RepoBuild = { + id: 1, + title: 'My Build Definition - Build-1', + link: 'https://host.com/myOrg/0bcc0c0d-2d02/_build/results?buildId=1', + status: BuildStatus.Completed, + result: BuildResult.Succeeded, + queueTime: new Date('2020-09-12T06:10:23.9325232Z'), + source: 'refs/heads/develop (f4f78b31)', + }; + + expect(repoBuildFromBuild(inputBuild)).toEqual(outputRepoBuild); + }); + }); + + describe('repoBuildFromBuild with no Build definition name', () => { + it('should return RepoBuild with only Build Number for title', () => { + const inputLinks: any = { + web: { + href: 'https://host.com/myOrg/0bcc0c0d-2d02/_build/results?buildId=1', + }, + }; + + const inputBuild: Build = { + id: 1, + buildNumber: 'Build-1', + status: BuildStatus.Completed, + result: BuildResult.Succeeded, + queueTime: new Date('2020-09-12T06:10:23.9325232Z'), + sourceBranch: 'refs/heads/develop', + sourceVersion: 'f4f78b3100b2923982bdf60c89c57ce6fd2d9a1c', + definition: undefined, + _links: inputLinks, + }; + + const outputRepoBuild: RepoBuild = { + id: 1, + title: 'Build-1', + link: 'https://host.com/myOrg/0bcc0c0d-2d02/_build/results?buildId=1', + status: BuildStatus.Completed, + result: BuildResult.Succeeded, + queueTime: new Date('2020-09-12T06:10:23.9325232Z'), + source: 'refs/heads/develop (f4f78b31)', + }; + + expect(repoBuildFromBuild(inputBuild)).toEqual(outputRepoBuild); + }); + }); +}); diff --git a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts index c4291d24d3..a127770242 100644 --- a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts @@ -17,6 +17,7 @@ import { Logger } from 'winston'; import { WebApi } from 'azure-devops-node-api'; import { RepoBuild } from './types'; +import { Build } from 'azure-devops-node-api/interfaces/BuildInterfaces'; export class AzureDevOpsApi { constructor( @@ -84,19 +85,24 @@ export class AzureDevOpsApi { top, ); - const repoBuilds = buildList.map(build => { - const repoBuild: RepoBuild = { - id: build.id, - title: `${build.definition?.name} - ${build.buildNumber}`, - link: build._links?.web.href, - status: build.status, - result: build.result, - queueTime: build.queueTime, - source: `${build.sourceBranch} (${build.sourceVersion?.substr(0, 8)})`, - }; - return repoBuild; + const repoBuilds: RepoBuild[] = buildList.map(build => { + return repoBuildFromBuild(build); }); return repoBuilds; } } + +export function repoBuildFromBuild(build: Build) { + return { + id: build.id, + title: [build.definition?.name, build.buildNumber] + .filter(Boolean) + .join(' - '), + link: build._links?.web.href, + status: build.status, + result: build.result, + queueTime: build.queueTime, + source: `${build.sourceBranch} (${build.sourceVersion?.substr(0, 8)})`, + }; +}