2018-10-15 06:52:52 +03:00
// Copyright 2018 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2019-09-15 18:28:25 +03:00
package release
2018-10-15 06:52:52 +03:00
import (
2019-09-15 18:28:25 +03:00
"path/filepath"
2021-03-22 19:09:51 +03:00
"strings"
2018-10-15 06:52:52 +03:00
"testing"
2020-07-28 21:08:45 +03:00
"time"
2018-10-15 06:52:52 +03:00
2022-05-20 17:08:52 +03:00
"code.gitea.io/gitea/models/db"
2021-11-19 16:39:57 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-12 17:36:47 +03:00
"code.gitea.io/gitea/models/unittest"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2019-03-27 12:33:00 +03:00
"code.gitea.io/gitea/modules/git"
2021-09-08 18:19:30 +03:00
"code.gitea.io/gitea/services/attachment"
2018-10-15 06:52:52 +03:00
"github.com/stretchr/testify/assert"
)
2019-09-15 18:28:25 +03:00
func TestMain ( m * testing . M ) {
2022-04-14 16:58:21 +03:00
unittest . MainTest ( m , & unittest . TestOptions {
GiteaRootPath : filepath . Join ( ".." , ".." ) ,
} )
2019-09-15 18:28:25 +03:00
}
2018-10-15 06:52:52 +03:00
func TestRelease_Create ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2018-10-15 06:52:52 +03:00
2022-08-16 05:22:25 +03:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } )
2021-12-10 04:27:50 +03:00
repoPath := repo_model . RepoPath ( user . Name , repo . Name )
2018-10-15 06:52:52 +03:00
2022-03-29 22:13:41 +03:00
gitRepo , err := git . OpenRepository ( git . DefaultContext , repoPath )
2018-10-15 06:52:52 +03:00
assert . NoError ( t , err )
2019-11-13 10:01:19 +03:00
defer gitRepo . Close ( )
2018-10-15 06:52:52 +03:00
2022-08-25 05:31:57 +03:00
assert . NoError ( t , CreateRelease ( gitRepo , & repo_model . Release {
2018-10-15 06:52:52 +03:00
RepoID : repo . ID ,
2021-06-25 17:28:55 +03:00
Repo : repo ,
2018-10-15 06:52:52 +03:00
PublisherID : user . ID ,
2021-06-25 17:28:55 +03:00
Publisher : user ,
2018-10-15 06:52:52 +03:00
TagName : "v0.1" ,
Target : "master" ,
Title : "v0.1 is released" ,
Note : "v0.1 is released" ,
IsDraft : false ,
IsPrerelease : false ,
IsTag : false ,
2021-02-28 22:57:45 +03:00
} , nil , "" ) )
2018-10-15 06:52:52 +03:00
2022-08-25 05:31:57 +03:00
assert . NoError ( t , CreateRelease ( gitRepo , & repo_model . Release {
2018-10-15 06:52:52 +03:00
RepoID : repo . ID ,
2021-06-25 17:28:55 +03:00
Repo : repo ,
2018-10-15 06:52:52 +03:00
PublisherID : user . ID ,
2021-06-25 17:28:55 +03:00
Publisher : user ,
2018-10-15 06:52:52 +03:00
TagName : "v0.1.1" ,
Target : "65f1bf27bc3bf70f64657658635e66094edbcb4d" ,
Title : "v0.1.1 is released" ,
Note : "v0.1.1 is released" ,
IsDraft : false ,
IsPrerelease : false ,
IsTag : false ,
2021-02-28 22:57:45 +03:00
} , nil , "" ) )
2018-10-15 06:52:52 +03:00
2022-08-25 05:31:57 +03:00
assert . NoError ( t , CreateRelease ( gitRepo , & repo_model . Release {
2018-10-15 06:52:52 +03:00
RepoID : repo . ID ,
2021-06-25 17:28:55 +03:00
Repo : repo ,
2018-10-15 06:52:52 +03:00
PublisherID : user . ID ,
2021-06-25 17:28:55 +03:00
Publisher : user ,
2018-10-15 06:52:52 +03:00
TagName : "v0.1.2" ,
Target : "65f1bf2" ,
Title : "v0.1.2 is released" ,
Note : "v0.1.2 is released" ,
IsDraft : false ,
IsPrerelease : false ,
IsTag : false ,
2021-02-28 22:57:45 +03:00
} , nil , "" ) )
2018-10-15 06:52:52 +03:00
2022-08-25 05:31:57 +03:00
assert . NoError ( t , CreateRelease ( gitRepo , & repo_model . Release {
2018-10-15 06:52:52 +03:00
RepoID : repo . ID ,
2021-06-25 17:28:55 +03:00
Repo : repo ,
2018-10-15 06:52:52 +03:00
PublisherID : user . ID ,
2021-06-25 17:28:55 +03:00
Publisher : user ,
2018-10-15 06:52:52 +03:00
TagName : "v0.1.3" ,
Target : "65f1bf2" ,
Title : "v0.1.3 is released" ,
Note : "v0.1.3 is released" ,
IsDraft : true ,
IsPrerelease : false ,
IsTag : false ,
2021-02-28 22:57:45 +03:00
} , nil , "" ) )
2018-10-15 06:52:52 +03:00
2022-08-25 05:31:57 +03:00
assert . NoError ( t , CreateRelease ( gitRepo , & repo_model . Release {
2018-10-15 06:52:52 +03:00
RepoID : repo . ID ,
2021-06-25 17:28:55 +03:00
Repo : repo ,
2018-10-15 06:52:52 +03:00
PublisherID : user . ID ,
2021-06-25 17:28:55 +03:00
Publisher : user ,
2018-10-15 06:52:52 +03:00
TagName : "v0.1.4" ,
Target : "65f1bf2" ,
Title : "v0.1.4 is released" ,
Note : "v0.1.4 is released" ,
IsDraft : false ,
IsPrerelease : true ,
IsTag : false ,
2021-02-28 22:57:45 +03:00
} , nil , "" ) )
2018-10-15 06:52:52 +03:00
2021-11-19 16:39:57 +03:00
attach , err := attachment . NewAttachment ( & repo_model . Attachment {
2021-09-08 18:19:30 +03:00
RepoID : repo . ID ,
2021-03-22 19:09:51 +03:00
UploaderID : user . ID ,
Name : "test.txt" ,
2021-09-08 18:19:30 +03:00
} , strings . NewReader ( "testtest" ) )
2021-03-22 19:09:51 +03:00
assert . NoError ( t , err )
2022-08-25 05:31:57 +03:00
release := repo_model . Release {
2018-10-15 06:52:52 +03:00
RepoID : repo . ID ,
2021-06-25 17:28:55 +03:00
Repo : repo ,
2018-10-15 06:52:52 +03:00
PublisherID : user . ID ,
2021-06-25 17:28:55 +03:00
Publisher : user ,
2018-10-15 06:52:52 +03:00
TagName : "v0.1.5" ,
Target : "65f1bf2" ,
Title : "v0.1.5 is released" ,
Note : "v0.1.5 is released" ,
IsDraft : false ,
IsPrerelease : false ,
IsTag : true ,
2021-03-22 19:09:51 +03:00
}
assert . NoError ( t , CreateRelease ( gitRepo , & release , [ ] string { attach . UUID } , "test" ) )
2018-10-15 06:52:52 +03:00
}
2020-07-28 21:08:45 +03:00
func TestRelease_Update ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2020-07-28 21:08:45 +03:00
2022-08-16 05:22:25 +03:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } )
2021-12-10 04:27:50 +03:00
repoPath := repo_model . RepoPath ( user . Name , repo . Name )
2020-07-28 21:08:45 +03:00
2022-03-29 22:13:41 +03:00
gitRepo , err := git . OpenRepository ( git . DefaultContext , repoPath )
2020-07-28 21:08:45 +03:00
assert . NoError ( t , err )
defer gitRepo . Close ( )
// Test a changed release
2022-08-25 05:31:57 +03:00
assert . NoError ( t , CreateRelease ( gitRepo , & repo_model . Release {
2020-07-28 21:08:45 +03:00
RepoID : repo . ID ,
2021-06-25 17:28:55 +03:00
Repo : repo ,
2020-07-28 21:08:45 +03:00
PublisherID : user . ID ,
2021-06-25 17:28:55 +03:00
Publisher : user ,
2020-07-28 21:08:45 +03:00
TagName : "v1.1.1" ,
Target : "master" ,
Title : "v1.1.1 is released" ,
Note : "v1.1.1 is released" ,
IsDraft : false ,
IsPrerelease : false ,
IsTag : false ,
2021-02-28 22:57:45 +03:00
} , nil , "" ) )
2022-08-25 05:31:57 +03:00
release , err := repo_model . GetRelease ( repo . ID , "v1.1.1" )
2020-07-28 21:08:45 +03:00
assert . NoError ( t , err )
releaseCreatedUnix := release . CreatedUnix
time . Sleep ( 2 * time . Second ) // sleep 2 seconds to ensure a different timestamp
release . Note = "Changed note"
2021-03-22 19:09:51 +03:00
assert . NoError ( t , UpdateRelease ( user , gitRepo , release , nil , nil , nil ) )
2022-08-25 05:31:57 +03:00
release , err = repo_model . GetReleaseByID ( db . DefaultContext , release . ID )
2020-07-28 21:08:45 +03:00
assert . NoError ( t , err )
assert . Equal ( t , int64 ( releaseCreatedUnix ) , int64 ( release . CreatedUnix ) )
// Test a changed draft
2022-08-25 05:31:57 +03:00
assert . NoError ( t , CreateRelease ( gitRepo , & repo_model . Release {
2020-07-28 21:08:45 +03:00
RepoID : repo . ID ,
2021-06-25 17:28:55 +03:00
Repo : repo ,
2020-07-28 21:08:45 +03:00
PublisherID : user . ID ,
2021-06-25 17:28:55 +03:00
Publisher : user ,
2020-07-28 21:08:45 +03:00
TagName : "v1.2.1" ,
Target : "65f1bf2" ,
Title : "v1.2.1 is draft" ,
Note : "v1.2.1 is draft" ,
IsDraft : true ,
IsPrerelease : false ,
IsTag : false ,
2021-02-28 22:57:45 +03:00
} , nil , "" ) )
2022-08-25 05:31:57 +03:00
release , err = repo_model . GetRelease ( repo . ID , "v1.2.1" )
2020-07-28 21:08:45 +03:00
assert . NoError ( t , err )
releaseCreatedUnix = release . CreatedUnix
time . Sleep ( 2 * time . Second ) // sleep 2 seconds to ensure a different timestamp
release . Title = "Changed title"
2021-03-22 19:09:51 +03:00
assert . NoError ( t , UpdateRelease ( user , gitRepo , release , nil , nil , nil ) )
2022-08-25 05:31:57 +03:00
release , err = repo_model . GetReleaseByID ( db . DefaultContext , release . ID )
2020-07-28 21:08:45 +03:00
assert . NoError ( t , err )
assert . Less ( t , int64 ( releaseCreatedUnix ) , int64 ( release . CreatedUnix ) )
// Test a changed pre-release
2022-08-25 05:31:57 +03:00
assert . NoError ( t , CreateRelease ( gitRepo , & repo_model . Release {
2020-07-28 21:08:45 +03:00
RepoID : repo . ID ,
2021-06-25 17:28:55 +03:00
Repo : repo ,
2020-07-28 21:08:45 +03:00
PublisherID : user . ID ,
2021-06-25 17:28:55 +03:00
Publisher : user ,
2020-07-28 21:08:45 +03:00
TagName : "v1.3.1" ,
Target : "65f1bf2" ,
Title : "v1.3.1 is pre-released" ,
Note : "v1.3.1 is pre-released" ,
IsDraft : false ,
IsPrerelease : true ,
IsTag : false ,
2021-02-28 22:57:45 +03:00
} , nil , "" ) )
2022-08-25 05:31:57 +03:00
release , err = repo_model . GetRelease ( repo . ID , "v1.3.1" )
2020-07-28 21:08:45 +03:00
assert . NoError ( t , err )
releaseCreatedUnix = release . CreatedUnix
time . Sleep ( 2 * time . Second ) // sleep 2 seconds to ensure a different timestamp
release . Title = "Changed title"
release . Note = "Changed note"
2021-03-22 19:09:51 +03:00
assert . NoError ( t , UpdateRelease ( user , gitRepo , release , nil , nil , nil ) )
2022-08-25 05:31:57 +03:00
release , err = repo_model . GetReleaseByID ( db . DefaultContext , release . ID )
2020-07-28 21:08:45 +03:00
assert . NoError ( t , err )
assert . Equal ( t , int64 ( releaseCreatedUnix ) , int64 ( release . CreatedUnix ) )
2021-03-22 19:09:51 +03:00
// Test create release
2022-08-25 05:31:57 +03:00
release = & repo_model . Release {
2021-03-22 19:09:51 +03:00
RepoID : repo . ID ,
2021-06-25 17:28:55 +03:00
Repo : repo ,
2021-03-22 19:09:51 +03:00
PublisherID : user . ID ,
2021-06-25 17:28:55 +03:00
Publisher : user ,
2021-03-22 19:09:51 +03:00
TagName : "v1.1.2" ,
Target : "master" ,
Title : "v1.1.2 is released" ,
Note : "v1.1.2 is released" ,
IsDraft : true ,
IsPrerelease : false ,
IsTag : false ,
}
assert . NoError ( t , CreateRelease ( gitRepo , release , nil , "" ) )
assert . Greater ( t , release . ID , int64 ( 0 ) )
release . IsDraft = false
tagName := release . TagName
assert . NoError ( t , UpdateRelease ( user , gitRepo , release , nil , nil , nil ) )
2022-08-25 05:31:57 +03:00
release , err = repo_model . GetReleaseByID ( db . DefaultContext , release . ID )
2021-03-22 19:09:51 +03:00
assert . NoError ( t , err )
assert . Equal ( t , tagName , release . TagName )
// Add new attachments
2021-11-19 16:39:57 +03:00
attach , err := attachment . NewAttachment ( & repo_model . Attachment {
2021-09-08 18:19:30 +03:00
RepoID : repo . ID ,
2021-03-22 19:09:51 +03:00
UploaderID : user . ID ,
Name : "test.txt" ,
2021-09-08 18:19:30 +03:00
} , strings . NewReader ( "testtest" ) )
2021-03-22 19:09:51 +03:00
assert . NoError ( t , err )
assert . NoError ( t , UpdateRelease ( user , gitRepo , release , [ ] string { attach . UUID } , nil , nil ) )
2022-08-25 05:31:57 +03:00
assert . NoError ( t , repo_model . GetReleaseAttachments ( db . DefaultContext , release ) )
2021-06-07 08:27:09 +03:00
assert . Len ( t , release . Attachments , 1 )
2021-03-22 19:09:51 +03:00
assert . EqualValues ( t , attach . UUID , release . Attachments [ 0 ] . UUID )
assert . EqualValues ( t , release . ID , release . Attachments [ 0 ] . ReleaseID )
assert . EqualValues ( t , attach . Name , release . Attachments [ 0 ] . Name )
// update the attachment name
assert . NoError ( t , UpdateRelease ( user , gitRepo , release , nil , nil , map [ string ] string {
attach . UUID : "test2.txt" ,
} ) )
release . Attachments = nil
2022-08-25 05:31:57 +03:00
assert . NoError ( t , repo_model . GetReleaseAttachments ( db . DefaultContext , release ) )
2021-06-07 08:27:09 +03:00
assert . Len ( t , release . Attachments , 1 )
2021-03-22 19:09:51 +03:00
assert . EqualValues ( t , attach . UUID , release . Attachments [ 0 ] . UUID )
assert . EqualValues ( t , release . ID , release . Attachments [ 0 ] . ReleaseID )
assert . EqualValues ( t , "test2.txt" , release . Attachments [ 0 ] . Name )
// delete the attachment
assert . NoError ( t , UpdateRelease ( user , gitRepo , release , nil , [ ] string { attach . UUID } , nil ) )
release . Attachments = nil
2022-08-25 05:31:57 +03:00
assert . NoError ( t , repo_model . GetReleaseAttachments ( db . DefaultContext , release ) )
2021-06-07 08:27:09 +03:00
assert . Empty ( t , release . Attachments )
2020-07-28 21:08:45 +03:00
}
func TestRelease_createTag ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2020-07-28 21:08:45 +03:00
2022-08-16 05:22:25 +03:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } )
2021-12-10 04:27:50 +03:00
repoPath := repo_model . RepoPath ( user . Name , repo . Name )
2020-07-28 21:08:45 +03:00
2022-03-29 22:13:41 +03:00
gitRepo , err := git . OpenRepository ( git . DefaultContext , repoPath )
2020-07-28 21:08:45 +03:00
assert . NoError ( t , err )
defer gitRepo . Close ( )
// Test a changed release
2022-08-25 05:31:57 +03:00
release := & repo_model . Release {
2020-07-28 21:08:45 +03:00
RepoID : repo . ID ,
2021-06-25 17:28:55 +03:00
Repo : repo ,
2020-07-28 21:08:45 +03:00
PublisherID : user . ID ,
2021-06-25 17:28:55 +03:00
Publisher : user ,
2020-07-28 21:08:45 +03:00
TagName : "v2.1.1" ,
Target : "master" ,
Title : "v2.1.1 is released" ,
Note : "v2.1.1 is released" ,
IsDraft : false ,
IsPrerelease : false ,
IsTag : false ,
}
2021-03-22 19:09:51 +03:00
_ , err = createTag ( gitRepo , release , "" )
assert . NoError ( t , err )
2020-07-28 21:08:45 +03:00
assert . NotEmpty ( t , release . CreatedUnix )
releaseCreatedUnix := release . CreatedUnix
time . Sleep ( 2 * time . Second ) // sleep 2 seconds to ensure a different timestamp
release . Note = "Changed note"
2021-03-22 19:09:51 +03:00
_ , err = createTag ( gitRepo , release , "" )
assert . NoError ( t , err )
2020-07-28 21:08:45 +03:00
assert . Equal ( t , int64 ( releaseCreatedUnix ) , int64 ( release . CreatedUnix ) )
// Test a changed draft
2022-08-25 05:31:57 +03:00
release = & repo_model . Release {
2020-07-28 21:08:45 +03:00
RepoID : repo . ID ,
2021-06-25 17:28:55 +03:00
Repo : repo ,
2020-07-28 21:08:45 +03:00
PublisherID : user . ID ,
2021-06-25 17:28:55 +03:00
Publisher : user ,
2020-07-28 21:08:45 +03:00
TagName : "v2.2.1" ,
Target : "65f1bf2" ,
Title : "v2.2.1 is draft" ,
Note : "v2.2.1 is draft" ,
IsDraft : true ,
IsPrerelease : false ,
IsTag : false ,
}
2021-03-22 19:09:51 +03:00
_ , err = createTag ( gitRepo , release , "" )
assert . NoError ( t , err )
2020-07-28 21:08:45 +03:00
releaseCreatedUnix = release . CreatedUnix
time . Sleep ( 2 * time . Second ) // sleep 2 seconds to ensure a different timestamp
release . Title = "Changed title"
2021-03-22 19:09:51 +03:00
_ , err = createTag ( gitRepo , release , "" )
assert . NoError ( t , err )
2020-07-28 21:08:45 +03:00
assert . Less ( t , int64 ( releaseCreatedUnix ) , int64 ( release . CreatedUnix ) )
// Test a changed pre-release
2022-08-25 05:31:57 +03:00
release = & repo_model . Release {
2020-07-28 21:08:45 +03:00
RepoID : repo . ID ,
2021-06-25 17:28:55 +03:00
Repo : repo ,
2020-07-28 21:08:45 +03:00
PublisherID : user . ID ,
2021-06-25 17:28:55 +03:00
Publisher : user ,
2020-07-28 21:08:45 +03:00
TagName : "v2.3.1" ,
Target : "65f1bf2" ,
Title : "v2.3.1 is pre-released" ,
Note : "v2.3.1 is pre-released" ,
IsDraft : false ,
IsPrerelease : true ,
IsTag : false ,
}
2021-03-22 19:09:51 +03:00
_ , err = createTag ( gitRepo , release , "" )
assert . NoError ( t , err )
2020-07-28 21:08:45 +03:00
releaseCreatedUnix = release . CreatedUnix
time . Sleep ( 2 * time . Second ) // sleep 2 seconds to ensure a different timestamp
release . Title = "Changed title"
release . Note = "Changed note"
2021-03-22 19:09:51 +03:00
_ , err = createTag ( gitRepo , release , "" )
assert . NoError ( t , err )
2020-07-28 21:08:45 +03:00
assert . Equal ( t , int64 ( releaseCreatedUnix ) , int64 ( release . CreatedUnix ) )
}
2021-02-28 22:57:45 +03:00
func TestCreateNewTag ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-08-16 05:22:25 +03:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } )
2021-02-28 22:57:45 +03:00
2022-01-20 02:26:57 +03:00
assert . NoError ( t , CreateNewTag ( git . DefaultContext , user , repo , "master" , "v2.0" ,
2021-02-28 22:57:45 +03:00
"v2.0 is released \n\n BUGFIX: .... \n\n 123" ) )
}