Skip to content

Commit 05b200d

Browse files
committed
improve runner testability
1 parent 58c3012 commit 05b200d

File tree

6 files changed

+97
-52
lines changed

6 files changed

+97
-52
lines changed

src/__tests__/tools/gitreleasemanager/runner.spec.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ describe('GitReleaseManager Runner', () => {
1717
const toolName = 'dotnet-gitreleasemanager'
1818

1919
function testOnAgent(agent: IBuildAgent): void {
20-
2120
let runner!: Runner
2221
beforeEach(() => {
2322
runner = new Runner(agent)
@@ -39,9 +38,13 @@ describe('GitReleaseManager Runner', () => {
3938
preferLatestVersion: false
4039
})
4140

42-
const exitCode = await runner.run('setup')
41+
const result = await runner.run('setup')
42+
43+
expect(result.code).toBe(0)
44+
expect(result.error).toBeUndefined()
45+
expect(result.stdout).toBeUndefined()
46+
expect(result.stderr).toBeUndefined()
4347

44-
expect(exitCode).toBe(0)
4548
expect(fs.existsSync(path.resolve(baseDir))).toBe(true)
4649
expect(fs.existsSync(path.resolve(baseDir, 'tools'))).toBe(true)
4750
expect(fs.existsSync(toolPath)).toBe(true)

src/__tests__/tools/gitversion/runner.spec.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ describe('GitVersion Runner', () => {
1717
const toolName = 'dotnet-gitversion'
1818

1919
function testOnAgent(agent: IBuildAgent): void {
20-
2120
let runner!: Runner
2221
beforeEach(() => {
2322
runner = new Runner(agent)
@@ -39,9 +38,13 @@ describe('GitVersion Runner', () => {
3938
preferLatestVersion: false
4039
})
4140

42-
const exitCode = await runner.run('setup')
41+
const result = await runner.run('setup')
42+
43+
expect(result.code).toBe(0)
44+
expect(result.error).toBeUndefined()
45+
expect(result.stdout).toBeUndefined()
46+
expect(result.stderr).toBeUndefined()
4347

44-
expect(exitCode).toBe(0)
4548
expect(fs.existsSync(path.resolve(baseDir))).toBe(true)
4649
expect(fs.existsSync(path.resolve(baseDir, 'tools'))).toBe(true)
4750
expect(fs.existsSync(toolPath)).toBe(true)
@@ -55,9 +58,9 @@ describe('GitVersion Runner', () => {
5558
it.sequential('should execute GitVersion', async () => {
5659
setEnv(toolPathVariable, toolPath)
5760

58-
const exitCode = await runner.run('execute')
61+
const result = await runner.run('execute')
5962

60-
expect(exitCode).toBe(0)
63+
expect(result.code).toBe(0)
6164

6265
expect(getEnv('GitVersion_Major')).toBeDefined()
6366
expect(getEnv('GitVersion_Minor')).toBeDefined()
@@ -66,6 +69,9 @@ describe('GitVersion Runner', () => {
6669
expect(getEnv('major')).toBeDefined()
6770
expect(getEnv('minor')).toBeDefined()
6871
expect(getEnv('patch')).toBeDefined()
72+
73+
expect(result.stdout).toContain('Executing GenerateSetVersionMessage')
74+
expect(result.stdout).toContain('Executing GenerateBuildLogOutput')
6975
})
7076
}
7177

src/agents/common/models.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export type ExecResult = {
2-
stdout: string
3-
stderr: string
42
code: number
5-
error?: Error | null
3+
stdout?: string
4+
stderr?: string
5+
error?: Error | null | unknown
66
}

src/tools/common/models.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { type ExecResult } from '@agents/common'
2+
13
export enum SetupFields {
24
includePrerelease = 'includePrerelease',
35
versionSpec = 'versionSpec',
@@ -13,7 +15,7 @@ export type SetupSettings = {
1315
}
1416

1517
export type IRunner = {
16-
run(command: string): Promise<number>
18+
run(command: string): Promise<ExecResult>
1719
}
1820

1921
export type NugetVersions = { data: { versions: { version: string }[] }[] }

src/tools/gitreleasemanager/runner.ts

Lines changed: 52 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { type IBuildAgent } from '@agents/common'
1+
import { type ExecResult, type IBuildAgent } from '@agents/common'
22
import { type IRunner } from '@tools/common'
33
import { type Commands } from './models'
44
import { GitReleaseManagerTool } from './tool'
@@ -10,7 +10,7 @@ export class Runner implements IRunner {
1010
this.gitReleaseManagerTool = new GitReleaseManagerTool(this.buildAgent)
1111
}
1212

13-
async run(command: Commands): Promise<number> {
13+
async run(command: Commands): Promise<ExecResult> {
1414
switch (command) {
1515
case 'setup':
1616
return await this.setup()
@@ -29,7 +29,7 @@ export class Runner implements IRunner {
2929
}
3030
}
3131

32-
private async setup(): Promise<number> {
32+
private async setup(): Promise<ExecResult> {
3333
try {
3434
this.disableTelemetry()
3535

@@ -41,120 +41,143 @@ export class Runner implements IRunner {
4141
this.buildAgent.setVariable(pathVariable, toolPath)
4242

4343
this.buildAgent.setSucceeded('GitReleaseManager installed successfully', true)
44-
return 0
44+
return {
45+
code: 0
46+
}
4547
} catch (error) {
4648
if (error instanceof Error) {
4749
this.buildAgent.setFailed(error.message, true)
4850
}
49-
return -1
51+
return {
52+
code: -1,
53+
error
54+
}
5055
}
5156
}
5257

53-
private async create(): Promise<number> {
58+
private async create(): Promise<ExecResult> {
5459
try {
5560
this.disableTelemetry()
5661

5762
this.buildAgent.debug('Creating release')
5863

59-
await this.gitReleaseManagerTool.create()
64+
const result = await this.gitReleaseManagerTool.create()
6065

6166
this.buildAgent.setSucceeded('GitReleaseManager created release successfully', true)
62-
return 0
67+
return result
6368
} catch (error) {
6469
if (error instanceof Error) {
6570
this.buildAgent.setFailed(error.message, true)
6671
}
67-
return -1
72+
return {
73+
code: -1,
74+
error
75+
}
6876
}
6977
}
7078

71-
private async discard(): Promise<number> {
79+
private async discard(): Promise<ExecResult> {
7280
try {
7381
this.disableTelemetry()
7482

7583
this.buildAgent.debug('Discarding release')
7684

77-
await this.gitReleaseManagerTool.discard()
85+
const result = await this.gitReleaseManagerTool.discard()
7886

7987
this.buildAgent.setSucceeded('GitReleaseManager discarded release successfully', true)
80-
return 0
88+
return result
8189
} catch (error) {
8290
if (error instanceof Error) {
8391
this.buildAgent.setFailed(error.message, true)
8492
}
85-
return -1
93+
return {
94+
code: -1,
95+
error
96+
}
8697
}
8798
}
8899

89-
private async close(): Promise<number> {
100+
private async close(): Promise<ExecResult> {
90101
try {
91102
this.disableTelemetry()
92103

93104
this.buildAgent.debug('Closing release')
94105

95-
await this.gitReleaseManagerTool.close()
106+
const result = await this.gitReleaseManagerTool.close()
96107

97108
this.buildAgent.setSucceeded('GitReleaseManager closed release successfully', true)
98-
return 0
109+
return result
99110
} catch (error) {
100111
if (error instanceof Error) {
101112
this.buildAgent.setFailed(error.message, true)
102113
}
103-
return -1
114+
return {
115+
code: -1,
116+
error
117+
}
104118
}
105119
}
106120

107-
private async open(): Promise<number> {
121+
private async open(): Promise<ExecResult> {
108122
try {
109123
this.disableTelemetry()
110124

111125
this.buildAgent.debug('Opening release')
112126

113-
await this.gitReleaseManagerTool.open()
127+
const result = await this.gitReleaseManagerTool.open()
114128

115129
this.buildAgent.setSucceeded('GitReleaseManager opened release successfully', true)
116-
return 0
130+
return result
117131
} catch (error) {
118132
if (error instanceof Error) {
119133
this.buildAgent.setFailed(error.message, true)
120134
}
121-
return -1
135+
return {
136+
code: -1,
137+
error
138+
}
122139
}
123140
}
124141

125-
private async publish(): Promise<number> {
142+
private async publish(): Promise<ExecResult> {
126143
try {
127144
this.disableTelemetry()
128145

129146
this.buildAgent.debug('Publishing release')
130147

131-
await this.gitReleaseManagerTool.publish()
148+
const result = await this.gitReleaseManagerTool.publish()
132149

133150
this.buildAgent.setSucceeded('GitReleaseManager published release successfully', true)
134-
return 0
151+
return result
135152
} catch (error) {
136153
if (error instanceof Error) {
137154
this.buildAgent.setFailed(error.message, true)
138155
}
139-
return -1
156+
return {
157+
code: -1,
158+
error
159+
}
140160
}
141161
}
142162

143-
private async addAsset(): Promise<number> {
163+
private async addAsset(): Promise<ExecResult> {
144164
try {
145165
this.disableTelemetry()
146166

147167
this.buildAgent.debug('Adding asset to release')
148168

149-
await this.gitReleaseManagerTool.addAsset()
169+
const result = await this.gitReleaseManagerTool.addAsset()
150170

151171
this.buildAgent.setSucceeded('GitReleaseManager added assets to release successfully', true)
152-
return 0
172+
return result
153173
} catch (error) {
154174
if (error instanceof Error) {
155175
this.buildAgent.setFailed(error.message, true)
156176
}
157-
return -1
177+
return {
178+
code: -1,
179+
error
180+
}
158181
}
159182
}
160183

src/tools/gitversion/runner.ts

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { type IBuildAgent } from '@agents/common'
1+
import { type ExecResult, type IBuildAgent } from '@agents/common'
22
import { type IRunner } from '@tools/common'
33
import { type Commands, type GitVersionOutput } from './models'
44
import { GitVersionTool } from './tool'
@@ -10,7 +10,7 @@ export class Runner implements IRunner {
1010
this.gitVersionTool = new GitVersionTool(this.buildAgent)
1111
}
1212

13-
async run(command: Commands): Promise<number> {
13+
async run(command: Commands): Promise<ExecResult> {
1414
switch (command) {
1515
case 'setup':
1616
return await this.setup()
@@ -19,7 +19,7 @@ export class Runner implements IRunner {
1919
}
2020
}
2121

22-
private async setup(): Promise<number> {
22+
private async setup(): Promise<ExecResult> {
2323
try {
2424
this.disableTelemetry()
2525

@@ -31,16 +31,21 @@ export class Runner implements IRunner {
3131
this.buildAgent.setVariable(pathVariable, toolPath)
3232

3333
this.buildAgent.setSucceeded('GitVersion installed successfully', true)
34-
return 0
34+
return {
35+
code: 0
36+
}
3537
} catch (error) {
3638
if (error instanceof Error) {
3739
this.buildAgent.setFailed(error.message, true)
3840
}
39-
return -1
41+
return {
42+
code: -1,
43+
error
44+
}
4045
}
4146
}
4247

43-
private async execute(): Promise<number> {
48+
private async execute(): Promise<ExecResult> {
4449
try {
4550
this.disableTelemetry()
4651

@@ -50,7 +55,7 @@ export class Runner implements IRunner {
5055

5156
if (result.code === 0) {
5257
this.buildAgent.info('GitVersion executed successfully')
53-
const { stdout } = result
58+
const stdout: string = result.stdout as string
5459

5560
this.buildAgent.info('GitVersion output:')
5661
this.buildAgent.info('-------------------')
@@ -61,28 +66,34 @@ export class Runner implements IRunner {
6166
if (stdout.lastIndexOf('{') === -1 || stdout.lastIndexOf('}') === -1) {
6267
this.buildAgent.debug('GitVersion output is not valid JSON')
6368
this.buildAgent.setFailed('GitVersion output is not valid JSON', true)
64-
return -1
69+
return {
70+
code: -1,
71+
error: new Error('GitVersion output is not valid JSON')
72+
}
6573
} else {
6674
const jsonOutput = stdout.substring(stdout.lastIndexOf('{'), stdout.lastIndexOf('}') + 1)
6775

6876
const gitVersionOutput = JSON.parse(jsonOutput) as GitVersionOutput
6977
this.gitVersionTool.writeGitVersionToAgent(gitVersionOutput)
7078
this.buildAgent.setSucceeded('GitVersion executed successfully', true)
71-
return 0
79+
return result
7280
}
7381
} else {
7482
this.buildAgent.debug('GitVersion failed')
7583
const error = result.error
7684
if (error instanceof Error) {
7785
this.buildAgent.setFailed(error.message, true)
7886
}
79-
return -1
87+
return result
8088
}
8189
} catch (error) {
8290
if (error instanceof Error) {
8391
this.buildAgent.setFailed(error.message, true)
8492
}
85-
return -1
93+
return {
94+
code: -1,
95+
error
96+
}
8697
}
8798
}
8899

0 commit comments

Comments
 (0)