github.com/goreleaser/goreleaser@v1.25.1/internal/client/git_test.go (about)

     1  package client
     2  
     3  import (
     4  	"os"
     5  	"strings"
     6  	"testing"
     7  
     8  	"github.com/charmbracelet/keygen"
     9  	"github.com/goreleaser/goreleaser/internal/testctx"
    10  	"github.com/goreleaser/goreleaser/internal/testlib"
    11  	"github.com/goreleaser/goreleaser/pkg/config"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestGitClient(t *testing.T) {
    16  	author := config.CommitAuthor{
    17  		Name:  "Foo",
    18  		Email: "foo@bar.com",
    19  	}
    20  
    21  	t.Run("full", func(t *testing.T) {
    22  		url := testlib.GitMakeBareRepository(t)
    23  		ctx := testctx.NewWithCfg(config.Project{
    24  			Dist: t.TempDir(),
    25  		})
    26  		repo := Repo{
    27  			GitURL:     url,
    28  			PrivateKey: testlib.MakeNewSSHKey(t, ""),
    29  			Name:       "test1",
    30  		}
    31  		cli := NewGitUploadClient(repo.Branch)
    32  		require.NoError(t, cli.CreateFiles(
    33  			ctx,
    34  			author,
    35  			repo,
    36  			"hey test",
    37  			[]RepoFile{
    38  				{
    39  					Content: []byte("fake content"),
    40  					Path:    "fake.txt",
    41  				},
    42  				{
    43  					Content: []byte("fake2 content"),
    44  					Path:    "fake2.txt",
    45  				},
    46  				{
    47  					Content: []byte("fake content updated"),
    48  					Path:    "fake.txt",
    49  				},
    50  			},
    51  		))
    52  		require.Equal(t, "fake content updated", string(testlib.CatFileFromBareRepository(t, url, "fake.txt")))
    53  		require.Equal(t, "fake2 content", string(testlib.CatFileFromBareRepository(t, url, "fake2.txt")))
    54  	})
    55  
    56  	t.Run("with new branch", func(t *testing.T) {
    57  		url := testlib.GitMakeBareRepository(t)
    58  		ctx := testctx.NewWithCfg(config.Project{
    59  			Dist: t.TempDir(),
    60  		})
    61  		repo := Repo{
    62  			GitURL:     url,
    63  			PrivateKey: testlib.MakeNewSSHKey(t, ""),
    64  			Name:       "test1",
    65  			Branch:     "new-branch",
    66  		}
    67  		cli := NewGitUploadClient(repo.Branch)
    68  		require.NoError(t, cli.CreateFiles(
    69  			ctx,
    70  			author,
    71  			repo,
    72  			"hey test",
    73  			[]RepoFile{
    74  				{
    75  					Content: []byte("fake content"),
    76  					Path:    "fake.txt",
    77  				},
    78  				{
    79  					Content: []byte("fake2 content"),
    80  					Path:    "fake2.txt",
    81  				},
    82  				{
    83  					Content: []byte("fake content updated"),
    84  					Path:    "fake.txt",
    85  				},
    86  			},
    87  		))
    88  		for path, content := range map[string]string{
    89  			"fake.txt":  "fake content updated",
    90  			"fake2.txt": "fake2 content",
    91  		} {
    92  			require.Equal(
    93  				t, content,
    94  				string(testlib.CatFileFromBareRepositoryOnBranch(
    95  					t, url,
    96  					repo.Branch,
    97  					path,
    98  				)),
    99  			)
   100  		}
   101  	})
   102  
   103  	t.Run("no repo name", func(t *testing.T) {
   104  		url := testlib.GitMakeBareRepository(t)
   105  		ctx := testctx.NewWithCfg(config.Project{
   106  			Dist: t.TempDir(),
   107  		})
   108  		repo := Repo{
   109  			GitURL:     url,
   110  			PrivateKey: testlib.MakeNewSSHKey(t, ""),
   111  		}
   112  		cli := NewGitUploadClient(repo.Branch)
   113  		require.NoError(t, cli.CreateFile(
   114  			ctx,
   115  			author,
   116  			repo,
   117  			[]byte("fake content"),
   118  			"fake.txt",
   119  			"hey test",
   120  		))
   121  		require.NoError(t, cli.CreateFile(
   122  			ctx,
   123  			author,
   124  			repo,
   125  			[]byte("fake content 2"),
   126  			"fake.txt",
   127  			"hey test 2",
   128  		))
   129  		require.Equal(t, "fake content 2", string(testlib.CatFileFromBareRepository(t, url, "fake.txt")))
   130  	})
   131  	t.Run("bad url", func(t *testing.T) {
   132  		ctx := testctx.NewWithCfg(config.Project{
   133  			Dist: t.TempDir(),
   134  		})
   135  		repo := Repo{
   136  			GitURL: "{{ .Nope }}",
   137  		}
   138  		cli := NewGitUploadClient(repo.Branch)
   139  		testlib.RequireTemplateError(t, cli.CreateFile(
   140  			ctx,
   141  			author,
   142  			repo,
   143  			[]byte{},
   144  			"filename",
   145  			"msg",
   146  		))
   147  	})
   148  	t.Run("clone fail", func(t *testing.T) {
   149  		ctx := testctx.NewWithCfg(config.Project{
   150  			Dist: t.TempDir(),
   151  		})
   152  		repo := Repo{
   153  			GitURL:     "git@github.com:nope/nopenopenopenope",
   154  			PrivateKey: testlib.MakeNewSSHKey(t, ""),
   155  		}
   156  		cli := NewGitUploadClient(repo.Branch)
   157  		err := cli.CreateFile(
   158  			ctx,
   159  			author,
   160  			repo,
   161  			[]byte{},
   162  			"filename",
   163  			"msg",
   164  		)
   165  		require.ErrorContains(t, err, "failed to clone")
   166  	})
   167  	t.Run("bad ssh cmd", func(t *testing.T) {
   168  		ctx := testctx.NewWithCfg(config.Project{
   169  			Dist: t.TempDir(),
   170  		})
   171  		repo := Repo{
   172  			GitURL:        testlib.GitMakeBareRepository(t),
   173  			PrivateKey:    testlib.MakeNewSSHKey(t, ""),
   174  			GitSSHCommand: "{{.Foo}}",
   175  		}
   176  		cli := NewGitUploadClient(repo.Branch)
   177  		testlib.RequireTemplateError(t, cli.CreateFile(
   178  			ctx,
   179  			author,
   180  			repo,
   181  			[]byte{},
   182  			"filename",
   183  			"msg",
   184  		))
   185  	})
   186  	t.Run("empty url", func(t *testing.T) {
   187  		ctx := testctx.NewWithCfg(config.Project{
   188  			Dist: t.TempDir(),
   189  		})
   190  		repo := Repo{}
   191  		cli := NewGitUploadClient(repo.Branch)
   192  		require.EqualError(t, cli.CreateFile(
   193  			ctx,
   194  			author,
   195  			repo,
   196  			[]byte{},
   197  			"filename",
   198  			"msg",
   199  		), "url is empty")
   200  	})
   201  	t.Run("bad ssh cmd", func(t *testing.T) {
   202  		ctx := testctx.NewWithCfg(config.Project{
   203  			Dist: t.TempDir(),
   204  		})
   205  		repo := Repo{
   206  			GitURL:     testlib.GitMakeBareRepository(t),
   207  			PrivateKey: "{{.Foo}}",
   208  		}
   209  		cli := NewGitUploadClient(repo.Branch)
   210  		testlib.RequireTemplateError(t, cli.CreateFile(
   211  			ctx,
   212  			author,
   213  			repo,
   214  			[]byte{},
   215  			"filename",
   216  			"msg",
   217  		))
   218  	})
   219  	t.Run("bad key path", func(t *testing.T) {
   220  		ctx := testctx.NewWithCfg(config.Project{
   221  			Dist: t.TempDir(),
   222  		})
   223  		repo := Repo{
   224  			GitURL:     testlib.GitMakeBareRepository(t),
   225  			PrivateKey: "./nope",
   226  		}
   227  		cli := NewGitUploadClient(repo.Branch)
   228  		require.Error(t, cli.CreateFile(
   229  			ctx,
   230  			author,
   231  			repo,
   232  			[]byte{},
   233  			"filename",
   234  			"msg",
   235  		))
   236  	})
   237  }
   238  
   239  func TestKeyPath(t *testing.T) {
   240  	t.Run("with valid path", func(t *testing.T) {
   241  		path := testlib.MakeNewSSHKey(t, "")
   242  		result, err := keyPath(path)
   243  		require.NoError(t, err)
   244  		require.Equal(t, path, result)
   245  	})
   246  	t.Run("with invalid path", func(t *testing.T) {
   247  		result, err := keyPath("testdata/nope")
   248  		require.ErrorIs(t, err, os.ErrNotExist)
   249  		require.Equal(t, "", result)
   250  	})
   251  
   252  	t.Run("with password protected key path", func(t *testing.T) {
   253  		path := testlib.MakeNewSSHKey(t, "pwd")
   254  		bts, err := os.ReadFile(path)
   255  		require.NoError(t, err)
   256  
   257  		result, err := keyPath(string(bts))
   258  		require.EqualError(t, err, "git: key is password-protected")
   259  		require.Empty(t, result)
   260  	})
   261  
   262  	t.Run("with key", func(t *testing.T) {
   263  		for _, algo := range []keygen.KeyType{keygen.Ed25519, keygen.RSA} {
   264  			t.Run(string(algo), func(t *testing.T) {
   265  				path := testlib.MakeNewSSHKeyType(t, "", algo)
   266  				bts, err := os.ReadFile(path)
   267  				require.NoError(t, err)
   268  
   269  				result, err := keyPath(string(bts))
   270  				require.NoError(t, err)
   271  
   272  				resultbts, err := os.ReadFile(result)
   273  				require.NoError(t, err)
   274  				require.Equal(t, string(bts), string(resultbts))
   275  			})
   276  		}
   277  	})
   278  	t.Run("empty", func(t *testing.T) {
   279  		result, err := keyPath("")
   280  		require.EqualError(t, err, `private_key is empty`)
   281  		require.Equal(t, "", result)
   282  	})
   283  	t.Run("with invalid EOF", func(t *testing.T) {
   284  		path := testlib.MakeNewSSHKey(t, "")
   285  		bts, err := os.ReadFile(path)
   286  		require.NoError(t, err)
   287  
   288  		result, err := keyPath(strings.TrimSpace(string(bts)))
   289  		require.NoError(t, err)
   290  
   291  		resultbts, err := os.ReadFile(result)
   292  		require.NoError(t, err)
   293  		require.Equal(t, string(bts), string(resultbts))
   294  	})
   295  }
   296  
   297  func TestRepoFromURL(t *testing.T) {
   298  	for k, v := range map[string]string{
   299  		"goreleaser": "git@github.com:goreleaser/goreleaser.git",
   300  		"nfpm":       "https://github.com/goreleaser/nfpm",
   301  		"test":       "https://myserver.git/foo/test.git",
   302  	} {
   303  		t.Run(k, func(t *testing.T) {
   304  			require.Equal(t, k, nameFromURL(v))
   305  		})
   306  	}
   307  }