Skip to content

Commit c849474

Browse files
committed
feat: Add support for branch policies as string array
1 parent 0e884b7 commit c849474

File tree

2 files changed

+164
-6
lines changed

2 files changed

+164
-6
lines changed

lib/plugins/environments.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,14 @@ module.exports = class Environments extends Diffable {
1818
if (environment.deployment_branch_policy && environment.deployment_branch_policy.custom_branch_policies) {
1919
const policies = []
2020
environment.deployment_branch_policy.custom_branch_policies.forEach(policy => {
21-
policy.names.forEach(name => {
22-
policies.push({ name: name, type: policy.type })
23-
})
21+
if (typeof policy === 'string') {
22+
// Convert string policy to object with type 'branch'
23+
policies.push({ name: policy, type: 'branch' })
24+
} else if (typeof policy === 'object' && Array.isArray(policy.names)) {
25+
policy.names.forEach(name => {
26+
policies.push({ name: name, type: policy.type })
27+
})
28+
}
2429
})
2530
environment.deployment_branch_policy.custom_branch_policies = policies
2631
}

test/unit/lib/plugins/environments.test.js

Lines changed: 156 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ describe('Environments Plugin test suite', () => {
77
let environmentName = ''
88
const org = 'bkeepers'
99
const repo = 'test'
10-
const PrimaryEnvironmentNamesBeingTested = ['wait-timer_environment', 'wait-timer_2_environment', 'reviewers_environment', 'prevent-self-review_environment', 'deployment-branch-policy_environment', 'deployment-branch-policy-custom_environment', 'variables_environment', 'deployment-protection-rules_environment', 'new_environment', 'old_environment']
11-
const EnvironmentNamesForTheNewEnvironmentsTest = ['new-wait-timer', 'new-reviewers', 'new-prevent-self-review', 'new-deployment-branch-policy', 'new-deployment-branch-policy-custom', 'new-variables', 'new-deployment-protection-rules']
10+
const PrimaryEnvironmentNamesBeingTested = ['wait-timer_environment', 'wait-timer_2_environment', 'reviewers_environment', 'prevent-self-review_environment', 'deployment-branch-policy_environment', 'deployment-branch-policy-custom_environment', 'deployment-branch-policy-custom_environment_legacy', 'variables_environment', 'deployment-protection-rules_environment', 'new_environment', 'old_environment']
11+
const EnvironmentNamesForTheNewEnvironmentsTest = ['new-wait-timer', 'new-reviewers', 'new-prevent-self-review', 'new-deployment-branch-policy', 'new-deployment-branch-policy-custom', 'new-deployment-branch-policy-custom-legacy', 'new-variables', 'new-deployment-protection-rules']
1212
const AllEnvironmentNamesBeingTested = PrimaryEnvironmentNamesBeingTested.concat(EnvironmentNamesForTheNewEnvironmentsTest)
1313
const log = { debug: jest.fn(), error: console.error }
1414
const errors = []
@@ -58,6 +58,15 @@ describe('Environments Plugin test suite', () => {
5858
}
5959
)
6060

61+
when(github.request)
62+
.calledWith('GET /repos/:org/:repo/environments/:environment_name/deployment-branch-policies', { org, repo, environment_name: 'deployment-branch-policy-custom_environment_legacy' })
63+
.mockResolvedValue({
64+
data: {
65+
branch_policies: []
66+
}
67+
}
68+
)
69+
6170
when(github.request)
6271
.calledWith('DELETE /repos/:org/:repo/environments/:environment_name/deployment-branch-policies/:branch_policy_id')
6372
.mockResolvedValue({})
@@ -369,6 +378,69 @@ describe('Environments Plugin test suite', () => {
369378
})
370379
})
371380

381+
// custom deployment branch policy with string array
382+
describe('When there is no existing deployment branch policy and the config sets a custom policy as a string array', () => {
383+
it('detect divergence and set the custom deployment branch policy from the config', async () => {
384+
// arrange
385+
environmentName = 'deployment-branch-policy-custom_environment_legacy'
386+
// represent config with a custom branch policy
387+
const plugin = new Environments(undefined, github, { owner: org, repo }, [
388+
{
389+
name: environmentName,
390+
deployment_branch_policy: {
391+
protected_branches: false,
392+
custom_branch_policies: ["main", "dev"]
393+
}
394+
}
395+
], log, errors)
396+
397+
// model an existing environment with no branch policies
398+
when(github.request)
399+
.calledWith('GET /repos/:org/:repo/environments', { org, repo })
400+
.mockResolvedValue({
401+
data: {
402+
environments: [
403+
fillEnvironment({
404+
name: environmentName,
405+
deployment_branch_policy: null
406+
})
407+
]
408+
}
409+
})
410+
411+
// act - run sync() in environments.js
412+
await plugin.sync().then(() => {
413+
// assert - update the custom branch policies
414+
expect(github.request).toHaveBeenCalledWith('GET /repos/:org/:repo/environments', { org, repo })
415+
expect(github.request).toHaveBeenCalledWith('GET /repos/:org/:repo/environments/:environment_name/variables', { org, repo, environment_name: environmentName })
416+
expect(github.request).toHaveBeenCalledWith('GET /repos/:org/:repo/environments/:environment_name/deployment_protection_rules', { org, repo, environment_name: environmentName })
417+
expect(github.request).toHaveBeenCalledWith('PUT /repos/:org/:repo/environments/:environment_name', expect.objectContaining({
418+
org,
419+
repo,
420+
environment_name: environmentName,
421+
deployment_branch_policy: {
422+
protected_branches: false,
423+
custom_branch_policies: true
424+
}
425+
}))
426+
expect(github.request).toHaveBeenCalledWith('POST /repos/:org/:repo/environments/:environment_name/deployment-branch-policies', expect.objectContaining({
427+
org,
428+
repo,
429+
environment_name: environmentName,
430+
name: 'main',
431+
type: 'branch'
432+
}))
433+
expect(github.request).toHaveBeenCalledWith('POST /repos/:org/:repo/environments/:environment_name/deployment-branch-policies', expect.objectContaining({
434+
org,
435+
repo,
436+
environment_name: environmentName,
437+
name: 'dev',
438+
type: 'branch'
439+
}))
440+
})
441+
})
442+
})
443+
372444
// add variable
373445
describe('When there are no existing variables and config calls for one', () => {
374446
it('detect divergence and add the variable', async () => {
@@ -779,6 +851,13 @@ describe('Environments Plugin test suite', () => {
779851
]
780852
}
781853
},
854+
{
855+
name: 'deployment-branch-policy-custom_environment_legacy',
856+
deployment_branch_policy: {
857+
protected_branches: false,
858+
custom_branch_policies: ["main", "dev"]
859+
}
860+
},
782861
{
783862
name: 'variables_environment',
784863
variables: [
@@ -826,6 +905,10 @@ describe('Environments Plugin test suite', () => {
826905
name: 'deployment-branch-policy-custom_environment',
827906
deployment_branch_policy: null
828907
}),
908+
fillEnvironment({
909+
name: 'deployment-branch-policy-custom_environment_legacy',
910+
deployment_branch_policy: null
911+
}),
829912
fillEnvironment({
830913
name: 'variables_environment',
831914
variables: []
@@ -844,7 +927,7 @@ describe('Environments Plugin test suite', () => {
844927

845928
expect(github.request).toHaveBeenCalledWith('GET /repos/:org/:repo/environments', { org, repo });
846929

847-
['wait-timer_environment', 'reviewers_environment', 'prevent-self-review_environment', 'deployment-branch-policy_environment', 'deployment-branch-policy-custom_environment', 'variables_environment', 'deployment-protection-rules_environment'].forEach((environmentName) => {
930+
['wait-timer_environment', 'reviewers_environment', 'prevent-self-review_environment', 'deployment-branch-policy_environment', 'deployment-branch-policy-custom_environment', 'deployment-branch-policy-custom_environment_legacy', 'variables_environment', 'deployment-protection-rules_environment'].forEach((environmentName) => {
848931
expect(github.request).toHaveBeenCalledWith('GET /repos/:org/:repo/environments/:environment_name/variables', { org, repo, environment_name: environmentName })
849932

850933
expect(github.request).toHaveBeenCalledWith('GET /repos/:org/:repo/environments/:environment_name/deployment_protection_rules', { org, repo, environment_name: environmentName })
@@ -931,6 +1014,32 @@ describe('Environments Plugin test suite', () => {
9311014
type: 'tag'
9321015
}))
9331016

1017+
expect(github.request).toHaveBeenCalledWith('PUT /repos/:org/:repo/environments/:environment_name', expect.objectContaining({
1018+
org,
1019+
repo,
1020+
environment_name: 'deployment-branch-policy-custom_environment_legacy',
1021+
deployment_branch_policy: {
1022+
protected_branches: false,
1023+
custom_branch_policies: true
1024+
}
1025+
}))
1026+
1027+
expect(github.request).toHaveBeenCalledWith('POST /repos/:org/:repo/environments/:environment_name/deployment-branch-policies', expect.objectContaining({
1028+
org,
1029+
repo,
1030+
environment_name: 'deployment-branch-policy-custom_environment_legacy',
1031+
name: 'main',
1032+
type: 'branch'
1033+
}))
1034+
1035+
expect(github.request).toHaveBeenCalledWith('POST /repos/:org/:repo/environments/:environment_name/deployment-branch-policies', expect.objectContaining({
1036+
org,
1037+
repo,
1038+
environment_name: 'deployment-branch-policy-custom_environment_legacy',
1039+
name: 'dev',
1040+
type: 'branch'
1041+
}))
1042+
9341043
expect(github.request).toHaveBeenCalledWith('POST /repos/:org/:repo/environments/:environment_name/variables', expect.objectContaining({
9351044
org,
9361045
repo,
@@ -999,6 +1108,13 @@ describe('Environments Plugin test suite', () => {
9991108
]
10001109
}
10011110
},
1111+
{
1112+
name: 'deployment-branch-policy-custom_environment_legacy',
1113+
deployment_branch_policy: {
1114+
protected_branches: false,
1115+
custom_branch_policies: ["main", "dev"]
1116+
}
1117+
},
10021118
{
10031119
name: 'variables_environment',
10041120
variables: [
@@ -1060,6 +1176,13 @@ describe('Environments Plugin test suite', () => {
10601176
]
10611177
}
10621178
},
1179+
{
1180+
name: 'new-deployment-branch-policy-custom-legacy',
1181+
deployment_branch_policy: {
1182+
protected_branches: false,
1183+
custom_branch_policies: ["main", "dev"]
1184+
}
1185+
},
10631186
{
10641187
name: 'new-variables',
10651188
variables: [
@@ -1107,6 +1230,10 @@ describe('Environments Plugin test suite', () => {
11071230
name: 'deployment-branch-policy-custom_environment',
11081231
deployment_branch_policy: null
11091232
}),
1233+
fillEnvironment({
1234+
name: 'deployment-branch-policy-custom_environment_legacy',
1235+
deployment_branch_policy: null
1236+
}),
11101237
fillEnvironment({
11111238
name: 'variables_environment',
11121239
variables: []
@@ -1212,6 +1339,32 @@ describe('Environments Plugin test suite', () => {
12121339
type: 'tag'
12131340
}))
12141341

1342+
expect(github.request).toHaveBeenCalledWith('PUT /repos/:org/:repo/environments/:environment_name', expect.objectContaining({
1343+
org,
1344+
repo,
1345+
environment_name: 'deployment-branch-policy-custom_environment_legacy',
1346+
deployment_branch_policy: {
1347+
protected_branches: false,
1348+
custom_branch_policies: true
1349+
}
1350+
}))
1351+
1352+
expect(github.request).toHaveBeenCalledWith('POST /repos/:org/:repo/environments/:environment_name/deployment-branch-policies', expect.objectContaining({
1353+
org,
1354+
repo,
1355+
environment_name: 'deployment-branch-policy-custom_environment_legacy',
1356+
name: 'main',
1357+
type: 'branch'
1358+
}))
1359+
1360+
expect(github.request).toHaveBeenCalledWith('POST /repos/:org/:repo/environments/:environment_name/deployment-branch-policies', expect.objectContaining({
1361+
org,
1362+
repo,
1363+
environment_name: 'deployment-branch-policy-custom_environment_legacy',
1364+
name: 'dev',
1365+
type: 'branch'
1366+
}))
1367+
12151368
expect(github.request).toHaveBeenCalledWith('POST /repos/:org/:repo/environments/:environment_name/variables', expect.objectContaining({
12161369
org,
12171370
repo,

0 commit comments

Comments
 (0)