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  }