github.com/jenkins-x/jx/v2@v2.1.155/pkg/gits/gitlab_test.go (about) 1 // +build unit 2 3 package gits_test 4 5 import ( 6 "testing" 7 8 "fmt" 9 "io/ioutil" 10 "net/http" 11 "net/http/httptest" 12 13 "github.com/jenkins-x/jx/v2/pkg/auth" 14 "github.com/jenkins-x/jx/v2/pkg/gits" 15 "github.com/jenkins-x/jx/v2/pkg/util" 16 "github.com/stretchr/testify/suite" 17 "github.com/xanzy/go-gitlab" 18 ) 19 20 const ( 21 gitlabUserName = "testperson" 22 gitlabSecondUserName = "raymond_smith" 23 gitlabOrgName = "testorg" 24 gitlabProjectName = "test-project" 25 gitlabProjectID = "5690870" 26 gitlabMergeRequestID = 12 27 ) 28 29 type GitlabProviderSuite struct { 30 suite.Suite 31 mux *http.ServeMux 32 server *httptest.Server 33 provider *gits.GitlabProvider 34 } 35 36 func (suite *GitlabProviderSuite) SetupSuite() { 37 mux, server, provider := setup(suite) 38 suite.mux = mux 39 suite.server = server 40 suite.provider = provider 41 } 42 43 func (suite *GitlabProviderSuite) TearDownSuite() { 44 suite.server.Close() 45 } 46 47 // setup sets up a test HTTP server along with a gitlab.Client that is 48 // configured to talk to that test server. Tests should register handlers on 49 // mux which provide mock responses for the API method being tested. 50 func setup(suite *GitlabProviderSuite) (*http.ServeMux, *httptest.Server, *gits.GitlabProvider) { 51 // mux is the HTTP request multiplexer used with the test server. 52 mux := http.NewServeMux() 53 configureGitlabMock(suite, mux) 54 55 // server is a test HTTP server used to provide mock API responses. 56 server := httptest.NewServer(mux) 57 58 // Gitlab client 59 client := gitlab.NewClient(nil, "") 60 client.SetBaseURL(server.URL) 61 62 userAuth := &auth.UserAuth{ 63 Username: gitlabUserName, 64 ApiToken: "test", 65 } 66 67 authServer := &auth.AuthServer{ 68 URL: server.URL, 69 Users: []*auth.UserAuth{userAuth}, 70 } 71 // Gitlab provider that we want to test 72 git := gits.NewGitCLI() 73 provider, _ := gits.WithGitlabClient(authServer, userAuth, client, git) 74 75 return mux, server, provider.(*gits.GitlabProvider) 76 } 77 78 func configureGitlabMock(suite *GitlabProviderSuite, mux *http.ServeMux) { 79 mux.HandleFunc("/api/v4/groups", func(w http.ResponseWriter, r *http.Request) { 80 src, err := ioutil.ReadFile("test_data/gitlab/groups.json") 81 82 suite.Require().Nil(err) 83 w.Write(src) 84 }) 85 86 mux.HandleFunc(fmt.Sprintf("/api/v4/groups/%s/projects", gitlabOrgName), func(w http.ResponseWriter, r *http.Request) { 87 src, err := ioutil.ReadFile("test_data/gitlab/group-projects.json") 88 89 suite.Require().Nil(err) 90 w.Write(src) 91 }) 92 93 mux.HandleFunc(fmt.Sprintf("/api/v4/users/%s/projects", gitlabUserName), func(w http.ResponseWriter, r *http.Request) { 94 src, err := ioutil.ReadFile("test_data/gitlab/user-projects.json") 95 96 suite.Require().Nil(err) 97 w.Write(src) 98 }) 99 100 gitlabRouter := util.Router{ 101 fmt.Sprintf("/api/v4/projects/%s", gitlabProjectID): util.MethodMap{ 102 "GET": "project.json", 103 }, 104 fmt.Sprintf("/api/v4/projects/%s/merge_requests/%d", gitlabProjectID, gitlabMergeRequestID): util.MethodMap{ 105 "GET": "merge-request.json", 106 "PUT": "update-merge-request.json", 107 }, 108 fmt.Sprintf("/api/v4/projects/%s/merge_requests", gitlabProjectID): util.MethodMap{ 109 "POST": "create-merge-request.json", 110 }, 111 fmt.Sprintf("/api/v4/projects/%s/members", gitlabProjectID): util.MethodMap{ 112 "POST": "add-project-member.json", 113 }, 114 fmt.Sprintf("/api/v4/users"): util.MethodMap{ 115 "GET": "list-users.json", 116 }, 117 } 118 for path, methodMap := range gitlabRouter { 119 mux.HandleFunc(path, util.GetMockAPIResponseFromFile("test_data/gitlab", methodMap)) 120 } 121 } 122 123 func (suite *GitlabProviderSuite) TestListOrganizations() { 124 orgs, err := suite.provider.ListOrganisations() 125 126 suite.Require().Nil(err) 127 suite.Require().Len(orgs, 1) 128 suite.Require().Equal(gitlabOrgName, orgs[0].Login) 129 } 130 131 func (suite *GitlabProviderSuite) TestListRepositories() { 132 require := suite.Require() 133 scenarios := []struct { 134 testDescription string 135 org string 136 expectedRepoName string 137 expectedSSHURL string 138 expectedHTTPSURL string 139 expectedHTMLURL string 140 }{ 141 {"List repositories for organization", 142 gitlabOrgName, 143 "orgproject", 144 "git@gitlab.com:testorg/orgproject.git", 145 "https://gitlab.com/testorg/orgproject.git", 146 "https://gitlab.com/testorg/orgproject"}, 147 {"List repositories without organization", 148 "", "userproject", 149 "git@gitlab.com:testperson/userproject.git", 150 "https://gitlab.com/testperson/userproject.git", 151 "https://gitlab.com/testperson/userproject"}, 152 } 153 154 for _, s := range scenarios { 155 repositories, err := suite.provider.ListRepositories(s.org) 156 require.Nil(err) 157 require.Len(repositories, 2) 158 require.Equal(s.expectedRepoName, repositories[0].Name) 159 require.Equal(s.expectedSSHURL, repositories[0].SSHURL) 160 require.Equal(s.expectedHTTPSURL, repositories[0].CloneURL) 161 require.Equal(s.expectedHTMLURL, repositories[0].HTMLURL) 162 } 163 } 164 165 func (suite *GitlabProviderSuite) TestGetRepository() { 166 repo, err := suite.provider.GetRepository(gitlabUserName, gitlabProjectName) 167 168 suite.Require().Nil(err) 169 suite.Require().NotNil(repo) 170 171 suite.Require().Equal(gitlabProjectName, repo.Name) 172 } 173 174 func (suite *GitlabProviderSuite) TestAddCollaborator() { 175 err := suite.provider.AddCollaborator(gitlabSecondUserName, gitlabOrgName, gitlabProjectName) 176 suite.Require().Nil(err) 177 } 178 179 func (suite *GitlabProviderSuite) TestListInvitations() { 180 invites, res, err := suite.provider.ListInvitations() 181 suite.Require().NotNil(invites) 182 suite.Require().NotNil(res) 183 suite.Require().Nil(err) 184 } 185 186 func (suite *GitlabProviderSuite) TestAcceptInvitations() { 187 res, err := suite.provider.AcceptInvitation(1) 188 suite.Require().NotNil(res) 189 suite.Require().Nil(err) 190 } 191 192 func (suite *GitlabProviderSuite) TestGetPullRequest() { 193 pr, err := suite.provider.GetPullRequest( 194 gitlabUserName, 195 &gits.GitRepository{Name: gitlabProjectName}, 196 gitlabMergeRequestID, 197 ) 198 199 suite.Require().Nil(err) 200 suite.Require().Equal(*pr.Number, gitlabMergeRequestID) 201 } 202 203 func (suite *GitlabProviderSuite) TestCreatePullRequest() { 204 205 args := gits.GitPullRequestArguments{ 206 GitRepository: &gits.GitRepository{Name: gitlabProjectName, Organisation: gitlabUserName}, 207 Head: "source_branch", 208 Base: "target_branch", 209 Title: "Update Test Pull Request", 210 } 211 pr, err := suite.provider.CreatePullRequest(&args) 212 213 //suite.Require().NotNil(pr) 214 suite.Require().Nil(err) 215 suite.Require().Equal(*pr.State, "merged") 216 suite.Require().Equal(*pr.Number, 3) 217 suite.Require().Equal(pr.Owner, gitlabUserName) 218 suite.Require().Equal(pr.Repo, gitlabProjectName) 219 suite.Require().Equal(pr.Author.Login, gitlabUserName) 220 } 221 222 func (suite *GitlabProviderSuite) TestUpdatePullRequest() { 223 args := gits.GitPullRequestArguments{ 224 GitRepository: &gits.GitRepository{Name: gitlabProjectName, Organisation: gitlabUserName}, 225 Head: "source_branch", 226 Base: "target_branch", 227 Title: "Update Test Pull Request", 228 } 229 pr, err := suite.provider.UpdatePullRequest( 230 &args, 231 gitlabMergeRequestID, 232 ) 233 234 suite.Require().Nil(err) 235 suite.Require().Equal(*pr.Number, gitlabMergeRequestID) 236 suite.Require().Equal(pr.Owner, gitlabUserName) 237 } 238 239 // In order for 'go test' to run this suite, we need to create 240 // a normal test function and pass our suite to suite.Run 241 func TestGitlabProviderSuite(t *testing.T) { 242 if testing.Short() { 243 t.Skip("skipping TestGitlabProviderSuite in short mode") 244 } else { 245 suite.Run(t, new(GitlabProviderSuite)) 246 } 247 }