Skip to content
Snippets Groups Projects
Select Git revision
  • fa5822551fabddf615cbe0d10f77712c65a726be
  • main default protected
  • feat/gnupg
  • next
  • fix/36615b-branch-reuse-no-cache
  • renovate/main-redis-5.x
  • 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
  • gh-readonly-queue/next/pr-35009-9d5e583b7d7251148ab0d11ee8dd38149618d162
  • 41.43.5
  • 41.43.4
  • 41.43.3
  • 41.43.2
  • 41.43.1
  • 41.43.0
  • 41.42.12
  • 41.42.11
  • 41.42.10
  • 41.42.9
  • 41.42.8
  • 41.42.7
  • 41.42.6
  • 41.42.5
  • 41.42.4
  • 41.42.3
  • 41.42.2
  • 41.42.1
  • 41.42.0
  • 41.41.0
41 results

status-checks.spec.ts

Blame
  • git_test.go 4.97 KiB
    package provider
    
    import (
    	"fmt"
    	"io/ioutil"
    	"strings"
    	"testing"
    	"time"
    
    	"github.com/go-git/go-git/v5"
    	"github.com/go-git/go-git/v5/config"
    	"github.com/go-git/go-git/v5/plumbing"
    	"github.com/go-git/go-git/v5/plumbing/object"
    	"github.com/go-git/go-git/v5/plumbing/transport/http"
    	"github.com/go-semantic-release/semantic-release/v2/pkg/provider"
    	"github.com/stretchr/testify/require"
    )
    
    var testGitPath string
    
    func TestGit(t *testing.T) {
    	var err error
    	testGitPath, err = setupRepo()
    	require.NoError(t, err)
    	t.Run("NewRepository", newRepository)
    	t.Run("GetInfo", getInfo)
    	t.Run("GetReleases", getReleases)
    	t.Run("GetCommits", getCommits)
    	t.Run("CreateRelease", createRelease)
    }
    
    func newRepository(t *testing.T) {
    	require := require.New(t)
    	repo := &Repository{}
    	err := repo.Init(map[string]string{})
    	require.EqualError(err, "repository does not exist")
    
    	repo = &Repository{}
    	err = repo.Init(map[string]string{
    		"git_path":       testGitPath,
    		"default_branch": "development",
    		"tagger_name":    "test",
    		"tagger_email":   "test@test.com",
    		"auth":           "basic",
    		"auth_username":  "test",
    		"auth_password":  "test",
    	})
    
    	require.NoError(err)
    	require.Equal("development", repo.defaultBranch)
    	require.Equal("test", repo.taggerName)
    	require.Equal("test@test.com", repo.taggerEmail)
    	require.NotNil(repo.auth)
    }
    
    func setupRepo() (string, error) {
    	dir, err := ioutil.TempDir("", "provider-git")
    	if err != nil {
    		return "", err
    	}
    	repo, err := git.PlainInit(dir, false)
    	if err != nil {
    		return "", err
    	}
    
    	_, err = repo.CreateRemote(&config.RemoteConfig{
    		Name: "origin",
    		URLs: []string{"http://localhost:3000/test/test.git"},
    	})
    	if err != nil {
    		return "", err
    	}
    	w, err := repo.Worktree()
    	if err != nil {
    		return "", err
    	}
    
    	author := &object.Signature{
    		Name:  "test",
    		Email: "test@test.com",
    		When:  time.Now(),
    	}
    	versionCount := 0
    	betaCount := 1
    	for i := 0; i < 100; i++ {
    		commit, err := w.Commit(fmt.Sprintf("feat: commit %d", i), &git.CommitOptions{Author: author})
    		if err != nil {
    			return "", err
    		}
    		if i%10 == 0 {
    			if _, err := repo.CreateTag(fmt.Sprintf("v1.%d.0", versionCount), commit, nil); err != nil {
    				return "", err
    			}
    			versionCount++
    		}
    		if i%5 == 0 {
    			if _, err := repo.CreateTag(fmt.Sprintf("v2.0.0-beta.%d", betaCount), commit, nil); err != nil {
    				return "", err
    			}
    			betaCount++
    		}
    	}
    
    	err = w.Checkout(&git.CheckoutOptions{
    		Branch: plumbing.NewBranchReferenceName("new-fix"),
    		Create: true,
    	})
    	if err != nil {
    		return "", err
    	}
    
    	if _, err = w.Commit("fix: error", &git.CommitOptions{Author: author}); err != nil {
    		return "", err
    	}
    	if err = w.Checkout(&git.CheckoutOptions{Branch: plumbing.NewBranchReferenceName("master")}); err != nil {
    		return "", err
    	}
    
    	err = repo.Push(&git.PushOptions{
    		RemoteName: "origin",
    		RefSpecs: []config.RefSpec{
    			"refs/heads/*:refs/heads/*",
    			"refs/tags/*:refs/tags/*",
    		},
    		Auth: &http.BasicAuth{
    			Username: "test",
    			Password: "test",
    		},
    		Force: true,
    	})
    	if err != nil {
    		return "", err
    	}
    	return dir, nil
    }
    
    func createRepo() (*Repository, error) {
    	repo := &Repository{}
    	err := repo.Init(map[string]string{
    		"git_path":      testGitPath,
    		"auth":          "basic",
    		"auth_username": "test",
    		"auth_password": "test",
    	})
    	if err != nil {
    		return nil, err
    	}
    
    	return repo, nil
    }
    
    func getInfo(t *testing.T) {
    	require := require.New(t)
    	repo, err := createRepo()
    	require.NoError(err)
    	repoInfo, err := repo.GetInfo()
    	require.NoError(err)
    	require.Equal("master", repoInfo.DefaultBranch)
    }
    
    func getCommits(t *testing.T) {
    	require := require.New(t)
    	repo, err := createRepo()
    	require.NoError(err)
    	commits, err := repo.GetCommits("", "master")
    	require.NoError(err)
    	require.Len(commits, 100)
    
    	for _, c := range commits {
    		require.True(strings.HasPrefix(c.RawMessage, "feat: commit"))
    	}
    }
    
    func createRelease(t *testing.T) {
    	require := require.New(t)
    	repo, err := createRepo()
    	require.NoError(err)
    
    	gRepo, err := git.PlainOpen(testGitPath)
    	require.NoError(err)
    	head, err := gRepo.Head()
    	require.NoError(err)
    
    	testCases := []struct {
    		version, sha, changelog string
    	}{
    		{
    			version:   "2.0.0",
    			sha:       head.Hash().String(),
    			changelog: "new feature",
    		},
    		{
    			version:   "3.0.0",
    			sha:       "master",
    			changelog: "breaking change",
    		},
    	}
    
    	for _, testCase := range testCases {
    		err = repo.CreateRelease(&provider.CreateReleaseConfig{
    			NewVersion: testCase.version,
    			SHA:        testCase.sha,
    			Changelog:  testCase.changelog,
    		})
    		require.NoError(err)
    
    		tagRef, err := gRepo.Tag("v" + testCase.version)
    		require.NoError(err)
    
    		tagObj, err := gRepo.TagObject(tagRef.Hash())
    		require.NoError(err)
    
    		require.Equal(testCase.changelog+"\n", tagObj.Message)
    	}
    }
    
    func getReleases(t *testing.T) {
    	require := require.New(t)
    	repo, err := createRepo()
    	require.NoError(err)
    
    	releases, err := repo.GetReleases("")
    	require.NoError(err)
    	require.Len(releases, 30)
    
    	releases, err = repo.GetReleases("^v2")
    	require.NoError(err)
    	require.Len(releases, 20)
    }