code.gitea.io/gitea@v1.22.3/services/release/release_test.go (about)

     1  // Copyright 2018 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package release
     5  
     6  import (
     7  	"strings"
     8  	"testing"
     9  	"time"
    10  
    11  	"code.gitea.io/gitea/models/db"
    12  	repo_model "code.gitea.io/gitea/models/repo"
    13  	"code.gitea.io/gitea/models/unittest"
    14  	user_model "code.gitea.io/gitea/models/user"
    15  	"code.gitea.io/gitea/modules/git"
    16  	"code.gitea.io/gitea/modules/gitrepo"
    17  	"code.gitea.io/gitea/services/attachment"
    18  
    19  	_ "code.gitea.io/gitea/models/actions"
    20  
    21  	"github.com/stretchr/testify/assert"
    22  )
    23  
    24  func TestMain(m *testing.M) {
    25  	unittest.MainTest(m)
    26  }
    27  
    28  func TestRelease_Create(t *testing.T) {
    29  	assert.NoError(t, unittest.PrepareTestDatabase())
    30  
    31  	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
    32  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
    33  
    34  	gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo)
    35  	assert.NoError(t, err)
    36  	defer gitRepo.Close()
    37  
    38  	assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
    39  		RepoID:       repo.ID,
    40  		Repo:         repo,
    41  		PublisherID:  user.ID,
    42  		Publisher:    user,
    43  		TagName:      "v0.1",
    44  		Target:       "master",
    45  		Title:        "v0.1 is released",
    46  		Note:         "v0.1 is released",
    47  		IsDraft:      false,
    48  		IsPrerelease: false,
    49  		IsTag:        false,
    50  	}, nil, ""))
    51  
    52  	assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
    53  		RepoID:       repo.ID,
    54  		Repo:         repo,
    55  		PublisherID:  user.ID,
    56  		Publisher:    user,
    57  		TagName:      "v0.1.1",
    58  		Target:       "65f1bf27bc3bf70f64657658635e66094edbcb4d",
    59  		Title:        "v0.1.1 is released",
    60  		Note:         "v0.1.1 is released",
    61  		IsDraft:      false,
    62  		IsPrerelease: false,
    63  		IsTag:        false,
    64  	}, nil, ""))
    65  
    66  	assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
    67  		RepoID:       repo.ID,
    68  		Repo:         repo,
    69  		PublisherID:  user.ID,
    70  		Publisher:    user,
    71  		TagName:      "v0.1.2",
    72  		Target:       "65f1bf2",
    73  		Title:        "v0.1.2 is released",
    74  		Note:         "v0.1.2 is released",
    75  		IsDraft:      false,
    76  		IsPrerelease: false,
    77  		IsTag:        false,
    78  	}, nil, ""))
    79  
    80  	assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
    81  		RepoID:       repo.ID,
    82  		Repo:         repo,
    83  		PublisherID:  user.ID,
    84  		Publisher:    user,
    85  		TagName:      "v0.1.3",
    86  		Target:       "65f1bf2",
    87  		Title:        "v0.1.3 is released",
    88  		Note:         "v0.1.3 is released",
    89  		IsDraft:      true,
    90  		IsPrerelease: false,
    91  		IsTag:        false,
    92  	}, nil, ""))
    93  
    94  	assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
    95  		RepoID:       repo.ID,
    96  		Repo:         repo,
    97  		PublisherID:  user.ID,
    98  		Publisher:    user,
    99  		TagName:      "v0.1.4",
   100  		Target:       "65f1bf2",
   101  		Title:        "v0.1.4 is released",
   102  		Note:         "v0.1.4 is released",
   103  		IsDraft:      false,
   104  		IsPrerelease: true,
   105  		IsTag:        false,
   106  	}, nil, ""))
   107  
   108  	testPlayload := "testtest"
   109  
   110  	attach, err := attachment.NewAttachment(db.DefaultContext, &repo_model.Attachment{
   111  		RepoID:     repo.ID,
   112  		UploaderID: user.ID,
   113  		Name:       "test.txt",
   114  	}, strings.NewReader(testPlayload), int64(len([]byte(testPlayload))))
   115  	assert.NoError(t, err)
   116  
   117  	release := repo_model.Release{
   118  		RepoID:       repo.ID,
   119  		Repo:         repo,
   120  		PublisherID:  user.ID,
   121  		Publisher:    user,
   122  		TagName:      "v0.1.5",
   123  		Target:       "65f1bf2",
   124  		Title:        "v0.1.5 is released",
   125  		Note:         "v0.1.5 is released",
   126  		IsDraft:      false,
   127  		IsPrerelease: false,
   128  		IsTag:        true,
   129  	}
   130  	assert.NoError(t, CreateRelease(gitRepo, &release, []string{attach.UUID}, "test"))
   131  }
   132  
   133  func TestRelease_Update(t *testing.T) {
   134  	assert.NoError(t, unittest.PrepareTestDatabase())
   135  
   136  	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
   137  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
   138  
   139  	gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo)
   140  	assert.NoError(t, err)
   141  	defer gitRepo.Close()
   142  
   143  	// Test a changed release
   144  	assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
   145  		RepoID:       repo.ID,
   146  		Repo:         repo,
   147  		PublisherID:  user.ID,
   148  		Publisher:    user,
   149  		TagName:      "v1.1.1",
   150  		Target:       "master",
   151  		Title:        "v1.1.1 is released",
   152  		Note:         "v1.1.1 is released",
   153  		IsDraft:      false,
   154  		IsPrerelease: false,
   155  		IsTag:        false,
   156  	}, nil, ""))
   157  	release, err := repo_model.GetRelease(db.DefaultContext, repo.ID, "v1.1.1")
   158  	assert.NoError(t, err)
   159  	releaseCreatedUnix := release.CreatedUnix
   160  	time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
   161  	release.Note = "Changed note"
   162  	assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil))
   163  	release, err = repo_model.GetReleaseByID(db.DefaultContext, release.ID)
   164  	assert.NoError(t, err)
   165  	assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
   166  
   167  	// Test a changed draft
   168  	assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
   169  		RepoID:       repo.ID,
   170  		Repo:         repo,
   171  		PublisherID:  user.ID,
   172  		Publisher:    user,
   173  		TagName:      "v1.2.1",
   174  		Target:       "65f1bf2",
   175  		Title:        "v1.2.1 is draft",
   176  		Note:         "v1.2.1 is draft",
   177  		IsDraft:      true,
   178  		IsPrerelease: false,
   179  		IsTag:        false,
   180  	}, nil, ""))
   181  	release, err = repo_model.GetRelease(db.DefaultContext, repo.ID, "v1.2.1")
   182  	assert.NoError(t, err)
   183  	releaseCreatedUnix = release.CreatedUnix
   184  	time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
   185  	release.Title = "Changed title"
   186  	assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil))
   187  	release, err = repo_model.GetReleaseByID(db.DefaultContext, release.ID)
   188  	assert.NoError(t, err)
   189  	assert.Less(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
   190  
   191  	// Test a changed pre-release
   192  	assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{
   193  		RepoID:       repo.ID,
   194  		Repo:         repo,
   195  		PublisherID:  user.ID,
   196  		Publisher:    user,
   197  		TagName:      "v1.3.1",
   198  		Target:       "65f1bf2",
   199  		Title:        "v1.3.1 is pre-released",
   200  		Note:         "v1.3.1 is pre-released",
   201  		IsDraft:      false,
   202  		IsPrerelease: true,
   203  		IsTag:        false,
   204  	}, nil, ""))
   205  	release, err = repo_model.GetRelease(db.DefaultContext, repo.ID, "v1.3.1")
   206  	assert.NoError(t, err)
   207  	releaseCreatedUnix = release.CreatedUnix
   208  	time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
   209  	release.Title = "Changed title"
   210  	release.Note = "Changed note"
   211  	assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil))
   212  	release, err = repo_model.GetReleaseByID(db.DefaultContext, release.ID)
   213  	assert.NoError(t, err)
   214  	assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
   215  
   216  	// Test create release
   217  	release = &repo_model.Release{
   218  		RepoID:       repo.ID,
   219  		Repo:         repo,
   220  		PublisherID:  user.ID,
   221  		Publisher:    user,
   222  		TagName:      "v1.1.2",
   223  		Target:       "master",
   224  		Title:        "v1.1.2 is released",
   225  		Note:         "v1.1.2 is released",
   226  		IsDraft:      true,
   227  		IsPrerelease: false,
   228  		IsTag:        false,
   229  	}
   230  	assert.NoError(t, CreateRelease(gitRepo, release, nil, ""))
   231  	assert.Greater(t, release.ID, int64(0))
   232  
   233  	release.IsDraft = false
   234  	tagName := release.TagName
   235  
   236  	assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil))
   237  	release, err = repo_model.GetReleaseByID(db.DefaultContext, release.ID)
   238  	assert.NoError(t, err)
   239  	assert.Equal(t, tagName, release.TagName)
   240  
   241  	// Add new attachments
   242  	samplePayload := "testtest"
   243  	attach, err := attachment.NewAttachment(db.DefaultContext, &repo_model.Attachment{
   244  		RepoID:     repo.ID,
   245  		UploaderID: user.ID,
   246  		Name:       "test.txt",
   247  	}, strings.NewReader(samplePayload), int64(len([]byte(samplePayload))))
   248  	assert.NoError(t, err)
   249  
   250  	assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, []string{attach.UUID}, nil, nil))
   251  	assert.NoError(t, repo_model.GetReleaseAttachments(db.DefaultContext, release))
   252  	assert.Len(t, release.Attachments, 1)
   253  	assert.EqualValues(t, attach.UUID, release.Attachments[0].UUID)
   254  	assert.EqualValues(t, release.ID, release.Attachments[0].ReleaseID)
   255  	assert.EqualValues(t, attach.Name, release.Attachments[0].Name)
   256  
   257  	// update the attachment name
   258  	assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, map[string]string{
   259  		attach.UUID: "test2.txt",
   260  	}))
   261  	release.Attachments = nil
   262  	assert.NoError(t, repo_model.GetReleaseAttachments(db.DefaultContext, release))
   263  	assert.Len(t, release.Attachments, 1)
   264  	assert.EqualValues(t, attach.UUID, release.Attachments[0].UUID)
   265  	assert.EqualValues(t, release.ID, release.Attachments[0].ReleaseID)
   266  	assert.EqualValues(t, "test2.txt", release.Attachments[0].Name)
   267  
   268  	// delete the attachment
   269  	assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, []string{attach.UUID}, nil))
   270  	release.Attachments = nil
   271  	assert.NoError(t, repo_model.GetReleaseAttachments(db.DefaultContext, release))
   272  	assert.Empty(t, release.Attachments)
   273  }
   274  
   275  func TestRelease_createTag(t *testing.T) {
   276  	assert.NoError(t, unittest.PrepareTestDatabase())
   277  
   278  	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
   279  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
   280  
   281  	gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo)
   282  	assert.NoError(t, err)
   283  	defer gitRepo.Close()
   284  
   285  	// Test a changed release
   286  	release := &repo_model.Release{
   287  		RepoID:       repo.ID,
   288  		Repo:         repo,
   289  		PublisherID:  user.ID,
   290  		Publisher:    user,
   291  		TagName:      "v2.1.1",
   292  		Target:       "master",
   293  		Title:        "v2.1.1 is released",
   294  		Note:         "v2.1.1 is released",
   295  		IsDraft:      false,
   296  		IsPrerelease: false,
   297  		IsTag:        false,
   298  	}
   299  	_, err = createTag(db.DefaultContext, gitRepo, release, "")
   300  	assert.NoError(t, err)
   301  	assert.NotEmpty(t, release.CreatedUnix)
   302  	releaseCreatedUnix := release.CreatedUnix
   303  	time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
   304  	release.Note = "Changed note"
   305  	_, err = createTag(db.DefaultContext, gitRepo, release, "")
   306  	assert.NoError(t, err)
   307  	assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
   308  
   309  	// Test a changed draft
   310  	release = &repo_model.Release{
   311  		RepoID:       repo.ID,
   312  		Repo:         repo,
   313  		PublisherID:  user.ID,
   314  		Publisher:    user,
   315  		TagName:      "v2.2.1",
   316  		Target:       "65f1bf2",
   317  		Title:        "v2.2.1 is draft",
   318  		Note:         "v2.2.1 is draft",
   319  		IsDraft:      true,
   320  		IsPrerelease: false,
   321  		IsTag:        false,
   322  	}
   323  	_, err = createTag(db.DefaultContext, gitRepo, release, "")
   324  	assert.NoError(t, err)
   325  	releaseCreatedUnix = release.CreatedUnix
   326  	time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
   327  	release.Title = "Changed title"
   328  	_, err = createTag(db.DefaultContext, gitRepo, release, "")
   329  	assert.NoError(t, err)
   330  	assert.Less(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
   331  
   332  	// Test a changed pre-release
   333  	release = &repo_model.Release{
   334  		RepoID:       repo.ID,
   335  		Repo:         repo,
   336  		PublisherID:  user.ID,
   337  		Publisher:    user,
   338  		TagName:      "v2.3.1",
   339  		Target:       "65f1bf2",
   340  		Title:        "v2.3.1 is pre-released",
   341  		Note:         "v2.3.1 is pre-released",
   342  		IsDraft:      false,
   343  		IsPrerelease: true,
   344  		IsTag:        false,
   345  	}
   346  	_, err = createTag(db.DefaultContext, gitRepo, release, "")
   347  	assert.NoError(t, err)
   348  	releaseCreatedUnix = release.CreatedUnix
   349  	time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
   350  	release.Title = "Changed title"
   351  	release.Note = "Changed note"
   352  	_, err = createTag(db.DefaultContext, gitRepo, release, "")
   353  	assert.NoError(t, err)
   354  	assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix))
   355  }
   356  
   357  func TestCreateNewTag(t *testing.T) {
   358  	assert.NoError(t, unittest.PrepareTestDatabase())
   359  	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
   360  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
   361  
   362  	assert.NoError(t, CreateNewTag(git.DefaultContext, user, repo, "master", "v2.0",
   363  		"v2.0 is released \n\n BUGFIX: .... \n\n 123"))
   364  }