Skip to content

Commit 6bd3f4c

Browse files
committed
Update async / await for jest according docs
- Update async tests according to https://jestjs.io/docs/tutorial-async and align several tests - Add dependency for sorting imports - Add rules for sorting to prettier - Update prefered VSCode plugins - Add exceeption for sonar lint
1 parent 9b63aac commit 6bd3f4c

20 files changed

+1235
-1143
lines changed

.vscode/extensions.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// Extension identifier format: ${publisher}.${name}. Example: vscode.csharp
66
"editorconfig.editorconfig",
77
"yzhang.markdown-all-in-one",
8-
"mauve.terraform"
8+
"sonarsource.sonarlint-vscode",
9+
"hashicorp.terraform"
910
]
10-
}
11+
}

.vscode/settings.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"sonarlint.rules": {
3+
"javascript:S4123": {
4+
"level": "off"
5+
}
6+
}
7+
}

modules/runners/lambdas/runners/.prettierrc

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,10 @@
33
"singleQuote": true,
44
"trailingComma": "all",
55
"semi": true,
6-
}
6+
"importOrderSeparation": true,
7+
"importOrderSortSpecifiers": true,
8+
"importOrder": [
9+
"<THIRD_PARTY_MODULES>",
10+
"^[./]"
11+
]
12+
}

