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