github.com/zppinho/prow@v0.0.0-20240510014325-1738badeb017/pkg/plugins/milestoneapplier/milestoneapplier_test.go (about)

     1  /*
     2  Copyright 2019 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package milestoneapplier
    18  
    19  import (
    20  	"testing"
    21  
    22  	"github.com/sirupsen/logrus"
    23  
    24  	"sigs.k8s.io/prow/pkg/github"
    25  	"sigs.k8s.io/prow/pkg/github/fakegithub"
    26  )
    27  
    28  func TestMilestoneApplier(t *testing.T) {
    29  	var milestonesMap = map[string]int{"v1.0": 1, "v2.0": 2}
    30  	testcases := []struct {
    31  		name                string
    32  		baseBranch          string
    33  		prAction            github.PullRequestEventAction
    34  		merged              bool
    35  		previousMilestone   int
    36  		configuredMilestone int
    37  		expectedMilestone   int
    38  	}{
    39  		{
    40  			name:                "opened PR on default branch => do nothing",
    41  			baseBranch:          "master",
    42  			prAction:            github.PullRequestActionOpened,
    43  			expectedMilestone:   0,
    44  			configuredMilestone: 1,
    45  		},
    46  		{
    47  			name:                "closed (not merged) PR on default branch => do nothing",
    48  			baseBranch:          "master",
    49  			prAction:            github.PullRequestActionClosed,
    50  			merged:              false,
    51  			expectedMilestone:   0,
    52  			configuredMilestone: 1,
    53  		},
    54  		{
    55  			name:                "merged PR but has existing milestone on default branch => apply configured milestone",
    56  			baseBranch:          "master",
    57  			prAction:            github.PullRequestActionClosed,
    58  			merged:              true,
    59  			previousMilestone:   1,
    60  			configuredMilestone: 2,
    61  			expectedMilestone:   2,
    62  		},
    63  		{
    64  			name:                "merged PR but already has configured milestone on default branch => do nothing",
    65  			baseBranch:          "master",
    66  			prAction:            github.PullRequestActionClosed,
    67  			merged:              true,
    68  			previousMilestone:   2,
    69  			configuredMilestone: 2,
    70  			expectedMilestone:   2,
    71  		},
    72  		{
    73  			name:                "merged PR but does not have existing milestone on default branch => add milestone",
    74  			prAction:            github.PullRequestActionClosed,
    75  			baseBranch:          "master",
    76  			merged:              true,
    77  			previousMilestone:   0,
    78  			configuredMilestone: 2,
    79  			expectedMilestone:   2,
    80  		},
    81  		{
    82  			name:                "opened PR on non-default branch => add milestone",
    83  			baseBranch:          "release-1.0",
    84  			prAction:            github.PullRequestActionOpened,
    85  			configuredMilestone: 1,
    86  			expectedMilestone:   1,
    87  		},
    88  		{
    89  			name:                "synced PR on non-default branch => do nothing",
    90  			baseBranch:          "release-1.0",
    91  			prAction:            github.PullRequestActionSynchronize,
    92  			previousMilestone:   0,
    93  			configuredMilestone: 1,
    94  			expectedMilestone:   0,
    95  		},
    96  		{
    97  			name:                "closed (not merged) PR on non-default branch => do nothing",
    98  			baseBranch:          "release-1.0",
    99  			prAction:            github.PullRequestActionClosed,
   100  			merged:              false,
   101  			expectedMilestone:   0,
   102  			configuredMilestone: 1,
   103  		},
   104  		{
   105  			name:                "merged PR but has existing milestone on non-default branch => add configured milestone",
   106  			baseBranch:          "release-1.0",
   107  			prAction:            github.PullRequestActionClosed,
   108  			merged:              true,
   109  			previousMilestone:   1,
   110  			configuredMilestone: 2,
   111  			expectedMilestone:   2,
   112  		},
   113  		{
   114  			name:                "merged PR but already has configured milestone on non-default branch => do nothing",
   115  			baseBranch:          "release-1.0",
   116  			prAction:            github.PullRequestActionClosed,
   117  			merged:              true,
   118  			previousMilestone:   2,
   119  			configuredMilestone: 2,
   120  			expectedMilestone:   2,
   121  		},
   122  		{
   123  			name:                "merged PR but does not have existing milestone on non-default branch => add milestone",
   124  			prAction:            github.PullRequestActionClosed,
   125  			baseBranch:          "release-1.0",
   126  			merged:              true,
   127  			previousMilestone:   0,
   128  			configuredMilestone: 1,
   129  			expectedMilestone:   1,
   130  		},
   131  	}
   132  
   133  	for _, tc := range testcases {
   134  		t.Run(tc.name, func(t *testing.T) {
   135  			basicPR := github.PullRequest{
   136  				Number: 1,
   137  				Base: github.PullRequestBranch{
   138  					Repo: github.Repo{
   139  						Owner: github.User{
   140  							Login: "kubernetes",
   141  						},
   142  						Name:          "kubernetes",
   143  						DefaultBranch: "master",
   144  					},
   145  					Ref: tc.baseBranch,
   146  				},
   147  			}
   148  
   149  			basicPR.Merged = tc.merged
   150  			if tc.previousMilestone != 0 {
   151  				basicPR.Milestone = &github.Milestone{
   152  					Number: tc.previousMilestone,
   153  				}
   154  			}
   155  
   156  			event := github.PullRequestEvent{
   157  				Action:      tc.prAction,
   158  				Number:      basicPR.Number,
   159  				PullRequest: basicPR,
   160  			}
   161  
   162  			fakeClient := fakegithub.NewFakeClient()
   163  			fakeClient.PullRequests = map[int]*github.PullRequest{
   164  				basicPR.Number: &basicPR,
   165  			}
   166  			fakeClient.MilestoneMap = milestonesMap
   167  			fakeClient.Milestone = tc.previousMilestone
   168  
   169  			var configuredMilestoneTitle string
   170  			for title, number := range milestonesMap {
   171  				if number == tc.configuredMilestone {
   172  					configuredMilestoneTitle = title
   173  				}
   174  			}
   175  
   176  			if err := handle(fakeClient, logrus.WithField("plugin", pluginName), configuredMilestoneTitle, event); err != nil {
   177  				t.Fatalf("(%s): Unexpected error from handle: %v.", tc.name, err)
   178  			}
   179  
   180  			if fakeClient.Milestone != tc.expectedMilestone {
   181  				t.Fatalf("%s: expected milestone: %d, received milestone: %d", tc.name, tc.expectedMilestone, fakeClient.Milestone)
   182  			}
   183  		})
   184  	}
   185  }