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 }