Skip to content

Commit 37738bd

Browse files
committed
chore: code refactor, tests
1 parent 291b6da commit 37738bd

File tree

5 files changed

+125
-23
lines changed

5 files changed

+125
-23
lines changed

__tests__/main.test.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1201,6 +1201,53 @@ describe('Deploy CloudFormation Stack', () => {
12011201
expect(mockExecuteChangeSet).toHaveBeenCalledTimes(0)
12021202
})
12031203

1204+
test('deploys the stack with template', async () => {
1205+
const inputs: Inputs = {
1206+
name: 'MockStack',
1207+
template: 'template.yaml',
1208+
capabilities: 'CAPABILITY_IAM',
1209+
'parameter-overrides': '[email protected]',
1210+
'envs-prefix-for-parameter-overrides': 'CFD_',
1211+
'no-fail-on-empty-changeset': '0',
1212+
'disable-rollback': '0',
1213+
'timeout-in-minutes': '',
1214+
'notification-arns': '',
1215+
'role-arn': '',
1216+
tags: '',
1217+
'termination-protection': ''
1218+
}
1219+
1220+
jest.spyOn(core, 'getInput').mockImplementation((name: string) => {
1221+
return inputs[name]
1222+
})
1223+
1224+
process.env = Object.assign(process.env, { CFD_AdminNickname: 'root' })
1225+
1226+
await run()
1227+
1228+
expect(core.setFailed).toHaveBeenCalledTimes(0)
1229+
expect(mockDescribeStacks).toHaveBeenCalledTimes(2)
1230+
expect(mockDescribeStacks).toHaveBeenNthCalledWith(1, {
1231+
StackName: 'MockStack'
1232+
})
1233+
expect(mockDescribeStacks).toHaveBeenNthCalledWith(2, {
1234+
StackName: mockStackId
1235+
})
1236+
expect(mockCreateStack).toHaveBeenNthCalledWith(1, {
1237+
StackName: 'MockStack',
1238+
TemplateBody: mockTemplate,
1239+
Capabilities: ['CAPABILITY_IAM'],
1240+
Parameters: [
1241+
{ ParameterKey: 'AdminEmail', ParameterValue: '[email protected]' },
1242+
{ ParameterKey: 'AdminNickname', ParameterValue: 'root' }
1243+
],
1244+
DisableRollback: false,
1245+
EnableTerminationProtection: false
1246+
})
1247+
expect(core.setOutput).toHaveBeenCalledTimes(1)
1248+
expect(core.setOutput).toHaveBeenNthCalledWith(1, 'stack-id', mockStackId)
1249+
})
1250+
12041251
test('error is caught by core.setFailed', async () => {
12051252
mockDescribeStacks.mockReset()
12061253
mockDescribeStacks.mockImplementation(() => {

__tests__/utils.test.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { parseTags, isUrl, parseParameters } from '../src/utils'
1+
import {
2+
parseTags,
3+
isUrl,
4+
parseParameters,
5+
parseParametersFromEnvs
6+
} from '../src/utils'
27
import * as path from 'path'
38

49
jest.mock('@actions/core')
@@ -119,6 +124,30 @@ describe('Parse Parameters', () => {
119124
])
120125
})
121126

127+
test('returns parameters list from envs if envsPrefixForParameterOverrides is defined', async () => {
128+
const mockEnvs = {
129+
CFD_MyParam1: 'myValue1',
130+
CFD_MyParam2: 'myValue2',
131+
USER: 'test',
132+
PATH: '/bin:/usr/local/bin',
133+
HOME: '/home/test',
134+
AWS_PAGER: ''
135+
}
136+
const envsPrefix = 'CFD_'
137+
138+
const json = parseParametersFromEnvs(envsPrefix, mockEnvs)
139+
expect(json).toEqual([
140+
{
141+
ParameterKey: 'MyParam1',
142+
ParameterValue: 'myValue1'
143+
},
144+
{
145+
ParameterKey: 'MyParam2',
146+
ParameterValue: 'myValue2'
147+
}
148+
])
149+
})
150+
122151
test('throws error if file is not found', async () => {
123152
const filename = 'file://' + path.join(__dirname, 'params.tezt.json')
124153
expect(() => parseParameters(filename)).toThrow()

dist/index.js

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,6 @@ const clientConfiguration = {
222222
customUserAgent: 'aws-cloudformation-github-deploy-for-github-actions'
223223
};
224224
function run() {
225-
var _a;
226225
return __awaiter(this, void 0, void 0, function* () {
227226
try {
228227
const { GITHUB_WORKSPACE = __dirname } = process.env;
@@ -235,7 +234,7 @@ function run() {
235234
const parameterOverrides = core.getInput('parameter-overrides', {
236235
required: false
237236
});
238-
const envsPrefixForparameterOverrides = core.getInput('envs-prefix-for-parameter-overrides', {
237+
const envsPrefixForParameterOverrides = core.getInput('envs-prefix-for-parameter-overrides', {
239238
required: false
240239
});
241240
const noEmptyChangeSet = !!+core.getInput('no-fail-on-empty-changeset', {
@@ -301,13 +300,11 @@ function run() {
301300
if (parameterOverrides) {
302301
params.Parameters = (0, utils_1.parseParameters)(parameterOverrides.trim());
303302
}
304-
if (envsPrefixForparameterOverrides.length > 0) {
305-
(_a = params.Parameters) === null || _a === void 0 ? void 0 : _a.concat(Object.keys(process.env)
306-
.filter(key => key.startsWith(envsPrefixForparameterOverrides))
307-
.map(key => ({
308-
ParameterKey: key,
309-
ParameterValue: process.env[key]
310-
})));
303+
if (envsPrefixForParameterOverrides.length > 0) {
304+
const envParameters = (0, utils_1.parseParametersFromEnvs)(envsPrefixForParameterOverrides, process.env);
305+
params.Parameters = params.Parameters
306+
? [...params.Parameters, ...envParameters]
307+
: envParameters;
311308
}
312309
const stackId = yield (0, deploy_1.deployStack)(cfn, params, noEmptyChangeSet, noExecuteChangeSet, noDeleteFailedChangeSet);
313310
core.setOutput('stack-id', stackId || 'UNKNOWN');
@@ -364,7 +361,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
364361
return result;
365362
};
366363
Object.defineProperty(exports, "__esModule", ({ value: true }));
367-
exports.configureProxy = exports.parseParameters = exports.parseNumber = exports.parseString = exports.parseARNs = exports.parseTags = exports.isUrl = void 0;
364+
exports.configureProxy = exports.parseParametersFromEnvs = exports.parseParameters = exports.parseNumber = exports.parseString = exports.parseARNs = exports.parseTags = exports.isUrl = void 0;
368365
const aws = __importStar(__nccwpck_require__(71786));
369366
const fs = __importStar(__nccwpck_require__(57147));
370367
const https_proxy_agent_1 = __nccwpck_require__(77219);
@@ -437,6 +434,16 @@ function parseParameters(parameterOverrides) {
437434
});
438435
}
439436
exports.parseParameters = parseParameters;
437+
function parseParametersFromEnvs(prefix, envs) {
438+
const parameters = Object.keys(envs)
439+
.filter(key => key.startsWith(prefix))
440+
.map(key => ({
441+
ParameterKey: key.substring(prefix.length),
442+
ParameterValue: envs[key]
443+
}));
444+
return parameters;
445+
}
446+
exports.parseParametersFromEnvs = parseParametersFromEnvs;
440447
function configureProxy(proxyServer) {
441448
const proxyFromEnv = process.env.HTTP_PROXY || process.env.http_proxy;
442449
if (proxyFromEnv || proxyServer) {

src/main.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import {
1010
parseNumber,
1111
parseARNs,
1212
parseParameters,
13-
configureProxy
13+
configureProxy,
14+
parseParametersFromEnvs
1415
} from './utils'
1516

1617
export type CreateStackInput = aws.CloudFormation.Types.CreateStackInput
@@ -43,9 +44,12 @@ export async function run(): Promise<void> {
4344
const parameterOverrides = core.getInput('parameter-overrides', {
4445
required: false
4546
})
46-
const envsPrefixForparameterOverrides = core.getInput('envs-prefix-for-parameter-overrides', {
47-
required: false
48-
})
47+
const envsPrefixForParameterOverrides = core.getInput(
48+
'envs-prefix-for-parameter-overrides',
49+
{
50+
required: false
51+
}
52+
)
4953
const noEmptyChangeSet = !!+core.getInput('no-fail-on-empty-changeset', {
5054
required: false
5155
})
@@ -128,14 +132,14 @@ export async function run(): Promise<void> {
128132
params.Parameters = parseParameters(parameterOverrides.trim())
129133
}
130134

131-
if (envsPrefixForparameterOverrides.length > 0) {
132-
params.Parameters?.concat(
133-
Object.keys(process.env)
134-
.filter(key => key.startsWith(envsPrefixForparameterOverrides))
135-
.map(key => ({
136-
ParameterKey: key,
137-
ParameterValue: process.env[key]
138-
})))
135+
if (envsPrefixForParameterOverrides.length > 0) {
136+
const envParameters = parseParametersFromEnvs(
137+
envsPrefixForParameterOverrides,
138+
process.env
139+
)
140+
params.Parameters = params.Parameters
141+
? [...params.Parameters, ...envParameters]
142+
: envParameters
139143
}
140144

141145
const stackId = await deployStack(

src/utils.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,21 @@ export function parseParameters(parameterOverrides: string): Parameter[] {
7878
})
7979
}
8080

81+
type Envs = { [k: string]: string | undefined }
82+
83+
export function parseParametersFromEnvs(
84+
prefix: string,
85+
envs: Envs
86+
): Parameter[] {
87+
const parameters: Parameter[] = Object.keys(envs)
88+
.filter(key => key.startsWith(prefix))
89+
.map(key => ({
90+
ParameterKey: key.substring(prefix.length),
91+
ParameterValue: envs[key]
92+
}))
93+
return parameters
94+
}
95+
8196
export function configureProxy(proxyServer: string | undefined) {
8297
const proxyFromEnv = process.env.HTTP_PROXY || process.env.http_proxy
8398

0 commit comments

Comments
 (0)