github.com/triarius/goreleaser@v1.12.5/internal/client/github_test.go (about)

     1  package client
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"os"
     9  	"testing"
    10  	"text/template"
    11  
    12  	"github.com/triarius/goreleaser/internal/artifact"
    13  	"github.com/triarius/goreleaser/pkg/config"
    14  	"github.com/triarius/goreleaser/pkg/context"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func TestNewGitHubClient(t *testing.T) {
    19  	t.Run("good urls", func(t *testing.T) {
    20  		githubURL := "https://github.mycompany.com"
    21  		ctx := context.New(config.Project{
    22  			GitHubURLs: config.GitHubURLs{
    23  				API:    githubURL + "/api",
    24  				Upload: githubURL + "/upload",
    25  			},
    26  		})
    27  
    28  		client, err := NewGitHub(ctx, ctx.Token)
    29  		require.NoError(t, err)
    30  
    31  		githubClient, ok := client.(*githubClient)
    32  		require.True(t, ok)
    33  		require.Equal(t, githubURL+"/api", githubClient.client.BaseURL.String())
    34  		require.Equal(t, githubURL+"/upload", githubClient.client.UploadURL.String())
    35  	})
    36  
    37  	t.Run("bad api url", func(t *testing.T) {
    38  		ctx := context.New(config.Project{
    39  			GitHubURLs: config.GitHubURLs{
    40  				API:    "://github.mycompany.com/api",
    41  				Upload: "https://github.mycompany.com/upload",
    42  			},
    43  		})
    44  		_, err := NewGitHub(ctx, ctx.Token)
    45  
    46  		require.EqualError(t, err, `parse "://github.mycompany.com/api": missing protocol scheme`)
    47  	})
    48  
    49  	t.Run("bad upload url", func(t *testing.T) {
    50  		ctx := context.New(config.Project{
    51  			GitHubURLs: config.GitHubURLs{
    52  				API:    "https://github.mycompany.com/api",
    53  				Upload: "not a url:4994",
    54  			},
    55  		})
    56  		_, err := NewGitHub(ctx, ctx.Token)
    57  
    58  		require.EqualError(t, err, `parse "not a url:4994": first path segment in URL cannot contain colon`)
    59  	})
    60  
    61  	t.Run("template", func(t *testing.T) {
    62  		githubURL := "https://github.mycompany.com"
    63  		ctx := context.New(config.Project{
    64  			Env: []string{
    65  				fmt.Sprintf("GORELEASER_TEST_GITHUB_URLS_API=%s/api", githubURL),
    66  				fmt.Sprintf("GORELEASER_TEST_GITHUB_URLS_UPLOAD=%s/upload", githubURL),
    67  			},
    68  			GitHubURLs: config.GitHubURLs{
    69  				API:    "{{ .Env.GORELEASER_TEST_GITHUB_URLS_API }}",
    70  				Upload: "{{ .Env.GORELEASER_TEST_GITHUB_URLS_UPLOAD }}",
    71  			},
    72  		})
    73  
    74  		client, err := NewGitHub(ctx, ctx.Token)
    75  		require.NoError(t, err)
    76  
    77  		githubClient, ok := client.(*githubClient)
    78  		require.True(t, ok)
    79  		require.Equal(t, githubURL+"/api", githubClient.client.BaseURL.String())
    80  		require.Equal(t, githubURL+"/upload", githubClient.client.UploadURL.String())
    81  	})
    82  
    83  	t.Run("template invalid api", func(t *testing.T) {
    84  		ctx := context.New(config.Project{
    85  			GitHubURLs: config.GitHubURLs{
    86  				API: "{{ .Env.GORELEASER_NOT_EXISTS }}",
    87  			},
    88  		})
    89  
    90  		_, err := NewGitHub(ctx, ctx.Token)
    91  		require.ErrorAs(t, err, &template.ExecError{})
    92  	})
    93  
    94  	t.Run("template invalid upload", func(t *testing.T) {
    95  		ctx := context.New(config.Project{
    96  			GitHubURLs: config.GitHubURLs{
    97  				API:    "https://github.mycompany.com/api",
    98  				Upload: "{{ .Env.GORELEASER_NOT_EXISTS }}",
    99  			},
   100  		})
   101  
   102  		_, err := NewGitHub(ctx, ctx.Token)
   103  		require.ErrorAs(t, err, &template.ExecError{})
   104  	})
   105  
   106  	t.Run("template invalid", func(t *testing.T) {
   107  		ctx := context.New(config.Project{
   108  			GitHubURLs: config.GitHubURLs{
   109  				API: "{{.dddddddddd",
   110  			},
   111  		})
   112  
   113  		_, err := NewGitHub(ctx, ctx.Token)
   114  		require.Error(t, err)
   115  	})
   116  }
   117  
   118  func TestGitHubUploadReleaseIDNotInt(t *testing.T) {
   119  	ctx := context.New(config.Project{})
   120  	client, err := NewGitHub(ctx, ctx.Token)
   121  	require.NoError(t, err)
   122  
   123  	require.EqualError(
   124  		t,
   125  		client.Upload(ctx, "blah", &artifact.Artifact{}, nil),
   126  		`strconv.ParseInt: parsing "blah": invalid syntax`,
   127  	)
   128  }
   129  
   130  func TestGitHubReleaseURLTemplate(t *testing.T) {
   131  	tests := []struct {
   132  		name            string
   133  		downloadURL     string
   134  		wantDownloadURL string
   135  		wantErr         bool
   136  	}{
   137  		{
   138  			name:            "default_download_url",
   139  			downloadURL:     DefaultGitHubDownloadURL,
   140  			wantDownloadURL: "https://github.com/owner/name/releases/download/{{ .Tag }}/{{ .ArtifactName }}",
   141  		},
   142  		{
   143  			name:            "download_url_template",
   144  			downloadURL:     "{{ .Env.GORELEASER_TEST_GITHUB_URLS_DOWNLOAD }}",
   145  			wantDownloadURL: "https://github.mycompany.com/owner/name/releases/download/{{ .Tag }}/{{ .ArtifactName }}",
   146  		},
   147  		{
   148  			name:        "download_url_template_invalid_value",
   149  			downloadURL: "{{ .Env.GORELEASER_NOT_EXISTS }}",
   150  			wantErr:     true,
   151  		},
   152  		{
   153  			name:        "download_url_template_invalid",
   154  			downloadURL: "{{.dddddddddd",
   155  			wantErr:     true,
   156  		},
   157  	}
   158  
   159  	for _, tt := range tests {
   160  		t.Run(tt.name, func(t *testing.T) {
   161  			ctx := context.New(config.Project{
   162  				Env: []string{
   163  					"GORELEASER_TEST_GITHUB_URLS_DOWNLOAD=https://github.mycompany.com",
   164  				},
   165  				GitHubURLs: config.GitHubURLs{
   166  					Download: tt.downloadURL,
   167  				},
   168  				Release: config.Release{
   169  					GitHub: config.Repo{
   170  						Owner: "owner",
   171  						Name:  "name",
   172  					},
   173  				},
   174  			})
   175  			client, err := NewGitHub(ctx, ctx.Token)
   176  			require.NoError(t, err)
   177  
   178  			urlTpl, err := client.ReleaseURLTemplate(ctx)
   179  			if tt.wantErr {
   180  				require.Error(t, err)
   181  				return
   182  			}
   183  
   184  			require.NoError(t, err)
   185  			require.Equal(t, tt.wantDownloadURL, urlTpl)
   186  		})
   187  	}
   188  }
   189  
   190  func TestGitHubCreateReleaseWrongNameTemplate(t *testing.T) {
   191  	ctx := context.New(config.Project{
   192  		Release: config.Release{
   193  			NameTemplate: "{{.dddddddddd",
   194  		},
   195  	})
   196  	client, err := NewGitHub(ctx, ctx.Token)
   197  	require.NoError(t, err)
   198  
   199  	str, err := client.CreateRelease(ctx, "")
   200  	require.Empty(t, str)
   201  	require.EqualError(t, err, `template: tmpl:1: unclosed action`)
   202  }
   203  
   204  func TestGithubGetDefaultBranch(t *testing.T) {
   205  	totalRequests := 0
   206  	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   207  		totalRequests++
   208  		defer r.Body.Close()
   209  
   210  		// Assume the request to create a branch was good
   211  		w.WriteHeader(http.StatusOK)
   212  		fmt.Fprint(w, `{"default_branch": "main"}`)
   213  	}))
   214  	defer srv.Close()
   215  
   216  	ctx := context.New(config.Project{
   217  		GitHubURLs: config.GitHubURLs{
   218  			API: srv.URL + "/",
   219  		},
   220  	})
   221  
   222  	client, err := NewGitHub(ctx, "test-token")
   223  	require.NoError(t, err)
   224  	repo := Repo{
   225  		Owner:  "someone",
   226  		Name:   "something",
   227  		Branch: "somebranch",
   228  	}
   229  
   230  	b, err := client.GetDefaultBranch(ctx, repo)
   231  	require.NoError(t, err)
   232  	require.Equal(t, "main", b)
   233  	require.Equal(t, 1, totalRequests)
   234  }
   235  
   236  func TestGithubGetDefaultBranchErr(t *testing.T) {
   237  	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   238  		defer r.Body.Close()
   239  
   240  		// Assume the request to create a branch was good
   241  		w.WriteHeader(http.StatusNotImplemented)
   242  		fmt.Fprint(w, "{}")
   243  	}))
   244  	defer srv.Close()
   245  
   246  	ctx := context.New(config.Project{
   247  		GitHubURLs: config.GitHubURLs{
   248  			API: srv.URL + "/",
   249  		},
   250  	})
   251  	client, err := NewGitHub(ctx, "test-token")
   252  	require.NoError(t, err)
   253  	repo := Repo{
   254  		Owner:  "someone",
   255  		Name:   "something",
   256  		Branch: "somebranch",
   257  	}
   258  
   259  	_, err = client.GetDefaultBranch(ctx, repo)
   260  	require.Error(t, err)
   261  }
   262  
   263  func TestChangelog(t *testing.T) {
   264  	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   265  		defer r.Body.Close()
   266  
   267  		if r.URL.Path == "/repos/someone/something/compare/v1.0.0...v1.1.0" {
   268  			r, err := os.Open("testdata/github/compare.json")
   269  			require.NoError(t, err)
   270  			_, err = io.Copy(w, r)
   271  			require.NoError(t, err)
   272  			return
   273  		}
   274  	}))
   275  	defer srv.Close()
   276  
   277  	ctx := context.New(config.Project{
   278  		GitHubURLs: config.GitHubURLs{
   279  			API: srv.URL + "/",
   280  		},
   281  	})
   282  	client, err := NewGitHub(ctx, "test-token")
   283  	require.NoError(t, err)
   284  	repo := Repo{
   285  		Owner:  "someone",
   286  		Name:   "something",
   287  		Branch: "somebranch",
   288  	}
   289  
   290  	log, err := client.Changelog(ctx, repo, "v1.0.0", "v1.1.0")
   291  	require.NoError(t, err)
   292  	require.Equal(t, "6dcb09b5b57875f334f61aebed695e2e4193db5e: Fix all the bugs (@octocat)", log)
   293  }
   294  
   295  func TestReleaseNotes(t *testing.T) {
   296  	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   297  		defer r.Body.Close()
   298  
   299  		if r.URL.Path == "/repos/someone/something/releases/generate-notes" {
   300  			r, err := os.Open("testdata/github/releasenotes.json")
   301  			require.NoError(t, err)
   302  			_, err = io.Copy(w, r)
   303  			require.NoError(t, err)
   304  			return
   305  		}
   306  	}))
   307  	defer srv.Close()
   308  
   309  	ctx := context.New(config.Project{
   310  		GitHubURLs: config.GitHubURLs{
   311  			API: srv.URL + "/",
   312  		},
   313  	})
   314  	client, err := NewGitHub(ctx, "test-token")
   315  	require.NoError(t, err)
   316  	repo := Repo{
   317  		Owner:  "someone",
   318  		Name:   "something",
   319  		Branch: "somebranch",
   320  	}
   321  
   322  	log, err := client.GenerateReleaseNotes(ctx, repo, "v1.0.0", "v1.1.0")
   323  	require.NoError(t, err)
   324  	require.Equal(t, "**Full Changelog**: https://github.com/someone/something/compare/v1.0.0...v1.1.0", log)
   325  }