Merge pull request #7998 from awanlin/topic/improve-azure-devops-date-handling

Improved Azure DevOps Date Handling
This commit is contained in:
Ben Lambert
2021-11-12 16:02:49 +01:00
committed by GitHub
8 changed files with 74 additions and 64 deletions
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/plugin-azure-devops': patch
'@backstage/plugin-azure-devops-backend': patch
'@backstage/plugin-azure-devops-common': minor
---
Improved Date handling for the Azure DevOps set of plugins by using strings and letting the frontend handle the conversion to DateTime
@@ -48,7 +48,7 @@ describe('AzureDevOpsApi', () => {
const inputIdentityRef: IdentityRef = {
displayName: 'Jane Doe',
uniqueName: 'DOMAINjdoe',
uniqueName: 'DOMAIN\\jdoe',
};
const inputBuild: Build = {
@@ -56,9 +56,9 @@ describe('AzureDevOpsApi', () => {
buildNumber: 'Build-1',
status: BuildStatus.Completed,
result: BuildResult.Succeeded,
queueTime: new Date('2020-09-12T06:10:23.9325232Z'),
startTime: new Date('2020-09-12T06:15:23.9325232Z'),
finishTime: new Date('2020-09-12T06:20:23.9325232Z'),
queueTime: new Date('2020-09-12T06:10:23.932Z'),
startTime: new Date('2020-09-12T06:15:23.932Z'),
finishTime: new Date('2020-09-12T06:20:23.932Z'),
sourceBranch: 'refs/heads/develop',
sourceVersion: 'f4f78b3100b2923982bdf60c89c57ce6fd2d9a1c',
definition: inputBuildDefinition,
@@ -72,11 +72,11 @@ describe('AzureDevOpsApi', () => {
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'),
startTime: new Date('2020-09-12T06:15:23.9325232Z'),
finishTime: new Date('2020-09-12T06:20:23.9325232Z'),
queueTime: '2020-09-12T06:10:23.932Z',
startTime: '2020-09-12T06:15:23.932Z',
finishTime: '2020-09-12T06:20:23.932Z',
source: 'refs/heads/develop (f4f78b31)',
uniqueName: 'DOMAINjdoe',
uniqueName: 'DOMAIN\\jdoe',
};
expect(mappedRepoBuild(inputBuild)).toEqual(outputRepoBuild);
@@ -93,7 +93,7 @@ describe('AzureDevOpsApi', () => {
const inputIdentityRef: IdentityRef = {
displayName: 'Jane Doe',
uniqueName: 'DOMAINjdoe',
uniqueName: 'DOMAIN\\jdoe',
};
const inputBuild: Build = {
@@ -101,9 +101,9 @@ describe('AzureDevOpsApi', () => {
buildNumber: 'Build-1',
status: BuildStatus.Completed,
result: BuildResult.Succeeded,
queueTime: new Date('2020-09-12T06:10:23.9325232Z'),
startTime: new Date('2020-09-12T06:15:23.9325232Z'),
finishTime: new Date('2020-09-12T06:20:23.9325232Z'),
queueTime: new Date('2020-09-12T06:10:23.932Z'),
startTime: new Date('2020-09-12T06:15:23.932Z'),
finishTime: new Date('2020-09-12T06:20:23.932Z'),
sourceBranch: 'refs/heads/develop',
sourceVersion: 'f4f78b3100b2923982bdf60c89c57ce6fd2d9a1c',
definition: undefined,
@@ -117,11 +117,11 @@ describe('AzureDevOpsApi', () => {
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'),
startTime: new Date('2020-09-12T06:15:23.9325232Z'),
finishTime: new Date('2020-09-12T06:20:23.9325232Z'),
queueTime: '2020-09-12T06:10:23.932Z',
startTime: '2020-09-12T06:15:23.932Z',
finishTime: '2020-09-12T06:20:23.932Z',
source: 'refs/heads/develop (f4f78b31)',
uniqueName: 'DOMAINjdoe',
uniqueName: 'DOMAIN\\jdoe',
};
expect(mappedRepoBuild(inputBuild)).toEqual(outputRepoBuild);
@@ -138,7 +138,7 @@ describe('AzureDevOpsApi', () => {
const inputIdentityRef: IdentityRef = {
displayName: 'Jane Doe',
uniqueName: 'DOMAINjdoe',
uniqueName: 'DOMAIN\\jdoe',
};
const inputBuild: Build = {
@@ -146,9 +146,9 @@ describe('AzureDevOpsApi', () => {
buildNumber: 'Build-1',
status: undefined,
result: BuildResult.Succeeded,
queueTime: new Date('2020-09-12T06:10:23.9325232Z'),
startTime: new Date('2020-09-12T06:15:23.9325232Z'),
finishTime: new Date('2020-09-12T06:20:23.9325232Z'),
queueTime: new Date('2020-09-12T06:10:23.932Z'),
startTime: new Date('2020-09-12T06:15:23.932Z'),
finishTime: new Date('2020-09-12T06:20:23.932Z'),
sourceBranch: 'refs/heads/develop',
sourceVersion: 'f4f78b3100b2923982bdf60c89c57ce6fd2d9a1c',
definition: undefined,
@@ -162,11 +162,11 @@ describe('AzureDevOpsApi', () => {
link: 'https://host.com/myOrg/0bcc0c0d-2d02/_build/results?buildId=1',
status: BuildStatus.None,
result: BuildResult.Succeeded,
queueTime: new Date('2020-09-12T06:10:23.9325232Z'),
startTime: new Date('2020-09-12T06:15:23.9325232Z'),
finishTime: new Date('2020-09-12T06:20:23.9325232Z'),
queueTime: '2020-09-12T06:10:23.932Z',
startTime: '2020-09-12T06:15:23.932Z',
finishTime: '2020-09-12T06:20:23.932Z',
source: 'refs/heads/develop (f4f78b31)',
uniqueName: 'DOMAINjdoe',
uniqueName: 'DOMAIN\\jdoe',
};
expect(mappedRepoBuild(inputBuild)).toEqual(outputRepoBuild);
@@ -183,7 +183,7 @@ describe('AzureDevOpsApi', () => {
const inputIdentityRef: IdentityRef = {
displayName: 'Jane Doe',
uniqueName: 'DOMAINjdoe',
uniqueName: 'DOMAIN\\jdoe',
};
const inputBuild: Build = {
@@ -191,9 +191,9 @@ describe('AzureDevOpsApi', () => {
buildNumber: 'Build-1',
status: BuildStatus.InProgress,
result: undefined,
queueTime: new Date('2020-09-12T06:10:23.9325232Z'),
startTime: new Date('2020-09-12T06:15:23.9325232Z'),
finishTime: new Date('2020-09-12T06:20:23.9325232Z'),
queueTime: new Date('2020-09-12T06:10:23.932Z'),
startTime: new Date('2020-09-12T06:15:23.932Z'),
finishTime: new Date('2020-09-12T06:20:23.932Z'),
sourceBranch: 'refs/heads/develop',
sourceVersion: 'f4f78b3100b2923982bdf60c89c57ce6fd2d9a1c',
definition: undefined,
@@ -207,11 +207,11 @@ describe('AzureDevOpsApi', () => {
link: 'https://host.com/myOrg/0bcc0c0d-2d02/_build/results?buildId=1',
status: BuildStatus.InProgress,
result: BuildResult.None,
queueTime: new Date('2020-09-12T06:10:23.9325232Z'),
startTime: new Date('2020-09-12T06:15:23.9325232Z'),
finishTime: new Date('2020-09-12T06:20:23.9325232Z'),
queueTime: '2020-09-12T06:10:23.932Z',
startTime: '2020-09-12T06:15:23.932Z',
finishTime: '2020-09-12T06:20:23.932Z',
source: 'refs/heads/develop (f4f78b31)',
uniqueName: 'DOMAINjdoe',
uniqueName: 'DOMAIN\\jdoe',
};
expect(mappedRepoBuild(inputBuild)).toEqual(outputRepoBuild);
@@ -222,7 +222,7 @@ describe('AzureDevOpsApi', () => {
it('should return empty string for link', () => {
const inputIdentityRef: IdentityRef = {
displayName: 'Jane Doe',
uniqueName: 'DOMAINjdoe',
uniqueName: 'DOMAIN\\jdoe',
};
const inputBuild: Build = {
@@ -230,9 +230,9 @@ describe('AzureDevOpsApi', () => {
buildNumber: 'Build-1',
status: BuildStatus.InProgress,
result: undefined,
queueTime: new Date('2020-09-12T06:10:23.9325232Z'),
startTime: new Date('2020-09-12T06:15:23.9325232Z'),
finishTime: new Date('2020-09-12T06:20:23.9325232Z'),
queueTime: new Date('2020-09-12T06:10:23.932Z'),
startTime: new Date('2020-09-12T06:15:23.932Z'),
finishTime: new Date('2020-09-12T06:20:23.932Z'),
sourceBranch: 'refs/heads/develop',
sourceVersion: 'f4f78b3100b2923982bdf60c89c57ce6fd2d9a1c',
definition: undefined,
@@ -246,11 +246,11 @@ describe('AzureDevOpsApi', () => {
link: '',
status: BuildStatus.InProgress,
result: BuildResult.None,
queueTime: new Date('2020-09-12T06:10:23.9325232Z'),
startTime: new Date('2020-09-12T06:15:23.9325232Z'),
finishTime: new Date('2020-09-12T06:20:23.9325232Z'),
queueTime: '2020-09-12T06:10:23.932Z',
startTime: '2020-09-12T06:15:23.932Z',
finishTime: '2020-09-12T06:20:23.932Z',
source: 'refs/heads/develop (f4f78b31)',
uniqueName: 'DOMAINjdoe',
uniqueName: 'DOMAIN\\jdoe',
};
expect(mappedRepoBuild(inputBuild)).toEqual(outputRepoBuild);
@@ -265,7 +265,7 @@ describe('AzureDevOpsApi', () => {
const inputIdentityRef: IdentityRef = {
displayName: 'Jane Doe',
uniqueName: 'DOMAINjdoe',
uniqueName: 'DOMAIN\\jdoe',
};
const inputPullRequest: GitPullRequest = {
@@ -273,7 +273,7 @@ describe('AzureDevOpsApi', () => {
repository: inputGitRepository,
title: 'My Awesome New Feature',
createdBy: inputIdentityRef,
creationDate: new Date('2020-09-12T06:10:23.9325232Z'),
creationDate: new Date('2020-09-12T06:10:23.932Z'),
sourceRefName: 'refs/heads/topic/super-awesome-feature',
targetRefName: 'refs/heads/main',
status: PullRequestStatus.Active,
@@ -287,9 +287,9 @@ describe('AzureDevOpsApi', () => {
pullRequestId: 7181,
repoName: 'super-feature-repo',
title: 'My Awesome New Feature',
uniqueName: 'DOMAINjdoe',
uniqueName: 'DOMAIN\\jdoe',
createdBy: 'Jane Doe',
creationDate: new Date('2020-09-12T06:10:23.9325232Z'),
creationDate: '2020-09-12T06:10:23.932Z',
sourceRefName: 'refs/heads/topic/super-awesome-feature',
targetRefName: 'refs/heads/main',
status: PullRequestStatus.Active,
@@ -149,9 +149,9 @@ export function mappedRepoBuild(build: Build): RepoBuild {
link: build._links?.web.href ?? '',
status: build.status ?? BuildStatus.None,
result: build.result ?? BuildResult.None,
queueTime: build.queueTime,
startTime: build.startTime,
finishTime: build.finishTime,
queueTime: build.queueTime?.toISOString(),
startTime: build.startTime?.toISOString(),
finishTime: build.finishTime?.toISOString(),
source: `${build.sourceBranch} (${build.sourceVersion?.substr(0, 8)})`,
uniqueName: build.requestedFor?.uniqueName ?? 'N/A',
};
@@ -167,7 +167,7 @@ export function mappedPullRequest(
title: pullRequest.title,
uniqueName: pullRequest.createdBy?.uniqueName ?? 'N/A',
createdBy: pullRequest.createdBy?.displayName ?? 'N/A',
creationDate: pullRequest.creationDate,
creationDate: pullRequest.creationDate?.toISOString(),
sourceRefName: pullRequest.sourceRefName,
targetRefName: pullRequest.targetRefName,
status: pullRequest.status,
@@ -152,7 +152,7 @@ describe('createRouter', () => {
link: 'https://host.com/myOrg/0bcc0c0d-2d02/_build/results?buildId=1',
status: BuildStatus.Completed,
result: BuildResult.PartiallySucceeded,
queueTime: undefined,
queueTime: '2020-09-12T06:10:23.932Z',
source: 'refs/heads/develop (f4f78b31)',
};
@@ -162,7 +162,7 @@ describe('createRouter', () => {
link: 'https://host.com/myOrg/0bcc0c0d-2d02/_build/results?buildId=2',
status: BuildStatus.InProgress,
result: BuildResult.None,
queueTime: undefined,
queueTime: '2020-09-12T06:10:23.932Z',
source: 'refs/heads/develop (13c988d4)',
};
@@ -172,7 +172,7 @@ describe('createRouter', () => {
link: 'https://host.com/myOrg/0bcc0c0d-2d02/_build/results?buildId=3',
status: BuildStatus.Completed,
result: BuildResult.Succeeded,
queueTime: undefined,
queueTime: '2020-09-12T06:10:23.932Z',
source: 'refs/heads/develop (9bedf678)',
};
@@ -205,7 +205,7 @@ describe('createRouter', () => {
repoName: 'super-feature-repo',
title: 'My Awesome New Feature',
createdBy: 'Jane Doe',
creationDate: undefined,
creationDate: '2020-09-12T06:10:23.932Z',
sourceRefName: 'refs/heads/topic/super-awesome-feature',
targetRefName: 'refs/heads/main',
status: PullRequestStatus.Active,
@@ -218,7 +218,7 @@ describe('createRouter', () => {
repoName: 'super-feature-repo',
title: 'Refactoring My Awesome New Feature',
createdBy: 'Jane Doe',
creationDate: undefined,
creationDate: '2020-09-12T06:10:23.932Z',
sourceRefName: 'refs/heads/topic/refactor-super-awesome-feature',
targetRefName: 'refs/heads/main',
status: PullRequestStatus.Active,
@@ -231,7 +231,7 @@ describe('createRouter', () => {
repoName: 'super-feature-repo',
title: 'Bug Fix for My Awesome New Feature',
createdBy: 'Jane Doe',
creationDate: undefined,
creationDate: '2020-09-12T06:10:23.932Z',
sourceRefName: 'refs/heads/topic/fix-super-awesome-feature',
targetRefName: 'refs/heads/main',
status: PullRequestStatus.Active,
+4 -4
View File
@@ -36,7 +36,7 @@ export type PullRequest = {
title?: string;
uniqueName?: string;
createdBy?: string;
creationDate?: Date;
creationDate?: string;
sourceRefName?: string;
targetRefName?: string;
status?: PullRequestStatus;
@@ -72,9 +72,9 @@ export type RepoBuild = {
link?: string;
status?: BuildStatus;
result?: BuildResult;
queueTime?: Date;
startTime?: Date;
finishTime?: Date;
queueTime?: string;
startTime?: string;
finishTime?: string;
source: string;
uniqueName?: string;
};
+4 -4
View File
@@ -74,9 +74,9 @@ export type RepoBuild = {
link?: string;
status?: BuildStatus;
result?: BuildResult;
queueTime?: Date;
startTime?: Date;
finishTime?: Date;
queueTime?: string;
startTime?: string;
finishTime?: string;
source: string;
uniqueName?: string;
};
@@ -114,7 +114,7 @@ export type PullRequest = {
title?: string;
uniqueName?: string;
createdBy?: string;
creationDate?: Date;
creationDate?: string;
sourceRefName?: string;
targetRefName?: string;
status?: PullRequestStatus;
@@ -56,7 +56,7 @@ const generateTestData = (rows = 10): RepoBuild[] => {
title: `backstage ci - 1.0.0-preview-${rows - i}`,
status,
result,
queueTime: new Date(Date.now() - i * 60000),
queueTime: new Date(Date.now() - i * 60000).toISOString(),
source: 'refs/heads/main',
link: '',
});
@@ -149,7 +149,10 @@ const columns: TableColumn[] = [
field: 'queueTime',
width: 'auto',
render: (row: Partial<RepoBuild>) =>
DateTime.fromJSDate(row.queueTime ?? new Date()).toRelative(),
(row.queueTime
? DateTime.fromISO(row.queueTime)
: DateTime.now()
).toRelative(),
},
];