modules/runners/lambdas/runners/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"all": "yarn build && yarn format && yarn lint && yarn test"
1717
},
1818
"devDependencies": {
19+
"@trivago/prettier-plugin-sort-imports": "^3.1.1",
1920
"@types/aws-lambda": "^8.10.89",
2021
"@types/express": "^4.17.11",
2122
"@types/jest": "^27.4.0",
@@ -25,6 +26,7 @@
2526
"eslint": "^7.32.0",
2627
"eslint-plugin-prettier": "4.0.0",
2728
"jest": "27.4.5",
29+
"jest-mock": "^27.4.6",
2830
"jest-mock-extended": "^2.0.1",
2931
"moment-timezone": "^0.5.34",
3032
"nock": "^13.2.1",

modules/runners/lambdas/runners/src/aws/runners.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { EC2 } from 'aws-sdk';
2-
import { listEC2Runners, createRunner, terminateRunner, RunnerInfo, RunnerInputParameters } from './runners';
2+
33
import ScaleError from './../scale-runners/ScaleError';
4+
import { RunnerInfo, RunnerInputParameters, createRunner, listEC2Runners, terminateRunner } from './runners';
45

56
const mockEC2 = { describeInstances: jest.fn(), createFleet: jest.fn(), terminateInstances: jest.fn() };
67
const mockSSM = { putParameter: jest.fn() };

modules/runners/lambdas/runners/src/aws/runners.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { EC2, SSM } from 'aws-sdk';
2-
import { logger as rootLogger, LogFields } from '../logger';
2+
3+
import { LogFields, logger as rootLogger } from '../logger';
34
import ScaleError from './../scale-runners/ScaleError';
45

56
const logger = rootLogger.getChildLogger({ name: 'runners' });

modules/runners/lambdas/runners/src/aws/ssm.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import { GetParameterCommandOutput, SSM } from '@aws-sdk/client-ssm';
12
import nock from 'nock';
3+
24
import { getParameterValue } from './ssm';
3-
import { SSM, GetParameterCommandOutput } from '@aws-sdk/client-ssm';
45

56
jest.mock('@aws-sdk/client-ssm');
67

modules/runners/lambdas/runners/src/gh-auth/gh-auth.test.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
import { createOctoClient, createGithubAppAuth } from './gh-auth';
2-
import nock from 'nock';
31
import { createAppAuth } from '@octokit/auth-app';
4-
52
import { StrategyOptions } from '@octokit/auth-app/dist-types/types';
6-
import { getParameterValue } from './../aws/ssm';
7-
8-
import { RequestInterface } from '@octokit/types';
9-
import { mock, MockProxy } from 'jest-mock-extended';
103
import { request } from '@octokit/request';
11-
import { mocked } from 'ts-jest/utils';
4+
import { RequestInterface } from '@octokit/types';
5+
import { mocked } from 'jest-mock';
6+
import { MockProxy, mock } from 'jest-mock-extended';
7+
import nock from 'nock';
8+
9+
import { getParameterValue } from './../aws/ssm';
10+
import { createGithubAppAuth, createOctoClient } from './gh-auth';
1211

1312
jest.mock('./../aws/ssm');
1413
jest.mock('@octokit/auth-app');

modules/runners/lambdas/runners/src/gh-auth/gh-auth.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
1-
import { Octokit } from '@octokit/rest';
2-
import { request } from '@octokit/request';
31
import { createAppAuth } from '@octokit/auth-app';
42
import {
5-
StrategyOptions,
6-
AppAuthentication,
73
AppAuthOptions,
8-
InstallationAuthOptions,
9-
InstallationAccessTokenAuthentication,
4+
AppAuthentication,
105
AuthInterface,
6+
InstallationAccessTokenAuthentication,
7+
InstallationAuthOptions,
8+
StrategyOptions,
119
} from '@octokit/auth-app/dist-types/types';
1210
import { OctokitOptions } from '@octokit/core/dist-types/types';
11+
import { request } from '@octokit/request';
12+
import { Octokit } from '@octokit/rest';
13+
1314
import { getParameterValue } from '../aws/ssm';
14-
import { logger as rootLogger, LogFields } from '../logger';
15+
import { LogFields, logger as rootLogger } from '../logger';
1516

1617
const logger = rootLogger.getChildLogger({ name: 'gh-auth' });
1718

modules/runners/lambdas/runners/src/lambda.test.ts

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { Context, SQSEvent, SQSRecord } from 'aws-lambda';
2-
import { mocked } from 'ts-jest/utils';
2+
import { mocked } from 'jest-mock';
3+
34
import { adjustPool, scaleDownHandler, scaleUpHandler } from './lambda';
4-
import { ActionRequestMessage, scaleUp } from './scale-runners/scale-up';
5-
import ScaleError from './scale-runners/ScaleError';
65
import { logger } from './logger';
7-
import { scaleDown } from './scale-runners/scale-down';
86
import { adjust } from './pool/pool';
7+
import ScaleError from './scale-runners/ScaleError';
8+
import { scaleDown } from './scale-runners/scale-down';
9+
import { ActionRequestMessage, scaleUp } from './scale-runners/scale-up';
910

1011
const body: ActionRequestMessage = {
1112
eventType: 'workflow_job',
@@ -62,6 +63,7 @@ jest.mock('./scale-runners/scale-down');
6263
jest.mock('./pool/pool');
6364
jest.mock('./logger');
6465

66+
// Docs for testing async with jest: https://jestjs.io/docs/tutorial-async
6567
describe('Test scale up lambda wrapper.', () => {
6668
it('Do not handle multiple record sets.', async () => {
6769
await testInvalidRecords([sqsRecord, sqsRecord]);
@@ -82,18 +84,17 @@ describe('Test scale up lambda wrapper.', () => {
8284
});
8385

8486
it('Non scale should resolve.', async () => {
85-
const error = new Error('some error');
87+
const error = new Error('Non scale should resolve.');
8688
const mock = mocked(scaleUp);
8789
mock.mockRejectedValue(error);
88-
expect(await scaleUpHandler(sqsEvent, context)).resolves;
90+
await expect(scaleUpHandler(sqsEvent, context)).resolves;
8991
});
9092

9193
it('Scale should be rejected', async () => {
92-
const error = new ScaleError('some scale error');
94+
const error = new ScaleError('Scale should be rejected');
9395
const mock = mocked(scaleUp);
94-
9596
mock.mockRejectedValue(error);
96-
expect(scaleUpHandler(sqsEvent, context)).rejects.toThrow(error);
97+
await expect(scaleUpHandler(sqsEvent, context)).rejects.toThrow(error);
9798
});
9899
});
99100

@@ -109,7 +110,7 @@ async function testInvalidRecords(sqsRecords: SQSRecord[]) {
109110
Records: sqsRecords,
110111
};
111112

112-
expect(await scaleUpHandler(sqsEventMultipleRecords, context)).resolves;
113+
await expect(scaleUpHandler(sqsEventMultipleRecords, context)).resolves;
113114

114115
expect(logWarnSpy).toHaveBeenCalledWith(
115116
'Event ignored, only one record at the time can be handled, ensure the lambda batch size is set to 1.',
@@ -125,14 +126,14 @@ describe('Test scale down lambda wrapper.', () => {
125126
resolve();
126127
});
127128
});
128-
expect(await scaleDownHandler(context)).resolves;
129+
await expect(scaleDownHandler(context)).resolves;
129130
});
130131

131132
it('Scaling down with error.', async () => {
132-
const error = new Error('some error');
133+
const error = new Error('Scaling down with error.');
133134
const mock = mocked(scaleDown);
134135
mock.mockRejectedValue(error);
135-
expect(await scaleDownHandler(context)).resolves;
136+
await expect(await scaleDownHandler(context)).resolves;
136137
});
137138
});
138139

