github.com/ahmet2mir/goreleaser@v0.180.3-0.20210927151101-8e5ee5a9b8c5/internal/client/gitlab_test.go (about) 1 package client 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "io" 7 "net/http" 8 "net/http/httptest" 9 "os" 10 "strconv" 11 "strings" 12 "testing" 13 "text/template" 14 15 "github.com/goreleaser/goreleaser/internal/artifact" 16 "github.com/goreleaser/goreleaser/pkg/config" 17 "github.com/goreleaser/goreleaser/pkg/context" 18 "github.com/stretchr/testify/require" 19 ) 20 21 func TestGitLabReleaseURLTemplate(t *testing.T) { 22 tests := []struct { 23 name string 24 downloadURL string 25 wantDownloadURL string 26 wantErr bool 27 }{ 28 { 29 name: "default_download_url", 30 downloadURL: DefaultGitLabDownloadURL, 31 wantDownloadURL: "https://gitlab.com/owner/name/-/releases/{{ .Tag }}/downloads/{{ .ArtifactName }}", 32 }, 33 { 34 name: "download_url_template", 35 downloadURL: "{{ .Env.GORELEASER_TEST_GITLAB_URLS_DOWNLOAD }}", 36 wantDownloadURL: "https://gitlab.mycompany.com/owner/name/-/releases/{{ .Tag }}/downloads/{{ .ArtifactName }}", 37 }, 38 { 39 name: "download_url_template_invalid_value", 40 downloadURL: "{{ .Env.GORELEASER_NOT_EXISTS }}", 41 wantErr: true, 42 }, 43 { 44 name: "download_url_template_invalid", 45 downloadURL: "{{.dddddddddd", 46 wantErr: true, 47 }, 48 } 49 50 for _, tt := range tests { 51 ctx := context.New(config.Project{ 52 Env: []string{ 53 "GORELEASER_TEST_GITLAB_URLS_DOWNLOAD=https://gitlab.mycompany.com", 54 }, 55 GitLabURLs: config.GitLabURLs{ 56 Download: tt.downloadURL, 57 }, 58 Release: config.Release{ 59 GitLab: config.Repo{ 60 Owner: "owner", 61 Name: "name", 62 }, 63 }, 64 }) 65 client, err := NewGitLab(ctx, ctx.Token) 66 require.NoError(t, err) 67 68 urlTpl, err := client.ReleaseURLTemplate(ctx) 69 if tt.wantErr { 70 require.Error(t, err) 71 return 72 } 73 74 require.NoError(t, err) 75 require.Equal(t, tt.wantDownloadURL, urlTpl) 76 } 77 } 78 79 func TestGitLabURLsAPITemplate(t *testing.T) { 80 tests := []struct { 81 name string 82 apiURL string 83 wantHost string 84 }{ 85 { 86 name: "default_values", 87 wantHost: "gitlab.com", 88 }, 89 { 90 name: "speicifed_api_env_key", 91 apiURL: "https://gitlab.mycompany.com", 92 wantHost: "gitlab.mycompany.com", 93 }, 94 } 95 96 for _, tt := range tests { 97 t.Run(tt.name, func(t *testing.T) { 98 envs := []string{} 99 gitlabURLs := config.GitLabURLs{} 100 101 if tt.apiURL != "" { 102 envs = append(envs, fmt.Sprintf("GORELEASER_TEST_GITLAB_URLS_API=%s", tt.apiURL)) 103 gitlabURLs.API = "{{ .Env.GORELEASER_TEST_GITLAB_URLS_API }}" 104 } 105 106 ctx := context.New(config.Project{ 107 Env: envs, 108 GitLabURLs: gitlabURLs, 109 }) 110 111 client, err := NewGitLab(ctx, ctx.Token) 112 require.NoError(t, err) 113 114 gitlabClient, ok := client.(*gitlabClient) 115 require.True(t, ok) 116 117 require.Equal(t, tt.wantHost, gitlabClient.client.BaseURL().Host) 118 }) 119 } 120 121 t.Run("no_env_specified", func(t *testing.T) { 122 ctx := context.New(config.Project{ 123 GitLabURLs: config.GitLabURLs{ 124 API: "{{ .Env.GORELEASER_NOT_EXISTS }}", 125 }, 126 }) 127 128 _, err := NewGitLab(ctx, ctx.Token) 129 require.ErrorAs(t, err, &template.ExecError{}) 130 }) 131 132 t.Run("invalid_template", func(t *testing.T) { 133 ctx := context.New(config.Project{ 134 GitLabURLs: config.GitLabURLs{ 135 API: "{{.dddddddddd", 136 }, 137 }) 138 139 _, err := NewGitLab(ctx, ctx.Token) 140 require.Error(t, err) 141 }) 142 } 143 144 func TestGitLabURLsDownloadTemplate(t *testing.T) { 145 tests := []struct { 146 name string 147 downloadURL string 148 wantURL string 149 wantErr bool 150 }{ 151 { 152 name: "empty_download_url", 153 wantURL: "/", 154 }, 155 { 156 name: "download_url_template", 157 downloadURL: "{{ .Env.GORELEASER_TEST_GITLAB_URLS_DOWNLOAD }}", 158 wantURL: "https://gitlab.mycompany.com/", 159 }, 160 { 161 name: "download_url_template_invalid_value", 162 downloadURL: "{{ .Eenv.GORELEASER_NOT_EXISTS }}", 163 wantErr: true, 164 }, 165 { 166 name: "download_url_template_invalid", 167 downloadURL: "{{.dddddddddd", 168 wantErr: true, 169 }, 170 { 171 name: "download_url_string", 172 downloadURL: "https://gitlab.mycompany.com", 173 wantURL: "https://gitlab.mycompany.com/", 174 }, 175 } 176 177 for _, tt := range tests { 178 t.Run(tt.name, func(t *testing.T) { 179 srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 180 defer fmt.Fprint(w, "{}") 181 defer w.WriteHeader(http.StatusOK) 182 defer r.Body.Close() 183 184 if !strings.Contains(r.URL.Path, "assets/links") { 185 _, _ = io.Copy(io.Discard, r.Body) 186 return 187 } 188 189 b, err := io.ReadAll(r.Body) 190 require.NoError(t, err) 191 192 reqBody := map[string]interface{}{} 193 err = json.Unmarshal(b, &reqBody) 194 require.NoError(t, err) 195 196 require.Equal(t, tt.wantURL, reqBody["url"]) 197 })) 198 defer srv.Close() 199 200 ctx := context.New(config.Project{ 201 Env: []string{ 202 "GORELEASER_TEST_GITLAB_URLS_DOWNLOAD=https://gitlab.mycompany.com", 203 }, 204 Release: config.Release{ 205 GitLab: config.Repo{ 206 Owner: "test", 207 Name: "test", 208 }, 209 }, 210 GitLabURLs: config.GitLabURLs{ 211 API: srv.URL, 212 Download: tt.downloadURL, 213 }, 214 }) 215 216 tmpFile, err := os.CreateTemp(t.TempDir(), "") 217 require.NoError(t, err) 218 219 client, err := NewGitLab(ctx, ctx.Token) 220 require.NoError(t, err) 221 222 err = client.Upload(ctx, "1234", &artifact.Artifact{Name: "test", Path: "some-path"}, tmpFile) 223 if tt.wantErr { 224 require.Error(t, err) 225 return 226 } 227 require.NoError(t, err) 228 }) 229 } 230 } 231 232 func TestGitLabCreateReleaseUknownHost(t *testing.T) { 233 ctx := context.New(config.Project{ 234 Release: config.Release{ 235 GitLab: config.Repo{ 236 Owner: "owner", 237 Name: "name", 238 }, 239 }, 240 GitLabURLs: config.GitLabURLs{ 241 API: "http://goreleaser-notexists", 242 }, 243 }) 244 client, err := NewGitLab(ctx, "test-token") 245 require.NoError(t, err) 246 247 _, err = client.CreateRelease(ctx, "body") 248 require.Error(t, err) 249 } 250 251 func TestGitLabCreateReleaseReleaseNotExists(t *testing.T) { 252 notExistsStatusCodes := []int{http.StatusNotFound, http.StatusForbidden} 253 254 for _, tt := range notExistsStatusCodes { 255 t.Run(strconv.Itoa(tt), func(t *testing.T) { 256 totalRequests := 0 257 createdRelease := false 258 srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 259 defer r.Body.Close() 260 totalRequests++ 261 262 if !strings.Contains(r.URL.Path, "releases") { 263 w.WriteHeader(http.StatusOK) 264 fmt.Fprint(w, "{}") 265 return 266 } 267 268 // Check if release exists 269 if r.Method == http.MethodGet { 270 w.WriteHeader(tt) 271 fmt.Fprint(w, "{}") 272 return 273 } 274 275 // Create release if it doens't exists 276 if r.Method == http.MethodPost { 277 createdRelease = true 278 w.WriteHeader(http.StatusOK) 279 fmt.Fprint(w, "{}") 280 return 281 } 282 283 require.FailNow(t, "should not reach here") 284 })) 285 defer srv.Close() 286 287 ctx := context.New(config.Project{ 288 GitLabURLs: config.GitLabURLs{ 289 API: srv.URL, 290 }, 291 }) 292 client, err := NewGitLab(ctx, "test-token") 293 require.NoError(t, err) 294 295 _, err = client.CreateRelease(ctx, "body") 296 require.NoError(t, err) 297 require.True(t, createdRelease) 298 require.Equal(t, 3, totalRequests) 299 }) 300 } 301 } 302 303 func TestGitLabCreateReleaseUnkownHTTPError(t *testing.T) { 304 totalRequests := 0 305 srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 306 totalRequests++ 307 defer r.Body.Close() 308 309 w.WriteHeader(http.StatusUnprocessableEntity) 310 fmt.Fprint(w, "{}") 311 })) 312 defer srv.Close() 313 314 ctx := context.New(config.Project{ 315 GitLabURLs: config.GitLabURLs{ 316 API: srv.URL, 317 }, 318 }) 319 client, err := NewGitLab(ctx, "test-token") 320 require.NoError(t, err) 321 322 _, err = client.CreateRelease(ctx, "body") 323 require.Error(t, err) 324 require.Equal(t, 2, totalRequests) 325 }