github.com/joselitofilho/goreleaser@v0.155.1-0.20210123221854-e4891856c593/internal/client/gitea_test.go (about)

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