@@ -144,15 +145,15 @@ describe('Adjust pool.', () => {
144145
resolve();
145146
});
146147
});
147-
expect(await adjustPool({ poolSize: 2 }, context)).resolves;
148+
await expect(adjustPool({ poolSize: 2 }, context)).resolves;
148149
});
149150

150151
it('Handle error for adjusting pool.', async () => {
151152
const mock = mocked(adjust);
152-
const error = new Error('errorXYX');
153+
const error = new Error('Handle error for adjusting pool.');
153154
mock.mockRejectedValue(error);
154155
const logSpy = jest.spyOn(logger, 'error');
155-
expect(await adjustPool({ poolSize: 0 }, context)).resolves;
156+
await adjustPool({ poolSize: 0 }, context);
156157
expect(logSpy).lastCalledWith(error);
157158
});
158159
});

modules/runners/lambdas/runners/src/lambda.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import { scaleUp } from './scale-runners/scale-up';
2-
import { scaleDown } from './scale-runners/scale-down';
3-
import { SQSEvent, Context } from 'aws-lambda';
1+
import { Context, SQSEvent } from 'aws-lambda';
2+
import 'source-map-support/register';
3+
44
import { LogFields, logger } from './logger';
5+
import { PoolEvent, adjust } from './pool/pool';
56
import ScaleError from './scale-runners/ScaleError';
6-
import 'source-map-support/register';
7-
import { adjust, PoolEvent } from './pool/pool';
7+
import { scaleDown } from './scale-runners/scale-down';
8+
import { scaleUp } from './scale-runners/scale-up';
89

