Skip to content

Commit 8bbb82b

Browse files
authored
Merge pull request #16 from im-open/graphql-node-count
Added deployment unit and integration testing
2 parents 5c7c5c0 + 9e99ad5 commit 8bbb82b

File tree

7 files changed

+187
-72
lines changed

7 files changed

+187
-72
lines changed

.github/workflows/test-code.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ jobs:
2222
continue-on-error: true
2323
run: |
2424
npm install
25+
export GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}
2526
./node_modules/.bin/jest --json --outputFile=${{env.jest-output-file}} ./src/
2627
2728
- name: Process jest results

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ jobs:
7070
- name: Create GitHub Deployment
7171
id: defaults
7272
continue-on-error: true # Setting to true so the job doesn't fail if updating the board fails.
73-
uses: im-open/[email protected].10 # You may also reference just the major or major.minor version
73+
uses: im-open/[email protected].8 # You may also reference just the major or major.minor version
7474
with:
7575
workflow-actor: ${{ github.actor }} # This will add the user who kicked off the workflow to the deployment payload
7676
token: ${{ secrets.GITHUB_TOKEN }} # If a different token is used, update github-login with the corresponding account

dist/index.js

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -42107,17 +42107,21 @@ var require_deployments = __commonJS({
4210742107
var { Octokit } = require_dist_node12();
4210842108
var { graphql } = require_dist_node6();
4210942109
var WORKFLOW_DEPLOY = 'workflowdeploy';
42110-
var ALLOWED_STATUSES = [
42111-
'success',
42112-
'error',
42113-
'failure',
42114-
'inactive',
42115-
'in_progress',
42116-
'queued',
42117-
'pending'
42118-
];
42110+
var ALLOWED_STATUSES = {
42111+
SUCCESS: 'success',
42112+
ERROR: 'error',
42113+
FAILURE: 'failure',
42114+
INACTIVE: 'inactive',
42115+
IN_PROGRESS: 'in_progress',
42116+
QUEUED: 'queued',
42117+
PENDING: 'pending'
42118+
};
42119+
var createOctokitClient = token => new Octokit({ auth: token });
42120+
var createOctokitGraphQLClient = token =>
42121+
graphql.defaults({ headers: { authorization: `token ${token}` } });
4211942122
async function inactivatePriorDeployments(context, currentDeploymentNodeId) {
42120-
const octokit = new Octokit({ auth: context.token });
42123+
const octokit = createOctokitClient(context.token);
42124+
const octokitGraphQl = createOctokitGraphQLClient(context.token);
4212142125
const params = {
4212242126
owner: context.owner,
4212342127
repo: context.repo,
@@ -42126,19 +42130,14 @@ var require_deployments = __commonJS({
4212642130
per_page: 100
4212742131
};
4212842132
const deploymentsList = (
42129-
await octokit.paginate(octokit.rest.repos.listDeployments, params)
42130-
).filter(
42131-
d =>
42132-
d.node_id != currentDeploymentNodeId &&
42133-
d.payload.entity == context.entity &&
42134-
d.payload.instance == context.instance
42135-
);
42133+
await getPriorDeployments(octokit, context.entity, context.instance, params)
42134+
).filter(d => d.node_id != currentDeploymentNodeId);
4213642135
const statuses = await getPriorDeploymentStatuses(
42137-
context.token,
42136+
octokitGraphQl,
4213842137
deploymentsList.map(d => d.node_id)
4213942138
);
42140-
for (let i = 0; i < statuses.deployments.length; i++) {
42141-
let deploymentQl = statuses.deployments[i];
42139+
for (let i = 0; i < statuses.length; i++) {
42140+
let deploymentQl = statuses[i];
4214242141
let deployment = deploymentsList.filter(d => d.node_id == deploymentQl.id)[0];
4214342142
for (let j = 0; j < deploymentQl.statuses.nodes.length; j++) {
4214442143
const status = deploymentQl.statuses.nodes[j];
@@ -42156,12 +42155,12 @@ var require_deployments = __commonJS({
4215642155
}
4215742156
}
4215842157
}
42159-
async function getPriorDeploymentStatuses(token, deploymentNodeIds) {
42160-
const octokitGraphQl = graphql.defaults({
42161-
headers: {
42162-
authorization: `token ${token}`
42163-
}
42164-
});
42158+
async function getPriorDeployments(octokit, entity, instance, params) {
42159+
return (await octokit.paginate(octokit.rest.repos.listDeployments, params)).filter(
42160+
d => d.payload.entity == entity && d.payload.instance == instance
42161+
);
42162+
}
42163+
async function getPriorDeploymentStatuses(octokitGraphQl, deploymentNodeIds) {
4216542164
const statuses = [];
4216642165
const statusesQuery = `
4216742166
query($deploymentNodeIds: [ID!]!) {
@@ -42194,7 +42193,7 @@ var require_deployments = __commonJS({
4219442193
return statuses;
4219542194
}
4219642195
async function createDeployment2(context) {
42197-
const octokit = new Octokit({ auth: context.token });
42196+
const octokit = createOctokitClient(context.token);
4219842197
const deployment = (
4219942198
await octokit.rest.repos.createDeployment({
4220042199
owner: context.owner,
@@ -42252,7 +42251,12 @@ var require_deployments = __commonJS({
4225242251
}
4225342252
module2.exports = {
4225442253
ALLOWED_STATUSES,
42255-
createDeployment: createDeployment2
42254+
WORKFLOW_DEPLOY,
42255+
createDeployment: createDeployment2,
42256+
createOctokitClient,
42257+
createOctokitGraphQLClient,
42258+
getPriorDeployments,
42259+
getPriorDeploymentStatuses
4225642260
};
4225742261
}
4225842262
});
@@ -42317,7 +42321,7 @@ var require_library = __commonJS({
4231742321
const workflow_run_id = github.context.runId;
4231842322
const owner = github.context.repo.owner;
4231942323
const repo = github.context.repo.repo;
42320-
if (!ALLOWED_STATUSES.map(s => s.toLowerCase()).includes(deployment_status.toLowerCase())) {
42324+
if (!Object.values(ALLOWED_STATUSES).includes(deployment_status.toLowerCase())) {
4232142325
throw { name: INVALID_STATUS, message: `Invalid deployment status: ${deployment_status}` };
4232242326
}
4232342327
return new context(
@@ -42337,7 +42341,8 @@ var require_library = __commonJS({
4233742341
}
4233842342
module2.exports = {
4233942343
INVALID_STATUS,
42340-
setup: setup2
42344+
setup: setup2,
42345+
context
4234142346
};
4234242347
}
4234342348
});

src/deployments.js

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
const { Octokit } = require('@octokit/rest');
22
const { graphql } = require('@octokit/graphql');
33
const WORKFLOW_DEPLOY = 'workflowdeploy';
4-
const ALLOWED_STATUSES = [
5-
'success',
6-
'error',
7-
'failure',
8-
'inactive',
9-
'in_progress',
10-
'queued',
11-
'pending'
12-
];
4+
const ALLOWED_STATUSES = {
5+
SUCCESS: 'success',
6+
ERROR: 'error',
7+
FAILURE: 'failure',
8+
INACTIVE: 'inactive',
9+
IN_PROGRESS: 'in_progress',
10+
QUEUED: 'queued',
11+
PENDING: 'pending'
12+
};
13+
14+
const createOctokitClient = token => new Octokit({ auth: token });
15+
const createOctokitGraphQLClient = token =>
16+
graphql.defaults({ headers: { authorization: `token ${token}` } });
1317

1418
async function inactivatePriorDeployments(context, currentDeploymentNodeId) {
15-
const octokit = new Octokit({ auth: context.token });
19+
const octokit = createOctokitClient(context.token);
20+
const octokitGraphQl = createOctokitGraphQLClient(context.token);
1621

1722
const params = {
1823
owner: context.owner,
@@ -23,21 +28,16 @@ async function inactivatePriorDeployments(context, currentDeploymentNodeId) {
2328
};
2429

2530
const deploymentsList = (
26-
await octokit.paginate(octokit.rest.repos.listDeployments, params)
27-
).filter(
28-
d =>
29-
d.node_id != currentDeploymentNodeId &&
30-
d.payload.entity == context.entity &&
31-
d.payload.instance == context.instance
32-
);
31+
await getPriorDeployments(octokit, context.entity, context.instance, params)
32+
).filter(d => d.node_id != currentDeploymentNodeId);
3333

3434
const statuses = await getPriorDeploymentStatuses(
35-
context.token,
35+
octokitGraphQl,
3636
deploymentsList.map(d => d.node_id)
3737
);
3838

39-
for (let i = 0; i < statuses.deployments.length; i++) {
40-
let deploymentQl = statuses.deployments[i];
39+
for (let i = 0; i < statuses.length; i++) {
40+
let deploymentQl = statuses[i];
4141
let deployment = deploymentsList.filter(d => d.node_id == deploymentQl.id)[0];
4242

4343
for (let j = 0; j < deploymentQl.statuses.nodes.length; j++) {
@@ -58,13 +58,13 @@ async function inactivatePriorDeployments(context, currentDeploymentNodeId) {
5858
}
5959
}
6060

61-
async function getPriorDeploymentStatuses(token, deploymentNodeIds) {
62-
const octokitGraphQl = graphql.defaults({
63-
headers: {
64-
authorization: `token ${token}`
65-
}
66-
});
61+
async function getPriorDeployments(octokit, entity, instance, params) {
62+
return (await octokit.paginate(octokit.rest.repos.listDeployments, params)).filter(
63+
d => d.payload.entity == entity && d.payload.instance == instance
64+
);
65+
}
6766

67+
async function getPriorDeploymentStatuses(octokitGraphQl, deploymentNodeIds) {
6868
const statuses = [];
6969
const statusesQuery = `
7070
query($deploymentNodeIds: [ID!]!) {
@@ -101,7 +101,8 @@ async function getPriorDeploymentStatuses(token, deploymentNodeIds) {
101101
}
102102

103103
async function createDeployment(context) {
104-
const octokit = new Octokit({ auth: context.token });
104+
const octokit = createOctokitClient(context.token);
105+
105106
// create deployment record
106107
const deployment = (
107108
await octokit.rest.repos.createDeployment({
@@ -126,6 +127,7 @@ async function createDeployment(context) {
126127
const inactivate = new Promise((resolve, reject) =>
127128
resolve(inactivatePriorDeployments(context, deployment.node_id))
128129
);
130+
129131
inactivate.then(async () => {
130132
await createDeploymentStatus(
131133
octokit,
@@ -164,5 +166,10 @@ async function createDeploymentStatus(
164166

165167
module.exports = {
166168
ALLOWED_STATUSES,
167-
createDeployment
169+
WORKFLOW_DEPLOY,
170+
createDeployment,
171+
createOctokitClient,
172+
createOctokitGraphQLClient,
173+
getPriorDeployments,
174+
getPriorDeploymentStatuses
168175
};

src/deployments.test.js

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
const { describe, test, expect, beforeEach, beforeAll, afterAll } = require('@jest/globals');
2+
const {
3+
ALLOWED_STATUSES,
4+
WORKFLOW_DEPLOY,
5+
createOctokitClient,
6+
createOctokitGraphQLClient,
7+
getPriorDeployments,
8+
getPriorDeploymentStatuses,
9+
createDeployment
10+
} = require('./deployments.js');
11+
const { context } = require('./library.js');
12+
13+
const token = process.env['GITHUB_TOKEN'];
14+
let octokit;
15+
let octokitGraphQl;
16+
const owner = 'im-open';
17+
const repo = 'create-github-deployment';
18+
const create_environment = 'INTEGRATION';
19+
const pull_environment = 'DEV';
20+
const entity = 'create-github-deployment';
21+
const instance = 'action';
22+
const priorDeployments = [];
23+
const priorDeploymentStatuses = [];
24+
let testDeploymentId = null;
25+
const workflow_actor = 'test-actor';
26+
27+
// Create the octokit clients
28+
beforeAll(() => {
29+
octokit = createOctokitClient(token);
30+
octokitGraphQl = createOctokitGraphQLClient(token);
31+
});
32+
33+
//clean up test deployment
34+
afterAll(async () => {
35+
if (testDeploymentId !== null) {
36+
setTimeout(async () => {
37+
await octokit.rest.repos.deleteDeployment({
38+
owner: owner,
39+
repo: repo,
40+
deployment_id: testDeploymentId
41+
});
42+
octokit = null;
43+
octokitGraphQl = null;
44+
}, 5000);
45+
}
46+
});
47+
48+
describe('deployments', () => {
49+
let firstDeploymentId;
50+
51+
test('get the deployments', async () => {
52+
const deployments = await getPriorDeployments(octokit, entity, instance, {
53+
owner: owner,
54+
repo: repo,
55+
task: WORKFLOW_DEPLOY,
56+
environment: pull_environment,
57+
per_page: 100
58+
});
59+
expect(deployments).toBeDefined();
60+
expect(deployments.length).toBeGreaterThan(0);
61+
expect(deployments[0].payload).toBeDefined();
62+
firstDeploymentId = deployments[0].node_id;
63+
64+
priorDeployments.push(...deployments);
65+
});
66+
67+
test('get the deployment statuses', async () => {
68+
const statuses = await getPriorDeploymentStatuses(octokitGraphQl, [firstDeploymentId]);
69+
expect(statuses).toBeDefined();
70+
expect(statuses.length).toBeGreaterThan(0);
71+
72+
expect(statuses[0].statuses).toBeDefined();
73+
expect(statuses[0].statuses.nodes).toBeDefined();
74+
expect(statuses[0].statuses.nodes.length).toBeGreaterThan(0);
75+
76+
priorDeploymentStatuses.push(...statuses);
77+
});
78+
79+
test('create deployment', async () => {
80+
testDeploymentId = await createDeployment(
81+
new context(
82+
workflow_actor,
83+
token,
84+
create_environment,
85+
'v1',
86+
ALLOWED_STATUSES.SUCCESS,
87+
'Testing deployment creation',
88+
entity,
89+
instance,
90+
'https://github.com',
91+
'https://github.com',
92+
owner,
93+
repo
94+
)
95+
);
96+
97+
expect(Number.isNaN(testDeploymentId)).toBe(false);
98+
});
99+
});

src/library.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ function setup() {
5757
const owner = github.context.repo.owner;
5858
const repo = github.context.repo.repo;
5959

60-
if (!ALLOWED_STATUSES.map(s => s.toLowerCase()).includes(deployment_status.toLowerCase())) {
60+
if (!Object.values(ALLOWED_STATUSES).includes(deployment_status.toLowerCase())) {
6161
throw { name: INVALID_STATUS, message: `Invalid deployment status: ${deployment_status}` };
6262
}
6363

@@ -79,5 +79,6 @@ function setup() {
7979

8080
module.exports = {
8181
INVALID_STATUS,
82-
setup
82+
setup,
83+
context
8384
};

0 commit comments

Comments
 (0)