1
+ import { mocked } from 'ts-jest/utils' ;
1
2
import { ActionRequestMessage , handle } from './handler' ;
2
3
3
4
import { createAppAuth } from '@octokit/auth-app' ;
4
5
import { Octokit } from '@octokit/rest' ;
6
+ import { listRunners } from './runners' ;
5
7
6
8
jest . mock ( '@octokit/auth-app' , ( ) => ( {
7
9
createAppAuth : jest . fn ( ) . mockImplementation ( ( ) => jest . fn ( ) . mockImplementation ( ( ) => ( { token : 'Blaat' } ) ) ) ,
@@ -10,14 +12,16 @@ const mockOctokit = {
10
12
checks : { get : jest . fn ( ) } ,
11
13
actions : {
12
14
listRepoWorkflowRuns : jest . fn ( ) ,
13
- listSelfHostedRunnersForOrg : jest . fn ( ) ,
14
- listSelfHostedRunnersForRepo : jest . fn ( ) ,
15
+ createRegistrationTokenForOrg : jest . fn ( ) ,
16
+ createRegistrationTokenForRepo : jest . fn ( ) ,
15
17
} ,
16
18
} ;
17
19
jest . mock ( '@octokit/rest' , ( ) => ( {
18
20
Octokit : jest . fn ( ) . mockImplementation ( ( ) => mockOctokit ) ,
19
21
} ) ) ;
20
22
23
+ jest . mock ( './runners' ) ;
24
+
21
25
const TEST_DATA : ActionRequestMessage = {
22
26
id : 1 ,
23
27
eventType : 'check_run' ,
@@ -32,27 +36,29 @@ describe('handler', () => {
32
36
process . env . GITHUB_APP_ID = '1337' ;
33
37
process . env . GITHUB_APP_CLIENT_ID = 'TEST_CLIENT_ID' ;
34
38
process . env . GITHUB_APP_CLIENT_SECRET = 'TEST_CLIENT_SECRET' ;
39
+ process . env . RUNNERS_MAXIMUM_COUNT = '3' ;
35
40
jest . clearAllMocks ( ) ;
36
41
mockOctokit . actions . listRepoWorkflowRuns . mockImplementation ( ( ) => ( {
37
42
data : {
38
43
total_count : 1 ,
39
44
} ,
40
45
} ) ) ;
41
- const mockRunnersReturnValue = {
46
+ const mockTokenReturnValue = {
42
47
data : {
43
- total_count : 1 ,
44
- runners : [
45
- {
46
- id : 23 ,
47
- name : 'Test Runner' ,
48
- status : 'online' ,
49
- os : 'linux' ,
50
- } ,
51
- ] ,
48
+ token : '1234abcd' ,
52
49
} ,
53
50
} ;
54
- mockOctokit . actions . listSelfHostedRunnersForOrg . mockImplementation ( ( ) => mockRunnersReturnValue ) ;
55
- mockOctokit . actions . listSelfHostedRunnersForRepo . mockImplementation ( ( ) => mockRunnersReturnValue ) ;
51
+ mockOctokit . actions . createRegistrationTokenForOrg . mockImplementation ( ( ) => mockTokenReturnValue ) ;
52
+ mockOctokit . actions . createRegistrationTokenForRepo . mockImplementation ( ( ) => mockTokenReturnValue ) ;
53
+ const mockListRunners = mocked ( listRunners ) ;
54
+ mockListRunners . mockImplementation ( async ( ) => [
55
+ {
56
+ instanceId : 'i-1234' ,
57
+ launchTime : new Date ( ) ,
58
+ repo : `${ TEST_DATA . repositoryOwner } /${ TEST_DATA . repositoryName } ` ,
59
+ org : TEST_DATA . repositoryOwner ,
60
+ } ,
61
+ ] ) ;
56
62
} ) ;
57
63
58
64
it ( 'ignores non-sqs events' , async ( ) => {
@@ -69,30 +75,61 @@ describe('handler', () => {
69
75
} ) ;
70
76
} ) ;
71
77
72
- // describe('on org level', () => {
73
- // beforeAll(() => {
74
- // process.env.ENABLE_ORGANIZATION_RUNNERS = 'true';
75
- // });
76
-
77
- // it('gets the current org level runners', async () => {
78
- // await handle('aws:sqs', TEST_DATA);
79
- // expect(mockOctokit.actions.listSelfHostedRunnersForOrg).toBeCalledWith({
80
- // org: TEST_DATA.repositoryOwner,
81
- // });
82
- // });
83
- // });
84
-
85
- // describe('on repo level', () => {
86
- // beforeAll(() => {
87
- // delete process.env.ENABLE_ORGANIZATION_RUNNERS;
88
- // });
89
-
90
- // it('gets the current repo level runners', async () => {
91
- // await handle('aws:sqs', TEST_DATA);
92
- // expect(mockOctokit.actions.listSelfHostedRunnersForRepo).toBeCalledWith({
93
- // owner: TEST_DATA.repositoryOwner,
94
- // repo: TEST_DATA.repositoryName,
95
- // });
96
- // });
97
- // });
78
+ it ( 'does not list runners when no workflows are queued' , async ( ) => {
79
+ mockOctokit . actions . listRepoWorkflowRuns . mockImplementation ( ( ) => ( {
80
+ data : { total_count : 0 , runners : [ ] } ,
81
+ } ) ) ;
82
+ await handle ( 'aws:sqs' , TEST_DATA ) ;
83
+ expect ( listRunners ) . not . toBeCalled ( ) ;
84
+ } ) ;
85
+
86
+ describe ( 'on org level' , ( ) => {
87
+ beforeAll ( ( ) => {
88
+ process . env . ENABLE_ORGANIZATION_RUNNERS = 'true' ;
89
+ } ) ;
90
+
91
+ it ( 'gets the current org level runners' , async ( ) => {
92
+ await handle ( 'aws:sqs' , TEST_DATA ) ;
93
+ expect ( listRunners ) . toBeCalledWith ( { repoName : undefined } ) ;
94
+ } ) ;
95
+
96
+ it ( 'does not create a token when maximum runners has been reached' , async ( ) => {
97
+ process . env . RUNNERS_MAXIMUM_COUNT = '1' ;
98
+ await handle ( 'aws:sqs' , TEST_DATA ) ;
99
+ expect ( mockOctokit . actions . createRegistrationTokenForOrg ) . not . toBeCalled ( ) ;
100
+ } ) ;
101
+
102
+ it ( 'creates a token when maximum runners has not been reached' , async ( ) => {
103
+ await handle ( 'aws:sqs' , TEST_DATA ) ;
104
+ expect ( mockOctokit . actions . createRegistrationTokenForOrg ) . toBeCalled ( ) ;
105
+ expect ( mockOctokit . actions . createRegistrationTokenForOrg ) . toBeCalledWith ( {
106
+ org : TEST_DATA . repositoryOwner ,
107
+ } ) ;
108
+ } ) ;
109
+ } ) ;
110
+
111
+ describe ( 'on repo level' , ( ) => {
112
+ beforeAll ( ( ) => {
113
+ process . env . ENABLE_ORGANIZATION_RUNNERS = 'false' ;
114
+ } ) ;
115
+
116
+ it ( 'gets the current repo level runners' , async ( ) => {
117
+ await handle ( 'aws:sqs' , TEST_DATA ) ;
118
+ expect ( listRunners ) . toBeCalledWith ( { repoName : `${ TEST_DATA . repositoryOwner } /${ TEST_DATA . repositoryName } ` } ) ;
119
+ } ) ;
120
+
121
+ it ( 'does not create a token when maximum runners has been reached' , async ( ) => {
122
+ process . env . RUNNERS_MAXIMUM_COUNT = '1' ;
123
+ await handle ( 'aws:sqs' , TEST_DATA ) ;
124
+ expect ( mockOctokit . actions . createRegistrationTokenForRepo ) . not . toBeCalled ( ) ;
125
+ } ) ;
126
+
127
+ it ( 'creates a token when maximum runners has not been reached' , async ( ) => {
128
+ await handle ( 'aws:sqs' , TEST_DATA ) ;
129
+ expect ( mockOctokit . actions . createRegistrationTokenForRepo ) . toBeCalledWith ( {
130
+ owner : TEST_DATA . repositoryOwner ,
131
+ repo : TEST_DATA . repositoryName ,
132
+ } ) ;
133
+ } ) ;
134
+ } ) ;
98
135
} ) ;
0 commit comments