Skip to content
Snippets Groups Projects
Select Git revision
  • cd36f67a6efb995f5accf762f715a80b7ae5add0
  • master default protected
  • v1.17.0
  • v1.16.0
  • v1.15.0
  • v1.14.0
  • v1.13.0
  • v1.12.1
  • v1.12.0
  • v1.11.0
  • v1.10.0
  • v1.9.0
  • v1.8.0
  • v1.7.0
  • v1.6.0
  • v1.5.1
  • v1.5.0
  • v1.4.1
  • v1.4.0
  • v1.3.0
  • v1.2.0
  • v1.1.1
22 results

gitlab_test.go

Blame
  • gitlab_test.go 5.22 KiB
    package provider
    
    import (
    	"encoding/json"
    	"fmt"
    	"net/http"
    	"net/http/httptest"
    	"strconv"
    	"testing"
    
    	"github.com/go-semantic-release/semantic-release/v2/pkg/provider"
    	"github.com/go-semantic-release/semantic-release/v2/pkg/semrel"
    	"github.com/stretchr/testify/require"
    	"github.com/xanzy/go-gitlab"
    )
    
    func TestNewGitlabRepository(t *testing.T) {
    	require := require.New(t)
    
    	var repo *GitLabRepository
    	repo = &GitLabRepository{}
    	err := repo.Init(map[string]string{})
    	require.EqualError(err, "gitlab token missing")
    
    	repo = &GitLabRepository{}
    	err = repo.Init(map[string]string{
    		"token":            "token",
    		"gitlab_projectid": "1",
    	})
    	require.NoError(err)
    
    	repo = &GitLabRepository{}
    	err = repo.Init(map[string]string{
    		"gitlab_baseurl":   "https://mygitlab.com",
    		"token":            "token",
    		"gitlab_projectid": "1",
    	})
    	require.NoError(err)
    	require.Equal("https://mygitlab.com/api/v4/", repo.client.BaseURL().String(), "invalid custom instance initialization")
    }
    
    func createGitlabCommit(sha, message string) *gitlab.Commit {
    	return &gitlab.Commit{ID: sha, Message: message}
    }
    
    func createGitlabTag(name, sha string) *gitlab.Tag {
    	return &gitlab.Tag{Name: name, Commit: &gitlab.Commit{
    		ID: sha,
    	}}
    }
    
    var (
    	GITLAB_PROJECT_ID    = 12324322
    	GITLAB_DEFAULTBRANCH = "master"
    	GITLAB_PROJECT       = gitlab.Project{DefaultBranch: GITLAB_DEFAULTBRANCH, Visibility: gitlab.PrivateVisibility, ID: GITLAB_PROJECT_ID}
    	GITLAB_COMMITS       = []*gitlab.Commit{
    		createGitlabCommit("abcd", "feat(app): new feature"),
    		createGitlabCommit("dcba", "Fix: bug"),
    		createGitlabCommit("cdba", "Initial commit"),
    		createGitlabCommit("efcd", "chore: break\nBREAKING CHANGE: breaks everything"),
    	}
    	GITLAB_TAGS = []*gitlab.Tag{
    		createGitlabTag("test-tag", "deadbeef"),
    		createGitlabTag("v1.0.0", "deadbeef"),
    		createGitlabTag("v2.0.0", "deadbeef"),
    		createGitlabTag("v2.1.0-beta", "deadbeef"),
    		createGitlabTag("v3.0.0-beta.2", "deadbeef"),
    		createGitlabTag("v3.0.0-beta.1", "deadbeef"),
    		createGitlabTag("2020.04.19", "deadbeef"),
    	}
    )
    
    //nolint:errcheck
    func GitlabHandler(w http.ResponseWriter, r *http.Request) {
    	// Rate Limit headers
    	if r.Method == "GET" && r.URL.Path == "/api/v4/" {
    		json.NewEncoder(w).Encode(struct{}{})
    		return
    	}
    
    	if r.Header.Get("PRIVATE-TOKEN") == "" {
    		http.Error(w, "unauthorized", http.StatusUnauthorized)
    		return
    	}
    
    	if r.Method == "GET" && r.URL.Path == fmt.Sprintf("/api/v4/projects/%d", GITLAB_PROJECT_ID) {
    		json.NewEncoder(w).Encode(GITLAB_PROJECT)
    		return
    	}
    
    	if r.Method == "GET" && r.URL.Path == fmt.Sprintf("/api/v4/projects/%d/repository/commits", GITLAB_PROJECT_ID) {
    		json.NewEncoder(w).Encode(GITLAB_COMMITS)
    		return
    	}
    
    	if r.Method == "GET" && r.URL.Path == fmt.Sprintf("/api/v4/projects/%d/repository/tags", GITLAB_PROJECT_ID) {
    		json.NewEncoder(w).Encode(GITLAB_TAGS)
    		return
    	}
    
    	if r.Method == "POST" && r.URL.Path == fmt.Sprintf("/api/v4/projects/%d/releases", GITLAB_PROJECT_ID) {
    		var data map[string]string
    		json.NewDecoder(r.Body).Decode(&data)
    		r.Body.Close()
    		if data["tag_name"] != "v2.0.0" {
    			http.Error(w, "invalid tag name", http.StatusBadRequest)
    			return
    		}
    		fmt.Fprint(w, "{}")
    		return
    	}
    
    	http.Error(w, "invalid route", http.StatusNotImplemented)
    }
    
    func getNewGitlabTestRepo(t *testing.T) (*GitLabRepository, *httptest.Server) {
    	ts := httptest.NewServer(http.HandlerFunc(GitlabHandler))
    	repo := &GitLabRepository{}
    	err := repo.Init(map[string]string{
    		"gitlab_baseurl":   ts.URL,
    		"token":            "gitlab-examples-ci",
    		"gitlab_branch":    "",
    		"gitlab_projectid": strconv.Itoa(GITLAB_PROJECT_ID),
    	})
    	require.NoError(t, err)
    
    	return repo, ts
    }
    
    func TestGitlabGetInfo(t *testing.T) {
    	repo, ts := getNewGitlabTestRepo(t)
    	defer ts.Close()
    	repoInfo, err := repo.GetInfo()
    	require.NoError(t, err)
    	require.Equal(t, GITLAB_DEFAULTBRANCH, repoInfo.DefaultBranch)
    	require.True(t, repoInfo.Private)
    }
    
    func TestGitlabGetCommits(t *testing.T) {
    	repo, ts := getNewGitlabTestRepo(t)
    	defer ts.Close()
    	commits, err := repo.GetCommits("", "")
    	require.NoError(t, err)
    	require.Len(t, commits, 4)
    
    	for i, c := range commits {
    		require.Equal(t, c.SHA, GITLAB_COMMITS[i].ID)
    		require.Equal(t, c.RawMessage, GITLAB_COMMITS[i].Message)
    	}
    }
    
    func TestGitlabGetReleases(t *testing.T) {
    	repo, ts := getNewGitlabTestRepo(t)
    	defer ts.Close()
    
    	testCases := []struct {
    		vrange          string
    		re              string
    		expectedSHA     string
    		expectedVersion string
    	}{
    		{"", "", "deadbeef", "2020.4.19"},
    		{"", "^v[0-9]*", "deadbeef", "2.0.0"},
    		{"2-beta", "", "deadbeef", "2.1.0-beta"},
    		{"3-beta", "", "deadbeef", "3.0.0-beta.2"},
    		{"4-beta", "", "deadbeef", "4.0.0-beta"},
    	}
    
    	for _, tc := range testCases {
    		t.Run(fmt.Sprintf("VersionRange: %s, RE: %s", tc.vrange, tc.re), func(t *testing.T) {
    			releases, err := repo.GetReleases(tc.re)
    			require.NoError(t, err)
    			release, err := semrel.GetLatestReleaseFromReleases(releases, tc.vrange)
    			require.NoError(t, err)
    			require.Equal(t, tc.expectedSHA, release.SHA)
    			require.Equal(t, tc.expectedVersion, release.Version)
    		})
    	}
    }
    
    func TestGitlabCreateRelease(t *testing.T) {
    	repo, ts := getNewGitlabTestRepo(t)
    	defer ts.Close()
    	err := repo.CreateRelease(&provider.CreateReleaseConfig{NewVersion: "2.0.0", SHA: "deadbeef"})
    	require.NoError(t, err)
    }