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  }