github.com/pdmccormick/importable-docker-buildx@v0.0.0-20240426161518-e47091289030/util/gitutil/gitutil_test.go (about)

     1  package gitutil
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/require"
     7  )
     8  
     9  func TestGit(t *testing.T) {
    10  	c, err := New()
    11  	require.NoError(t, err)
    12  
    13  	out, err := c.run("status")
    14  	require.NoError(t, err)
    15  	require.NotEmpty(t, out)
    16  
    17  	out, err = c.clean(c.run("not-exist"))
    18  	require.Error(t, err)
    19  	require.Empty(t, out)
    20  	require.Equal(t, "git: 'not-exist' is not a git command. See 'git --help'.", err.Error())
    21  }
    22  
    23  func TestGitFullCommit(t *testing.T) {
    24  	Mktmp(t)
    25  	c, err := New()
    26  	require.NoError(t, err)
    27  
    28  	GitInit(c, t)
    29  	GitCommit(c, t, "bar")
    30  
    31  	out, err := c.FullCommit()
    32  	require.NoError(t, err)
    33  	require.Equal(t, 40, len(out))
    34  }
    35  
    36  func TestGitShortCommit(t *testing.T) {
    37  	Mktmp(t)
    38  	c, err := New()
    39  	require.NoError(t, err)
    40  
    41  	GitInit(c, t)
    42  	GitCommit(c, t, "bar")
    43  
    44  	out, err := c.ShortCommit()
    45  	require.NoError(t, err)
    46  	require.Equal(t, 7, len(out))
    47  }
    48  
    49  func TestGitFullCommitErr(t *testing.T) {
    50  	Mktmp(t)
    51  	c, err := New()
    52  	require.NoError(t, err)
    53  
    54  	GitInit(c, t)
    55  
    56  	_, err = c.FullCommit()
    57  	require.Error(t, err)
    58  	require.True(t, IsUnknownRevision(err))
    59  	require.False(t, IsAmbiguousArgument(err))
    60  }
    61  
    62  func TestGitShortCommitErr(t *testing.T) {
    63  	Mktmp(t)
    64  	c, err := New()
    65  	require.NoError(t, err)
    66  
    67  	GitInit(c, t)
    68  
    69  	_, err = c.ShortCommit()
    70  	require.Error(t, err)
    71  	require.True(t, IsUnknownRevision(err))
    72  	require.False(t, IsAmbiguousArgument(err))
    73  }
    74  
    75  func TestGitTagsPointsAt(t *testing.T) {
    76  	Mktmp(t)
    77  	c, err := New()
    78  	require.NoError(t, err)
    79  
    80  	GitInit(c, t)
    81  	GitCommit(c, t, "bar")
    82  	GitTag(c, t, "v0.8.0")
    83  	GitCommit(c, t, "foo")
    84  	GitTag(c, t, "v0.9.0")
    85  
    86  	out, err := c.clean(c.run("tag", "--points-at", "HEAD", "--sort", "-version:creatordate"))
    87  	require.NoError(t, err)
    88  	require.Equal(t, "v0.9.0", out)
    89  }
    90  
    91  func TestGitDescribeTags(t *testing.T) {
    92  	Mktmp(t)
    93  	c, err := New()
    94  	require.NoError(t, err)
    95  
    96  	GitInit(c, t)
    97  	GitCommit(c, t, "bar")
    98  	GitTag(c, t, "v0.8.0")
    99  	GitCommit(c, t, "foo")
   100  	GitTag(c, t, "v0.9.0")
   101  
   102  	out, err := c.clean(c.run("describe", "--tags", "--abbrev=0"))
   103  	require.NoError(t, err)
   104  	require.Equal(t, "v0.9.0", out)
   105  }
   106  
   107  func TestGitRemoteURL(t *testing.T) {
   108  	type remote struct {
   109  		name     string
   110  		url      string
   111  		tracking string
   112  	}
   113  
   114  	cases := []struct {
   115  		name     string
   116  		remotes  []remote
   117  		expected string
   118  		fail     bool
   119  	}{
   120  		{
   121  			name:    "no remotes",
   122  			remotes: []remote{},
   123  			fail:    true,
   124  		},
   125  		{
   126  			name: "origin",
   127  			remotes: []remote{
   128  				{
   129  					name: "origin",
   130  					url:  "git@github.com:crazy-max/buildx.git",
   131  				},
   132  			},
   133  			expected: "git@github.com:crazy-max/buildx.git",
   134  		},
   135  		{
   136  			name: "upstream",
   137  			remotes: []remote{
   138  				{
   139  					name: "upstream",
   140  					url:  "git@github.com:docker/buildx.git",
   141  				},
   142  			},
   143  			expected: "git@github.com:docker/buildx.git",
   144  		},
   145  		{
   146  			name: "origin and upstream",
   147  			remotes: []remote{
   148  				{
   149  					name: "upstream",
   150  					url:  "git@github.com:docker/buildx.git",
   151  				},
   152  				{
   153  					name: "origin",
   154  					url:  "git@github.com:crazy-max/buildx.git",
   155  				},
   156  			},
   157  			expected: "git@github.com:crazy-max/buildx.git",
   158  		},
   159  		{
   160  			name: "not found",
   161  			remotes: []remote{
   162  				{
   163  					name: "foo",
   164  					url:  "git@github.com:docker/buildx.git",
   165  				},
   166  			},
   167  			fail: true,
   168  		},
   169  		{
   170  			name: "single tracking branch",
   171  			remotes: []remote{
   172  				{
   173  					name:     "foo",
   174  					url:      "https://github.com/tonistiigi/buildx.git",
   175  					tracking: "master",
   176  				},
   177  			},
   178  			expected: "https://github.com/tonistiigi/buildx.git",
   179  		},
   180  		{
   181  			name: "fork tracking branch",
   182  			remotes: []remote{
   183  				{
   184  					name: "origin",
   185  					url:  "git@github.com:crazy-max/buildx.git",
   186  				},
   187  				{
   188  					name:     "foobranch",
   189  					url:      "https://github.com/tonistiigi/buildx.git",
   190  					tracking: "master",
   191  				},
   192  				{
   193  					name: "crazymax",
   194  					url:  "git@github.com:crazy-max/buildx.git",
   195  				},
   196  			},
   197  			expected: "https://github.com/tonistiigi/buildx.git",
   198  		},
   199  	}
   200  	for _, tt := range cases {
   201  		tt := tt
   202  		t.Run(tt.name, func(t *testing.T) {
   203  			Mktmp(t)
   204  			c, err := New()
   205  			require.NoError(t, err)
   206  
   207  			GitInit(c, t)
   208  			GitCommit(c, t, "initial commit")
   209  			for _, r := range tt.remotes {
   210  				GitSetRemote(c, t, r.name, r.url)
   211  				if r.tracking != "" {
   212  					GitSetMainUpstream(c, t, r.name, r.tracking)
   213  				}
   214  			}
   215  
   216  			ru, err := c.RemoteURL()
   217  			if tt.fail {
   218  				require.Error(t, err)
   219  				return
   220  			}
   221  			require.NoError(t, err)
   222  			require.Equal(t, tt.expected, ru)
   223  		})
   224  	}
   225  }
   226  
   227  func TestStripCredentials(t *testing.T) {
   228  	cases := []struct {
   229  		name string
   230  		url  string
   231  		want string
   232  	}{
   233  		{
   234  			name: "non-blank Password",
   235  			url:  "https://user:password@host.tld/this:that",
   236  			want: "https://host.tld/this:that",
   237  		},
   238  		{
   239  			name: "blank Password",
   240  			url:  "https://user@host.tld/this:that",
   241  			want: "https://host.tld/this:that",
   242  		},
   243  		{
   244  			name: "blank Username",
   245  			url:  "https://:password@host.tld/this:that",
   246  			want: "https://host.tld/this:that",
   247  		},
   248  		{
   249  			name: "blank Username, blank Password",
   250  			url:  "https://host.tld/this:that",
   251  			want: "https://host.tld/this:that",
   252  		},
   253  		{
   254  			name: "invalid URL",
   255  			url:  "1https://foo.com",
   256  			want: "1https://foo.com",
   257  		},
   258  	}
   259  	for _, tt := range cases {
   260  		tt := tt
   261  		t.Run(tt.name, func(t *testing.T) {
   262  			if g, w := stripCredentials(tt.url), tt.want; g != w {
   263  				t.Fatalf("got: %q\nwant: %q", g, w)
   264  			}
   265  		})
   266  	}
   267  }