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 }