910
export async function scaleUpHandler(event: SQSEvent, context: Context): Promise<void> {
1011
logger.setSettings({ requestId: context.awsRequestId });

modules/runners/lambdas/runners/src/local.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { logger } from './logger';
2-
import { scaleUp, ActionRequestMessage } from './scale-runners/scale-up';
2+
import { ActionRequestMessage, scaleUp } from './scale-runners/scale-up';
33

44
const sqsEvent = {
55
Records: [

modules/runners/lambdas/runners/src/pool/pool.test.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import { mocked } from 'ts-jest/utils';
2-
import { adjust } from './pool';
3-
import * as ghAuth from '../gh-auth/gh-auth';
4-
import * as scale from '../scale-runners/scale-up';
5-
import nock from 'nock';
61
import { Octokit } from '@octokit/rest';
2+
import { mocked } from 'jest-mock';
3+
import nock from 'nock';
4+
75
import { listEC2Runners } from '../aws/runners';
6+
import * as ghAuth from '../gh-auth/gh-auth';
7+
import * as scale from '../scale-runners/scale-up';
8+
import { adjust } from './pool';
89

910
const mockOctokit = {
1011
paginate: jest.fn(),
@@ -153,13 +154,13 @@ describe('Test simple pool.', () => {
153154
describe('With GitHub Cloud', () => {
154155
it('Top up pool with pool size 2.', async () => {
155156
const spy = jest.spyOn(scale, 'createRunners');
156-
expect(await adjust({ poolSize: 2 })).resolves;
157+
await expect(adjust({ poolSize: 2 })).resolves;
157158
expect(spy).toBeCalled;
158159
});
159160

160161
it('Should not top up if pool size is reached.', async () => {
161162
const spy = jest.spyOn(scale, 'createRunners');
162-
expect(await adjust({ poolSize: 1 })).resolves;
163+
await expect(adjust({ poolSize: 1 })).resolves;
163164
expect(spy).not.toHaveBeenCalled;
164165
});
165166
});
@@ -171,7 +172,7 @@ describe('Test simple pool.', () => {
171172

172173
it('Top up if the pool size is set to 5', async () => {
173174
const spy = jest.spyOn(scale, 'createRunners');
174-
expect(await adjust({ poolSize: 5 })).resolves;
175+
await expect(adjust({ poolSize: 5 })).resolves;
175176
expect(spy).toBeCalled;
176177
});
177178
});

modules/runners/lambdas/runners/src/pool/pool.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import yn from 'yn';
2+
3+
import { listEC2Runners } from '../aws/runners';
4+
import { createGithubAppAuth, createGithubInstallationAuth, createOctoClient } from '../gh-auth/gh-auth';
25
import { logger as rootLogger } from '../logger';
36
import { createRunners } from '../scale-runners/scale-up';
4-
import { createGithubAppAuth, createGithubInstallationAuth, createOctoClient } from '../gh-auth/gh-auth';
5-
import { listEC2Runners } from '../aws/runners';
67

78
const logger = rootLogger.getChildLogger({ name: 'pool' });
89

modules/runners/lambdas/runners/src/scale-runners/scale-down-config.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import moment from 'moment-timezone';
2-
import { getIdleRunnerCount, ScalingDownConfigList } from './scale-down-config';
2+
3+
import { ScalingDownConfigList, getIdleRunnerCount } from './scale-down-config';
34

45
const DEFAULT_TIMEZONE = 'America/Los_Angeles';
56
const DEFAULT_IDLE_COUNT = 1;

modules/runners/lambdas/runners/src/scale-runners/scale-down.test.ts

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1+
import { Octokit } from '@octokit/rest';
2+
import { mocked } from 'jest-mock';
13
import moment from 'moment';
2-
import { mocked } from 'ts-jest/utils';
3-
import { listEC2Runners, terminateRunner, RunnerInfo, RunnerList } from './../aws/runners';
4-
import { scaleDown } from './scale-down';
5-
import * as ghAuth from '../gh-auth/gh-auth';
64
import nock from 'nock';
7-
import { Octokit } from '@octokit/rest';
5+
6+
import * as ghAuth from '../gh-auth/gh-auth';
7+
import { RunnerInfo, RunnerList, listEC2Runners, terminateRunner } from './../aws/runners';
88
import { githubCache } from './cache';
9+
import { scaleDown } from './scale-down';
910

1011
const mockOctokit = {
1112
apps: {
@@ -350,7 +351,7 @@ describe('scaleDown', () => {
350351
}
351352
});
352353

353-
it('Terminates 0 runners owned by repos', async () => {
354+
it('Terminates 0 runners owned by org', async () => {
354355
mockListRunners.mockResolvedValue(RUNNERS_REPO_WITH_AUTO_SCALING_CONFIG);
355356
process.env.ENABLE_ORGANIZATION_RUNNERS = 'false';
356357
await scaleDown();
@@ -364,6 +365,22 @@ describe('scaleDown', () => {
364365
});
365366
});
366367

368+
it('No instances terminates when delete runner in github results in a non 204 status.', async () => {
369+
mockListRunners.mockResolvedValue(DEFAULT_RUNNERS);
370+
mockOctokit.actions.deleteSelfHostedRunnerFromOrg.mockImplementation(() => {
371+
return { status: 500 };
372+
});
373+
374+
await scaleDown();
375+
376+
expect(listEC2Runners).toBeCalledWith({
377+
environment: environment,
378+
});
379+
380+
expect(mockOctokit.apps.getOrgInstallation).toBeCalled();
381+
expect(terminateRunner).not.toBeCalled;
382+
});
383+
367384
it('Terminates 6 runners amongst all owners and all orphaned', async () => {
368385
mockListRunners.mockResolvedValue(DEFAULT_RUNNERS);
369386
await scaleDown();

modules/runners/lambdas/runners/src/scale-runners/scale-down.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { Octokit } from '@octokit/rest';
22
import moment from 'moment';
3-
import { listEC2Runners, RunnerInfo, RunnerList, terminateRunner } from './../aws/runners';
4-
import { getIdleRunnerCount, ScalingDownConfig } from './scale-down-config';
5-
import { createOctoClient, createGithubAppAuth, createGithubInstallationAuth } from '../gh-auth/gh-auth';
6-
import { githubCache, GhRunners } from './cache';
7-
import { logger as rootLogger, LogFields } from '../logger';
3+
4+
import { createGithubAppAuth, createGithubInstallationAuth, createOctoClient } from '../gh-auth/gh-auth';
5+
import { LogFields, logger as rootLogger } from '../logger';
6+
import { RunnerInfo, RunnerList, listEC2Runners, terminateRunner } from './../aws/runners';
7+
import { GhRunners, githubCache } from './cache';
8+
import { ScalingDownConfig, getIdleRunnerCount } from './scale-down-config';
89

910
const logger = rootLogger.getChildLogger({ name: 'scale-down' });
1011

0 commit comments

Comments
 (0)