github.com/ahmet2mir/goreleaser@v0.180.3-0.20210927151101-8e5ee5a9b8c5/internal/client/gitea_test.go (about)

     1  package client
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  	"strings"
     8  	"testing"
     9  	"text/template"
    10  
    11  	"code.gitea.io/sdk/gitea"
    12  	"github.com/goreleaser/goreleaser/internal/artifact"
    13  	"github.com/goreleaser/goreleaser/pkg/config"
    14  	"github.com/goreleaser/goreleaser/pkg/context"
    15  	"github.com/jarcoal/httpmock"
    16  	"github.com/stretchr/testify/require"
    17  	"github.com/stretchr/testify/suite"
    18  )
    19  
    20  type GetInstanceURLSuite struct {
    21  	suite.Suite
    22  }
    23  
    24  func (s *GetInstanceURLSuite) TestWithScheme() {
    25  	t := s.T()
    26  	rootURL := "https://gitea.com"
    27  	ctx := context.New(config.Project{
    28  		GiteaURLs: config.GiteaURLs{
    29  			API: rootURL + "/api/v1",
    30  		},
    31  	})
    32  
    33  	result, err := getInstanceURL(ctx)
    34  	require.NoError(t, err)
    35  	require.Equal(t, rootURL, result)
    36  }
    37  
    38  func (s *GetInstanceURLSuite) TestParseError() {
    39  	t := s.T()
    40  	ctx := context.New(config.Project{
    41  		GiteaURLs: config.GiteaURLs{
    42  			API: "://wrong.gitea.com",
    43  		},
    44  	})
    45  
    46  	result, err := getInstanceURL(ctx)
    47  	require.Error(t, err)
    48  	require.Empty(t, result)
    49  }
    50  
    51  func (s *GetInstanceURLSuite) TestNoScheme() {
    52  	t := s.T()
    53  	ctx := context.New(config.Project{
    54  		GiteaURLs: config.GiteaURLs{
    55  			API: "gitea.com",
    56  		},
    57  	})
    58  
    59  	result, err := getInstanceURL(ctx)
    60  	require.Error(t, err)
    61  	require.Empty(t, result)
    62  }
    63  
    64  func (s *GetInstanceURLSuite) TestEmpty() {
    65  	t := s.T()
    66  	ctx := context.New(config.Project{
    67  		GiteaURLs: config.GiteaURLs{
    68  			API: "",
    69  		},
    70  	})
    71  
    72  	result, err := getInstanceURL(ctx)
    73  	require.Error(t, err)
    74  	require.Empty(t, result)
    75  }
    76  
    77  func (s *GetInstanceURLSuite) TestTemplate() {
    78  	t := s.T()
    79  	rootURL := "https://gitea.mycompany.com"
    80  	ctx := context.New(config.Project{
    81  		Env: []string{
    82  			fmt.Sprintf("GORELEASER_TEST_GITAEA_URLS_API=%s", rootURL),
    83  		},
    84  		GiteaURLs: config.GiteaURLs{
    85  			API: "{{ .Env.GORELEASER_TEST_GITAEA_URLS_API }}",
    86  		},
    87  	})
    88  
    89  	result, err := getInstanceURL(ctx)
    90  	require.NoError(t, err)
    91  	require.Equal(t, rootURL, result)
    92  }
    93  
    94  func (s *GetInstanceURLSuite) TestTemplateMissingValue() {
    95  	t := s.T()
    96  	ctx := context.New(config.Project{
    97  		GiteaURLs: config.GiteaURLs{
    98  			API: "{{ .Env.GORELEASER_NOT_EXISTS }}",
    99  		},
   100  	})
   101  
   102  	result, err := getInstanceURL(ctx)
   103  	require.ErrorAs(t, err, &template.ExecError{})
   104  	require.Empty(t, result)
   105  }
   106  
   107  func (s *GetInstanceURLSuite) TestTemplateInvalid() {
   108  	t := s.T()
   109  	ctx := context.New(config.Project{
   110  		GiteaURLs: config.GiteaURLs{
   111  			API: "{{.dddddddddd",
   112  		},
   113  	})
   114  
   115  	result, err := getInstanceURL(ctx)
   116  	require.Error(t, err)
   117  	require.Empty(t, result)
   118  }
   119  
   120  func TestGetInstanceURLSuite(t *testing.T) {
   121  	suite.Run(t, new(GetInstanceURLSuite))
   122  }
   123  
   124  type GiteaReleasesTestSuite struct {
   125  	suite.Suite
   126  	url          string
   127  	owner        string
   128  	repoName     string
   129  	tag          string
   130  	client       *giteaClient
   131  	releasesURL  string
   132  	title        string
   133  	description  string
   134  	ctx          *context.Context
   135  	commit       string
   136  	isDraft      bool
   137  	isPrerelease bool
   138  	releaseURL   string
   139  	releaseID    int64
   140  }
   141  
   142  func (s *GiteaReleasesTestSuite) SetupTest() {
   143  	httpmock.Activate()
   144  	s.url = "https://gitea.example.com"
   145  	s.owner = "owner"
   146  	s.repoName = "repoName"
   147  	s.releasesURL = fmt.Sprintf(
   148  		"%v/api/v1/repos/%v/%v/releases",
   149  		s.url,
   150  		s.owner,
   151  		s.repoName,
   152  	)
   153  	s.tag = "tag"
   154  	s.title = "gitea_release_title"
   155  	s.description = "gitea release description"
   156  	s.commit = "some commit hash"
   157  	s.isDraft = false
   158  	s.isPrerelease = true
   159  	s.ctx = &context.Context{
   160  		Version: "6.6.6",
   161  		Config: config.Project{
   162  			ProjectName: "project",
   163  			Release: config.Release{
   164  				NameTemplate: "{{ .ProjectName }}_{{ .Version }}",
   165  				Gitea: config.Repo{
   166  					Owner: s.owner,
   167  					Name:  s.repoName,
   168  				},
   169  				Draft: s.isDraft,
   170  			},
   171  		},
   172  		Env: context.Env{},
   173  		Semver: context.Semver{
   174  			Major: 6,
   175  			Minor: 6,
   176  			Patch: 6,
   177  		},
   178  		Git: context.GitInfo{
   179  			CurrentTag:  s.tag,
   180  			Commit:      s.commit,
   181  			ShortCommit: s.commit[0:2],
   182  			URL:         "https://gitea.com/goreleaser/goreleaser.git",
   183  		},
   184  		PreRelease: s.isPrerelease,
   185  	}
   186  	s.releaseID = 666
   187  	s.releaseURL = fmt.Sprintf("%v/%v", s.releasesURL, s.releaseID)
   188  	httpmock.RegisterResponder("GET", fmt.Sprintf("%s/api/v1/version", s.url), httpmock.NewStringResponder(200, "{\"version\":\"1.12.0\"}"))
   189  	newClient, err := gitea.NewClient(s.url)
   190  	require.NoError(s.T(), err)
   191  	s.client = &giteaClient{client: newClient}
   192  }
   193  
   194  func (s *GiteaReleasesTestSuite) TearDownTest() {
   195  	httpmock.DeactivateAndReset()
   196  }
   197  
   198  type GetExistingReleaseSuite struct {
   199  	GiteaReleasesTestSuite
   200  }
   201  
   202  func (s *GetExistingReleaseSuite) TestNoReleases() {
   203  	t := s.T()
   204  	httpmock.RegisterResponder("GET", s.releasesURL, httpmock.NewStringResponder(200, "[]"))
   205  
   206  	release, err := s.client.getExistingRelease(s.owner, s.repoName, s.tag)
   207  	require.Nil(t, release)
   208  	require.NoError(t, err)
   209  }
   210  
   211  func (s *GetExistingReleaseSuite) TestNoRepo() {
   212  	t := s.T()
   213  	httpmock.RegisterResponder("GET", s.releasesURL, httpmock.NewStringResponder(404, ""))
   214  
   215  	release, err := s.client.getExistingRelease(s.owner, s.repoName, s.tag)
   216  	require.Nil(t, release)
   217  	require.Error(t, err)
   218  }
   219  
   220  func (s *GetExistingReleaseSuite) TestReleaseExists() {
   221  	t := s.T()
   222  	release := gitea.Release{TagName: s.tag}
   223  	resp, err := httpmock.NewJsonResponder(200, []gitea.Release{release})
   224  	require.NoError(t, err)
   225  	httpmock.RegisterResponder("GET", s.releasesURL, resp)
   226  
   227  	result, err := s.client.getExistingRelease(s.owner, s.repoName, s.tag)
   228  	require.NotNil(t, result)
   229  	require.Equal(t, *result, release)
   230  	require.NoError(t, err)
   231  }
   232  
   233  func TestGetExistingReleaseSuite(t *testing.T) {
   234  	suite.Run(t, new(GetExistingReleaseSuite))
   235  }
   236  
   237  type GiteacreateReleaseSuite struct {
   238  	GiteaReleasesTestSuite
   239  }
   240  
   241  func (s *GiteacreateReleaseSuite) TestSuccess() {
   242  	t := s.T()
   243  	expectedRelease := gitea.Release{
   244  		TagName:      s.tag,
   245  		Target:       s.commit,
   246  		Note:         s.description,
   247  		IsDraft:      s.isDraft,
   248  		IsPrerelease: s.isPrerelease,
   249  	}
   250  	resp, err := httpmock.NewJsonResponder(200, &expectedRelease)
   251  	require.NoError(t, err)
   252  	httpmock.RegisterResponder("POST", s.releasesURL, resp)
   253  
   254  	release, err := s.client.createRelease(s.ctx, s.title, s.description)
   255  	require.NoError(t, err)
   256  	require.NotNil(t, release)
   257  	require.Equal(t, expectedRelease, *release)
   258  }
   259  
   260  func (s *GiteacreateReleaseSuite) TestError() {
   261  	t := s.T()
   262  	httpmock.RegisterResponder("POST", s.releasesURL, httpmock.NewStringResponder(400, ""))
   263  
   264  	release, err := s.client.createRelease(s.ctx, s.title, s.description)
   265  	require.Error(t, err)
   266  	require.Nil(t, release)
   267  }
   268  
   269  func TestGiteacreateReleaseSuite(t *testing.T) {
   270  	suite.Run(t, new(GiteacreateReleaseSuite))
   271  }
   272  
   273  type GiteaupdateReleaseSuite struct {
   274  	GiteaReleasesTestSuite
   275  }
   276  
   277  func (s *GiteaupdateReleaseSuite) SetupTest() {
   278  	s.GiteaReleasesTestSuite.SetupTest()
   279  }
   280  
   281  func (s *GiteaupdateReleaseSuite) TestSuccess() {
   282  	t := s.T()
   283  	expectedRelease := gitea.Release{
   284  		TagName:      s.tag,
   285  		Target:       s.commit,
   286  		Note:         s.description,
   287  		IsDraft:      s.isDraft,
   288  		IsPrerelease: s.isPrerelease,
   289  	}
   290  	resp, err := httpmock.NewJsonResponder(200, &expectedRelease)
   291  	require.NoError(t, err)
   292  	httpmock.RegisterResponder("PATCH", s.releaseURL, resp)
   293  
   294  	release, err := s.client.updateRelease(s.ctx, s.title, s.description, s.releaseID)
   295  	require.NoError(t, err)
   296  	require.NotNil(t, release)
   297  }
   298  
   299  func (s *GiteaupdateReleaseSuite) TestError() {
   300  	t := s.T()
   301  	httpmock.RegisterResponder("PATCH", s.releaseURL, httpmock.NewStringResponder(400, ""))
   302  
   303  	release, err := s.client.updateRelease(s.ctx, s.title, s.description, s.releaseID)
   304  	require.Error(t, err)
   305  	require.Nil(t, release)
   306  }
   307  
   308  func (s *GiteaupdateReleaseSuite) TestGiteaCreateFile() {
   309  	t := s.T()
   310  	fileEndpoint := fmt.Sprintf("%s/api/v1/repos/%s/%s/contents/%s", s.url, s.owner, s.repoName, "file.txt")
   311  
   312  	httpmock.RegisterResponder("GET", fmt.Sprintf("%s/api/v1/version", s.url), httpmock.NewStringResponder(200, "{\"version\":\"1.12.0\"}"))
   313  	httpmock.RegisterResponder("GET", fileEndpoint, httpmock.NewStringResponder(404, ""))
   314  	httpmock.RegisterResponder("POST", fileEndpoint, httpmock.NewStringResponder(201, "{\n  \"content\": {\n    \"name\": \"test.file\",\n    \"path\": \"test.file\",\n    \"sha\": \"3b18e512dba79e4c8300dd08aeb37f8e728b8dad\",\n    \"type\": \"file\",\n    \"size\": 12,\n    \"encoding\": \"base64\",\n    \"content\": \"aGVsbG8gd29ybGQK\"\n  }\n}"))
   315  
   316  	author := config.CommitAuthor{Name: s.owner}
   317  	repo := Repo{Owner: s.owner, Name: s.repoName}
   318  	content := []byte("hello world")
   319  	path := "file.txt"
   320  	message := "add hello world"
   321  	err := s.client.CreateFile(s.ctx, author, repo, content, path, message)
   322  	require.Nil(t, err)
   323  }
   324  
   325  func TestGiteaupdateReleaseSuite(t *testing.T) {
   326  	suite.Run(t, new(GiteaupdateReleaseSuite))
   327  }
   328  
   329  type GiteaCreateReleaseSuite struct {
   330  	GiteaReleasesTestSuite
   331  }
   332  
   333  func (s *GiteaCreateReleaseSuite) TestTemplateError() {
   334  	t := s.T()
   335  	s.ctx.Config.Release.NameTemplate = "{{ .NoKeyLikeThat }}"
   336  
   337  	releaseID, err := s.client.CreateRelease(s.ctx, s.description)
   338  	require.Empty(t, releaseID)
   339  	require.Error(t, err)
   340  }
   341  
   342  func (s *GiteaCreateReleaseSuite) TestErrorGettingExisitngRelease() {
   343  	t := s.T()
   344  	httpmock.RegisterResponder("GET", s.releasesURL, httpmock.NewStringResponder(404, ""))
   345  
   346  	releaseID, err := s.client.CreateRelease(s.ctx, s.description)
   347  	require.Empty(t, releaseID)
   348  	require.Error(t, err)
   349  }
   350  
   351  func (s *GiteaCreateReleaseSuite) TestErrorUpdatingRelease() {
   352  	t := s.T()
   353  	expectedRelease := gitea.Release{TagName: s.tag}
   354  	resp, err := httpmock.NewJsonResponder(200, []gitea.Release{expectedRelease})
   355  	require.NoError(t, err)
   356  	httpmock.RegisterResponder("GET", s.releasesURL, resp)
   357  	httpmock.RegisterResponder("PATCH", s.releaseURL, httpmock.NewStringResponder(400, ""))
   358  
   359  	releaseID, err := s.client.CreateRelease(s.ctx, s.description)
   360  	require.Empty(t, releaseID)
   361  	require.Error(t, err)
   362  }
   363  
   364  func (s *GiteaCreateReleaseSuite) TestSuccessUpdatingRelease() {
   365  	t := s.T()
   366  	expectedRelease := gitea.Release{
   367  		ID:           666,
   368  		TagName:      s.tag,
   369  		Target:       s.commit,
   370  		Note:         s.description,
   371  		IsDraft:      s.isDraft,
   372  		IsPrerelease: s.isPrerelease,
   373  	}
   374  	resp, err := httpmock.NewJsonResponder(200, []gitea.Release{expectedRelease})
   375  	require.NoError(t, err)
   376  	httpmock.RegisterResponder("GET", s.releasesURL, resp)
   377  	resp, err = httpmock.NewJsonResponder(200, &expectedRelease)
   378  	require.NoError(t, err)
   379  	httpmock.RegisterResponder("PATCH", s.releaseURL, resp)
   380  
   381  	newDescription := "NewDescription"
   382  	releaseID, err := s.client.CreateRelease(s.ctx, newDescription)
   383  	require.Equal(t, fmt.Sprint(expectedRelease.ID), releaseID)
   384  	require.NoError(t, err)
   385  }
   386  
   387  func (s *GiteaCreateReleaseSuite) TestErrorCreatingRelease() {
   388  	t := s.T()
   389  	httpmock.RegisterResponder("GET", s.releasesURL, httpmock.NewStringResponder(200, "[]"))
   390  	httpmock.RegisterResponder("POST", s.releasesURL, httpmock.NewStringResponder(400, ""))
   391  
   392  	releaseID, err := s.client.CreateRelease(s.ctx, s.description)
   393  	require.Empty(t, releaseID)
   394  	require.Error(t, err)
   395  }
   396  
   397  func (s *GiteaCreateReleaseSuite) TestSuccessCreatingRelease() {
   398  	t := s.T()
   399  	httpmock.RegisterResponder("GET", s.releasesURL, httpmock.NewStringResponder(200, "[]"))
   400  	expectedRelease := gitea.Release{
   401  		ID:           666,
   402  		TagName:      s.tag,
   403  		Target:       s.commit,
   404  		Note:         s.description,
   405  		IsDraft:      s.isDraft,
   406  		IsPrerelease: s.isPrerelease,
   407  	}
   408  	resp, err := httpmock.NewJsonResponder(200, &expectedRelease)
   409  	require.NoError(t, err)
   410  	httpmock.RegisterResponder("POST", s.releasesURL, resp)
   411  
   412  	releaseID, err := s.client.CreateRelease(s.ctx, s.description)
   413  	require.Equal(t, fmt.Sprint(expectedRelease.ID), releaseID)
   414  	require.NoError(t, err)
   415  }
   416  
   417  func TestGiteaCreateReleaseSuite(t *testing.T) {
   418  	suite.Run(t, new(GiteaCreateReleaseSuite))
   419  }
   420  
   421  type GiteaUploadSuite struct {
   422  	GiteaReleasesTestSuite
   423  	artifact              *artifact.Artifact
   424  	file                  *os.File
   425  	releaseAttachmentsURL string
   426  }
   427  
   428  func (s *GiteaUploadSuite) SetupTest() {
   429  	t := s.T()
   430  	s.GiteaReleasesTestSuite.SetupTest()
   431  	s.artifact = &artifact.Artifact{Name: "ArtifactName"}
   432  	file, err := ioutil.TempFile(t.TempDir(), "gitea_test_tempfile")
   433  	require.NoError(t, err)
   434  	require.NotNil(t, file)
   435  	t.Cleanup(func() {
   436  		_ = file.Close()
   437  	})
   438  	s.file = file
   439  	s.releaseAttachmentsURL = fmt.Sprintf("%v/assets", s.releaseURL)
   440  }
   441  
   442  func (s *GiteaUploadSuite) TearDownTest() {
   443  	s.GiteaReleasesTestSuite.TearDownTest()
   444  	require.NoError(s.T(), s.file.Close())
   445  }
   446  
   447  func (s *GiteaUploadSuite) TestErrorParsingReleaseID() {
   448  	t := s.T()
   449  	err := s.client.Upload(s.ctx, "notint", s.artifact, s.file)
   450  	require.EqualError(t, err, "strconv.ParseInt: parsing \"notint\": invalid syntax")
   451  }
   452  
   453  func (s *GiteaUploadSuite) TestErrorCreatingReleaseAttachment() {
   454  	t := s.T()
   455  	httpmock.RegisterResponder("POST", s.releaseAttachmentsURL, httpmock.NewStringResponder(400, ""))
   456  
   457  	err := s.client.Upload(s.ctx, fmt.Sprint(s.releaseID), s.artifact, s.file)
   458  	require.True(t, strings.HasPrefix(err.Error(), "Unknown API Error: 400"))
   459  }
   460  
   461  func (s *GiteaUploadSuite) TestSuccess() {
   462  	t := s.T()
   463  	attachment := gitea.Attachment{}
   464  	resp, err := httpmock.NewJsonResponder(200, &attachment)
   465  	require.NoError(t, err)
   466  	httpmock.RegisterResponder("POST", s.releaseAttachmentsURL, resp)
   467  
   468  	err = s.client.Upload(s.ctx, fmt.Sprint(s.releaseID), s.artifact, s.file)
   469  	require.NoError(t, err)
   470  }
   471  
   472  func TestGiteaUploadSuite(t *testing.T) {
   473  	suite.Run(t, new(GiteaUploadSuite))
   474  }
   475  
   476  func TestGiteaReleaseURLTemplate(t *testing.T) {
   477  	tests := []struct {
   478  		name            string
   479  		downloadURL     string
   480  		wantDownloadURL string
   481  		wantErr         bool
   482  	}{
   483  		{
   484  			name:            "string_url",
   485  			downloadURL:     "https://gitea.com",
   486  			wantDownloadURL: "https://gitea.com/owner/name/releases/download/{{ .Tag }}/{{ .ArtifactName }}",
   487  		},
   488  		{
   489  			name:            "download_url_template",
   490  			downloadURL:     "{{ .Env.GORELEASER_TEST_GITEA_URLS_DOWNLOAD }}",
   491  			wantDownloadURL: "https://gitea.mycompany.com/owner/name/releases/download/{{ .Tag }}/{{ .ArtifactName }}",
   492  		},
   493  		{
   494  			name:        "download_url_template_invalid_value",
   495  			downloadURL: "{{ .Env.GORELEASER_NOT_EXISTS }}",
   496  			wantErr:     true,
   497  		},
   498  		{
   499  			name:        "download_url_template_invalid",
   500  			downloadURL: "{{.dddddddddd",
   501  			wantErr:     true,
   502  		},
   503  	}
   504  
   505  	for _, tt := range tests {
   506  		t.Run(tt.name, func(t *testing.T) {
   507  			ctx := context.New(config.Project{
   508  				Env: []string{
   509  					"GORELEASER_TEST_GITEA_URLS_DOWNLOAD=https://gitea.mycompany.com",
   510  				},
   511  				GiteaURLs: config.GiteaURLs{
   512  					API:      "https://gitea.com/api/v1",
   513  					Download: tt.downloadURL,
   514  				},
   515  				Release: config.Release{
   516  					Gitea: config.Repo{
   517  						Owner: "owner",
   518  						Name:  "name",
   519  					},
   520  				},
   521  			})
   522  			client, err := NewGitea(ctx, ctx.Token)
   523  			require.NoError(t, err)
   524  
   525  			urlTpl, err := client.ReleaseURLTemplate(ctx)
   526  			if tt.wantErr {
   527  				require.Error(t, err)
   528  				return
   529  			}
   530  
   531  			require.NoError(t, err)
   532  			require.Equal(t, tt.wantDownloadURL, urlTpl)
   533  		})
   534  	}
   535  }