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 }