Skip to content
Snippets Groups Projects
Select Git revision
  • 0f872f8b1aa240c78f3c1ce1717bd41da17b9cd5
  • main default protected
  • next
  • chore/update-static-data
  • renovate/main-redis-5.x
  • feat/gnupg
  • fix/36615b-branch-reuse-no-cache
  • chore/punycode
  • refactor/pin-new-value
  • feat/36219--git-x509-signing
  • feat/structured-logger
  • hotfix/39.264.1
  • feat/skip-dangling
  • gh-readonly-queue/next/pr-36034-7a061c4ca1024a19e2c295d773d9642625d1c2be
  • hotfix/39.238.3
  • refactor/gitlab-auto-approve
  • feat/template-strings
  • gh-readonly-queue/next/pr-35654-137d934242c784e0c45d4b957362214f0eade1d7
  • fix/32307-global-extends-merging
  • fix/32307-global-extends-repositories
  • gh-readonly-queue/next/pr-35009-046ebf7cb84ab859f7fefceb5fa53a54ce9736f8
  • 41.52.2
  • 41.52.1
  • 41.52.0
  • 41.51.2
  • 41.51.1
  • 41.51.0
  • 41.50.0
  • 41.49.1
  • 41.49.0
  • 41.48.1
  • 41.48.0
  • 41.47.1
  • 41.47.0
  • 41.46.8
  • 41.46.7
  • 41.46.6
  • 41.46.5
  • 41.46.4
  • 41.46.3
  • 41.46.2
41 results

detect.ts

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)
    }