github.com/ahmet2mir/goreleaser@v0.180.3-0.20210927151101-8e5ee5a9b8c5/internal/client/github_test.go (about) 1 package client 2 3 import ( 4 "fmt" 5 "testing" 6 "text/template" 7 8 "github.com/goreleaser/goreleaser/internal/artifact" 9 "github.com/goreleaser/goreleaser/pkg/config" 10 "github.com/goreleaser/goreleaser/pkg/context" 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestNewGitHubClient(t *testing.T) { 15 t.Run("good urls", func(t *testing.T) { 16 githubURL := "https://github.mycompany.com" 17 ctx := context.New(config.Project{ 18 GitHubURLs: config.GitHubURLs{ 19 API: githubURL + "/api", 20 Upload: githubURL + "/upload", 21 }, 22 }) 23 24 client, err := NewGitHub(ctx, ctx.Token) 25 require.NoError(t, err) 26 27 githubClient, ok := client.(*githubClient) 28 require.True(t, ok) 29 require.Equal(t, githubURL+"/api", githubClient.client.BaseURL.String()) 30 require.Equal(t, githubURL+"/upload", githubClient.client.UploadURL.String()) 31 }) 32 33 t.Run("bad api url", func(t *testing.T) { 34 ctx := context.New(config.Project{ 35 GitHubURLs: config.GitHubURLs{ 36 API: "://github.mycompany.com/api", 37 Upload: "https://github.mycompany.com/upload", 38 }, 39 }) 40 _, err := NewGitHub(ctx, ctx.Token) 41 42 require.EqualError(t, err, `parse "://github.mycompany.com/api": missing protocol scheme`) 43 }) 44 45 t.Run("bad upload url", func(t *testing.T) { 46 ctx := context.New(config.Project{ 47 GitHubURLs: config.GitHubURLs{ 48 API: "https://github.mycompany.com/api", 49 Upload: "not a url:4994", 50 }, 51 }) 52 _, err := NewGitHub(ctx, ctx.Token) 53 54 require.EqualError(t, err, `parse "not a url:4994": first path segment in URL cannot contain colon`) 55 }) 56 57 t.Run("template", func(t *testing.T) { 58 githubURL := "https://github.mycompany.com" 59 ctx := context.New(config.Project{ 60 Env: []string{ 61 fmt.Sprintf("GORELEASER_TEST_GITHUB_URLS_API=%s/api", githubURL), 62 fmt.Sprintf("GORELEASER_TEST_GITHUB_URLS_UPLOAD=%s/upload", githubURL), 63 }, 64 GitHubURLs: config.GitHubURLs{ 65 API: "{{ .Env.GORELEASER_TEST_GITHUB_URLS_API }}", 66 Upload: "{{ .Env.GORELEASER_TEST_GITHUB_URLS_UPLOAD }}", 67 }, 68 }) 69 70 client, err := NewGitHub(ctx, ctx.Token) 71 require.NoError(t, err) 72 73 githubClient, ok := client.(*githubClient) 74 require.True(t, ok) 75 require.Equal(t, githubURL+"/api", githubClient.client.BaseURL.String()) 76 require.Equal(t, githubURL+"/upload", githubClient.client.UploadURL.String()) 77 }) 78 79 t.Run("template invalid api", func(t *testing.T) { 80 ctx := context.New(config.Project{ 81 GitHubURLs: config.GitHubURLs{ 82 API: "{{ .Env.GORELEASER_NOT_EXISTS }}", 83 }, 84 }) 85 86 _, err := NewGitHub(ctx, ctx.Token) 87 require.ErrorAs(t, err, &template.ExecError{}) 88 }) 89 90 t.Run("template invalid upload", func(t *testing.T) { 91 ctx := context.New(config.Project{ 92 GitHubURLs: config.GitHubURLs{ 93 API: "https://github.mycompany.com/api", 94 Upload: "{{ .Env.GORELEASER_NOT_EXISTS }}", 95 }, 96 }) 97 98 _, err := NewGitHub(ctx, ctx.Token) 99 require.ErrorAs(t, err, &template.ExecError{}) 100 }) 101 102 t.Run("template invalid", func(t *testing.T) { 103 ctx := context.New(config.Project{ 104 GitHubURLs: config.GitHubURLs{ 105 API: "{{.dddddddddd", 106 }, 107 }) 108 109 _, err := NewGitHub(ctx, ctx.Token) 110 require.Error(t, err) 111 }) 112 } 113 114 func TestGitHubUploadReleaseIDNotInt(t *testing.T) { 115 ctx := context.New(config.Project{}) 116 client, err := NewGitHub(ctx, ctx.Token) 117 require.NoError(t, err) 118 119 require.EqualError( 120 t, 121 client.Upload(ctx, "blah", &artifact.Artifact{}, nil), 122 `strconv.ParseInt: parsing "blah": invalid syntax`, 123 ) 124 } 125 126 func TestGitHubReleaseURLTemplate(t *testing.T) { 127 tests := []struct { 128 name string 129 downloadURL string 130 wantDownloadURL string 131 wantErr bool 132 }{ 133 { 134 name: "default_download_url", 135 downloadURL: DefaultGitHubDownloadURL, 136 wantDownloadURL: "https://github.com/owner/name/releases/download/{{ .Tag }}/{{ .ArtifactName }}", 137 }, 138 { 139 name: "download_url_template", 140 downloadURL: "{{ .Env.GORELEASER_TEST_GITHUB_URLS_DOWNLOAD }}", 141 wantDownloadURL: "https://github.mycompany.com/owner/name/releases/download/{{ .Tag }}/{{ .ArtifactName }}", 142 }, 143 { 144 name: "download_url_template_invalid_value", 145 downloadURL: "{{ .Env.GORELEASER_NOT_EXISTS }}", 146 wantErr: true, 147 }, 148 { 149 name: "download_url_template_invalid", 150 downloadURL: "{{.dddddddddd", 151 wantErr: true, 152 }, 153 } 154 155 for _, tt := range tests { 156 t.Run(tt.name, func(t *testing.T) { 157 ctx := context.New(config.Project{ 158 Env: []string{ 159 "GORELEASER_TEST_GITHUB_URLS_DOWNLOAD=https://github.mycompany.com", 160 }, 161 GitHubURLs: config.GitHubURLs{ 162 Download: tt.downloadURL, 163 }, 164 Release: config.Release{ 165 GitHub: config.Repo{ 166 Owner: "owner", 167 Name: "name", 168 }, 169 }, 170 }) 171 client, err := NewGitHub(ctx, ctx.Token) 172 require.NoError(t, err) 173 174 urlTpl, err := client.ReleaseURLTemplate(ctx) 175 if tt.wantErr { 176 require.Error(t, err) 177 return 178 } 179 180 require.NoError(t, err) 181 require.Equal(t, tt.wantDownloadURL, urlTpl) 182 }) 183 } 184 } 185 186 func TestGitHubCreateReleaseWrongNameTemplate(t *testing.T) { 187 ctx := context.New(config.Project{ 188 Release: config.Release{ 189 NameTemplate: "{{.dddddddddd", 190 }, 191 }) 192 client, err := NewGitHub(ctx, ctx.Token) 193 require.NoError(t, err) 194 195 str, err := client.CreateRelease(ctx, "") 196 require.Empty(t, str) 197 require.EqualError(t, err, `template: tmpl:1: unclosed action`) 198 }