Skip to content

Commit 2a9661e

Browse files
committed
feat: selfapprove flag for approving policies
1 parent 2e0659c commit 2a9661e

File tree

4 files changed

+74
-2
lines changed

4 files changed

+74
-2
lines changed

server/core/config/raw/policies.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ type PolicySet struct {
7575
Name string `yaml:"name" json:"name"`
7676
Owners PolicyOwners `yaml:"owners,omitempty" json:"owners,omitempty"`
7777
ApproveCount int `yaml:"approve_count,omitempty" json:"approve_count,omitempty"`
78+
SelfApprove bool `yaml:"self_approve,omitempty" json:"self_approve,omitempty"`
7879
}
7980

8081
func (p PolicySet) Validate() error {
@@ -94,6 +95,7 @@ func (p PolicySet) ToValid() valid.PolicySet {
9495
policySet.Path = p.Path
9596
policySet.Source = p.Source
9697
policySet.ApproveCount = p.ApproveCount
98+
policySet.SelfApprove = p.SelfApprove
9799
policySet.Owners = p.Owners.ToValid()
98100

99101
return policySet

server/core/config/valid/policies.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ type PolicySet struct {
3232
Name string
3333
ApproveCount int
3434
Owners PolicyOwners
35+
SelfApprove bool
3536
}
3637

3738
func (p *PolicySets) HasPolicies() bool {

server/events/project_command_runner.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ func (p *DefaultProjectCommandRunner) doApprovePolicies(ctx command.ProjectConte
377377
ignorePolicy = true
378378
}
379379
// Increment approval if user is owner.
380-
if isOwner && !ignorePolicy {
380+
if isOwner && !ignorePolicy && (ctx.User.Username != ctx.Pull.Author || policySet.SelfApprove) {
381381
if !ctx.ClearPolicyApproval {
382382
prjPolicyStatus[i].Approvals = policyStatus.Approvals + 1
383383
} else {
@@ -391,6 +391,7 @@ func (p *DefaultProjectCommandRunner) doApprovePolicies(ctx command.ProjectConte
391391
if !policyStatus.Passed && (prjPolicyStatus[i].Approvals != policySet.ApproveCount) {
392392
allPassed = false
393393
}
394+
394395
prjPolicySetResults = append(prjPolicySetResults, models.PolicySetResult{
395396
PolicySetName: policySet.Name,
396397
Passed: policyStatus.Passed,

server/events/project_command_runner_test.go

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -791,10 +791,12 @@ func TestDefaultProjectCommandRunner_ApprovePolicies(t *testing.T) {
791791
{
792792
Name: "policy1",
793793
ApproveCount: 1,
794+
SelfApprove: true,
794795
},
795796
{
796797
Name: "policy2",
797798
ApproveCount: 2,
799+
SelfApprove: true,
798800
},
799801
},
800802
},
@@ -823,10 +825,12 @@ func TestDefaultProjectCommandRunner_ApprovePolicies(t *testing.T) {
823825
},
824826
Name: "policy1",
825827
ApproveCount: 1,
828+
SelfApprove: true,
826829
},
827830
{
828831
Name: "policy2",
829832
ApproveCount: 2,
833+
SelfApprove: true,
830834
},
831835
},
832836
},
@@ -855,10 +859,12 @@ func TestDefaultProjectCommandRunner_ApprovePolicies(t *testing.T) {
855859
{
856860
Name: "policy1",
857861
ApproveCount: 1,
862+
SelfApprove: true,
858863
},
859864
{
860865
Name: "policy2",
861866
ApproveCount: 1,
867+
SelfApprove: true,
862868
},
863869
},
864870
},
@@ -888,10 +894,12 @@ func TestDefaultProjectCommandRunner_ApprovePolicies(t *testing.T) {
888894
},
889895
Name: "policy1",
890896
ApproveCount: 1,
897+
SelfApprove: true,
891898
},
892899
{
893900
Name: "policy2",
894901
ApproveCount: 1,
902+
SelfApprove: true,
895903
},
896904
},
897905
},
@@ -920,6 +928,7 @@ func TestDefaultProjectCommandRunner_ApprovePolicies(t *testing.T) {
920928
},
921929
Name: "policy1",
922930
ApproveCount: 2,
931+
SelfApprove: true,
923932
},
924933
},
925934
},
@@ -950,6 +959,7 @@ func TestDefaultProjectCommandRunner_ApprovePolicies(t *testing.T) {
950959
},
951960
Name: "policy1",
952961
ApproveCount: 2,
962+
SelfApprove: true,
953963
},
954964
},
955965
},
@@ -983,13 +993,15 @@ func TestDefaultProjectCommandRunner_ApprovePolicies(t *testing.T) {
983993
},
984994
Name: "policy1",
985995
ApproveCount: 1,
996+
SelfApprove: true,
986997
},
987998
{
988999
Owners: valid.PolicyOwners{
9891000
Teams: []string{"someuserteam"},
9901001
},
9911002
Name: "policy2",
9921003
ApproveCount: 1,
1004+
SelfApprove: true,
9931005
},
9941006
},
9951007
},
@@ -1032,13 +1044,15 @@ func TestDefaultProjectCommandRunner_ApprovePolicies(t *testing.T) {
10321044
},
10331045
Name: "policy1",
10341046
ApproveCount: 1,
1047+
SelfApprove: true,
10351048
},
10361049
{
10371050
Owners: valid.PolicyOwners{
10381051
Teams: []string{"someuserteam"},
10391052
},
10401053
Name: "policy2",
10411054
ApproveCount: 2,
1055+
SelfApprove: true,
10421056
},
10431057
},
10441058
},
@@ -1081,13 +1095,15 @@ func TestDefaultProjectCommandRunner_ApprovePolicies(t *testing.T) {
10811095
},
10821096
Name: "policy1",
10831097
ApproveCount: 1,
1098+
SelfApprove: true,
10841099
},
10851100
{
10861101
Owners: valid.PolicyOwners{
10871102
Teams: []string{"someotheruserteam"},
10881103
},
10891104
Name: "policy2",
10901105
ApproveCount: 2,
1106+
SelfApprove: true,
10911107
},
10921108
},
10931109
},
@@ -1131,13 +1147,15 @@ func TestDefaultProjectCommandRunner_ApprovePolicies(t *testing.T) {
11311147
},
11321148
Name: "policy1",
11331149
ApproveCount: 1,
1150+
SelfApprove: true,
11341151
},
11351152
{
11361153
Owners: valid.PolicyOwners{
11371154
Teams: []string{"someuserteam"},
11381155
},
11391156
Name: "policy2",
11401157
ApproveCount: 2,
1158+
SelfApprove: true,
11411159
},
11421160
},
11431161
},
@@ -1168,6 +1186,56 @@ func TestDefaultProjectCommandRunner_ApprovePolicies(t *testing.T) {
11681186
expFailure: `One or more policy sets require additional approval.`,
11691187
hasErr: false,
11701188
},
1189+
{
1190+
description: "Policy Approval should not be the Author of the PR",
1191+
userTeams: []string{"someuserteam"},
1192+
clearPolicyApproval: false,
1193+
policySetCfg: valid.PolicySets{
1194+
PolicySets: []valid.PolicySet{
1195+
{
1196+
Owners: valid.PolicyOwners{
1197+
Users: []string{"lkysow"},
1198+
},
1199+
Name: "policy1",
1200+
ApproveCount: 1,
1201+
SelfApprove: true,
1202+
},
1203+
{
1204+
Owners: valid.PolicyOwners{
1205+
Users: []string{"lkysow"},
1206+
},
1207+
Name: "policy2",
1208+
ApproveCount: 1,
1209+
},
1210+
},
1211+
},
1212+
policySetStatus: []models.PolicySetStatus{
1213+
{
1214+
PolicySetName: "policy1",
1215+
Approvals: 0,
1216+
Passed: false,
1217+
},
1218+
{
1219+
PolicySetName: "policy2",
1220+
Approvals: 0,
1221+
Passed: false,
1222+
},
1223+
},
1224+
expOut: []models.PolicySetResult{
1225+
{
1226+
PolicySetName: "policy1",
1227+
ReqApprovals: 1,
1228+
CurApprovals: 1,
1229+
},
1230+
{
1231+
PolicySetName: "policy2",
1232+
ReqApprovals: 1,
1233+
CurApprovals: 0,
1234+
},
1235+
},
1236+
expFailure: `One or more policy sets require additional approval.`,
1237+
hasErr: true,
1238+
},
11711239
}
11721240

11731241
for _, c := range cases {
@@ -1225,7 +1293,7 @@ func TestDefaultProjectCommandRunner_ApprovePolicies(t *testing.T) {
12251293
projPolicyStatus = c.policySetStatus
12261294
}
12271295

1228-
modelPull := models.PullRequest{BaseRepo: testdata.GithubRepo, State: models.OpenPullState, Num: testdata.Pull.Num}
1296+
modelPull := models.PullRequest{BaseRepo: testdata.GithubRepo, State: models.OpenPullState, Num: testdata.Pull.Num, Author: testdata.User.Username}
12291297
When(runner.VcsClient.GetTeamNamesForUser(testdata.GithubRepo, testdata.User)).ThenReturn(c.userTeams, nil)
12301298
ctx := command.ProjectContext{
12311299
User: testdata.User,

0 commit comments

Comments
 (0)