2019-05-07 04:12:51 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
// Copyright 2018 Jonas Franz. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package migrations
import (
2020-09-02 20:49:25 +03:00
"context"
2022-02-01 21:20:28 +03:00
"strconv"
2019-05-07 04:12:51 +03:00
"testing"
"time"
"code.gitea.io/gitea/models"
2021-09-19 14:49:59 +03:00
"code.gitea.io/gitea/models/db"
2021-12-10 04:27:50 +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-12-17 07:16:54 +03:00
"code.gitea.io/gitea/modules/graceful"
2021-11-16 18:25:33 +03:00
base "code.gitea.io/gitea/modules/migration"
2019-10-13 16:23:14 +03:00
"code.gitea.io/gitea/modules/structs"
2019-05-07 04:12:51 +03:00
"code.gitea.io/gitea/modules/util"
"github.com/stretchr/testify/assert"
)
func TestGiteaUploadRepo ( t * testing . T ) {
// FIXME: Since no accesskey or user/password will trigger rate limit of github, just skip
t . Skip ( )
2021-11-12 17:36:47 +03:00
unittest . PrepareTestEnv ( t )
2019-05-07 04:12:51 +03:00
2021-11-24 12:49:20 +03:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 1 } ) . ( * user_model . User )
2019-05-07 04:12:51 +03:00
var (
2020-09-21 17:36:51 +03:00
downloader = NewGithubDownloaderV3 ( context . Background ( ) , "https://github.com" , "" , "" , "" , "go-xorm" , "builder" )
2019-05-07 04:12:51 +03:00
repoName = "builder-" + time . Now ( ) . Format ( "2006-01-02-15-04-05" )
2019-12-17 07:16:54 +03:00
uploader = NewGiteaLocalUploader ( graceful . GetManager ( ) . HammerContext ( ) , user , user . Name , repoName )
2019-05-07 04:12:51 +03:00
)
2020-09-11 01:29:19 +03:00
err := migrateRepository ( downloader , uploader , base . MigrateOptions {
2019-10-13 16:23:14 +03:00
CloneAddr : "https://github.com/go-xorm/builder" ,
RepoName : repoName ,
2019-05-07 04:12:51 +03:00
AuthUsername : "" ,
2019-07-08 05:14:12 +03:00
Wiki : true ,
Issues : true ,
Milestones : true ,
Labels : true ,
Releases : true ,
Comments : true ,
PullRequests : true ,
Private : true ,
Mirror : false ,
2021-06-17 01:02:24 +03:00
} , nil )
2019-05-07 04:12:51 +03:00
assert . NoError ( t , err )
2021-12-10 04:27:50 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { OwnerID : user . ID , Name : repoName } ) . ( * repo_model . Repository )
2019-05-07 04:12:51 +03:00
assert . True ( t , repo . HasWiki ( ) )
2021-12-10 04:27:50 +03:00
assert . EqualValues ( t , repo_model . RepositoryReady , repo . Status )
2019-05-07 04:12:51 +03:00
2021-08-12 15:43:08 +03:00
milestones , _ , err := models . GetMilestones ( models . GetMilestonesOption {
2020-07-28 14:30:40 +03:00
RepoID : repo . ID ,
State : structs . StateOpen ,
} )
2019-05-07 04:12:51 +03:00
assert . NoError ( t , err )
2021-06-07 08:27:09 +03:00
assert . Len ( t , milestones , 1 )
2019-05-07 04:12:51 +03:00
2021-08-12 15:43:08 +03:00
milestones , _ , err = models . GetMilestones ( models . GetMilestonesOption {
2020-07-28 14:30:40 +03:00
RepoID : repo . ID ,
State : structs . StateClosed ,
} )
2019-05-07 04:12:51 +03:00
assert . NoError ( t , err )
2021-06-07 08:27:09 +03:00
assert . Empty ( t , milestones )
2019-05-07 04:12:51 +03:00
2021-09-24 14:32:56 +03:00
labels , err := models . GetLabelsByRepoID ( repo . ID , "" , db . ListOptions { } )
2019-05-07 04:12:51 +03:00
assert . NoError ( t , err )
2021-08-18 03:47:18 +03:00
assert . Len ( t , labels , 12 )
2019-05-07 04:12:51 +03:00
releases , err := models . GetReleasesByRepoID ( repo . ID , models . FindReleasesOptions {
2021-09-24 14:32:56 +03:00
ListOptions : db . ListOptions {
2020-01-24 22:00:29 +03:00
PageSize : 10 ,
Page : 0 ,
} ,
2019-05-07 04:12:51 +03:00
IncludeTags : true ,
2020-01-24 22:00:29 +03:00
} )
2019-05-07 04:12:51 +03:00
assert . NoError ( t , err )
2021-06-07 08:27:09 +03:00
assert . Len ( t , releases , 8 )
2019-05-07 04:12:51 +03:00
releases , err = models . GetReleasesByRepoID ( repo . ID , models . FindReleasesOptions {
2021-09-24 14:32:56 +03:00
ListOptions : db . ListOptions {
2020-01-24 22:00:29 +03:00
PageSize : 10 ,
Page : 0 ,
} ,
2019-05-07 04:12:51 +03:00
IncludeTags : false ,
2020-01-24 22:00:29 +03:00
} )
2019-05-07 04:12:51 +03:00
assert . NoError ( t , err )
2021-06-07 08:27:09 +03:00
assert . Len ( t , releases , 1 )
2019-05-07 04:12:51 +03:00
issues , err := models . Issues ( & models . IssuesOptions {
RepoIDs : [ ] int64 { repo . ID } ,
IsPull : util . OptionalBoolFalse ,
SortType : "oldest" ,
} )
assert . NoError ( t , err )
2021-08-18 03:47:18 +03:00
assert . Len ( t , issues , 15 )
2019-05-07 04:12:51 +03:00
assert . NoError ( t , issues [ 0 ] . LoadDiscussComments ( ) )
2021-06-07 08:27:09 +03:00
assert . Empty ( t , issues [ 0 ] . Comments )
2019-05-07 04:12:51 +03:00
pulls , _ , err := models . PullRequests ( repo . ID , & models . PullRequestsOptions {
SortType : "oldest" ,
} )
assert . NoError ( t , err )
2021-08-18 03:47:18 +03:00
assert . Len ( t , pulls , 30 )
2019-05-07 04:12:51 +03:00
assert . NoError ( t , pulls [ 0 ] . LoadIssue ( ) )
assert . NoError ( t , pulls [ 0 ] . Issue . LoadDiscussComments ( ) )
2021-06-07 08:27:09 +03:00
assert . Len ( t , pulls [ 0 ] . Issue . Comments , 2 )
2019-05-07 04:12:51 +03:00
}
2022-02-01 21:20:28 +03:00
func TestGiteaUploadRemapExternalUser ( t * testing . T ) {
unittest . PrepareTestEnv ( t )
doer := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 1 } ) . ( * user_model . User )
repoName := "migrated"
uploader := NewGiteaLocalUploader ( context . Background ( ) , doer , doer . Name , repoName )
uploader . gitServiceType = structs . GiteaService
externalID := int64 ( 1234567 )
externalName := "url.or.something"
source := base . Release {
PublisherID : externalID ,
PublisherName : externalName ,
}
//
// When there is no user linked to the external ID, the migrated data is authored
// by the doer
//
target := models . Release { }
err := uploader . remapExternalUser ( & source , & target )
assert . NoError ( t , err )
assert . EqualValues ( t , doer . ID , target . GetUserID ( ) )
//
// Link the external ID to an existing user
//
linkedUser := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } ) . ( * user_model . User )
externalLoginUser := & user_model . ExternalLoginUser {
ExternalID : strconv . FormatInt ( externalID , 10 ) ,
UserID : linkedUser . ID ,
LoginSourceID : 0 ,
Provider : structs . GiteaService . Name ( ) ,
}
err = user_model . LinkExternalToUser ( linkedUser , externalLoginUser )
assert . NoError ( t , err )
//
// When a user is linked to the external ID, it becomes the author of
// the migrated data
//
target = models . Release { }
err = uploader . remapExternalUser ( & source , & target )
assert . NoError ( t , err )
assert . EqualValues ( t , target . GetUserID ( ) , linkedUser . ID )
}