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  }