code.gitea.io/gitea@v1.22.3/services/repository/transfer_test.go (about) 1 // Copyright 2019 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package repository 5 6 import ( 7 "sync" 8 "testing" 9 10 "code.gitea.io/gitea/models" 11 activities_model "code.gitea.io/gitea/models/activities" 12 "code.gitea.io/gitea/models/db" 13 "code.gitea.io/gitea/models/organization" 14 access_model "code.gitea.io/gitea/models/perm/access" 15 repo_model "code.gitea.io/gitea/models/repo" 16 "code.gitea.io/gitea/models/unittest" 17 user_model "code.gitea.io/gitea/models/user" 18 "code.gitea.io/gitea/modules/util" 19 "code.gitea.io/gitea/services/feed" 20 notify_service "code.gitea.io/gitea/services/notify" 21 22 "github.com/stretchr/testify/assert" 23 ) 24 25 var notifySync sync.Once 26 27 func registerNotifier() { 28 notifySync.Do(func() { 29 notify_service.RegisterNotifier(feed.NewNotifier()) 30 }) 31 } 32 33 func TestTransferOwnership(t *testing.T) { 34 registerNotifier() 35 36 assert.NoError(t, unittest.PrepareTestDatabase()) 37 38 doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 39 repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}) 40 repo.Owner = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) 41 assert.NoError(t, TransferOwnership(db.DefaultContext, doer, doer, repo, nil)) 42 43 transferredRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}) 44 assert.EqualValues(t, 2, transferredRepo.OwnerID) 45 46 exist, err := util.IsExist(repo_model.RepoPath("org3", "repo3")) 47 assert.NoError(t, err) 48 assert.False(t, exist) 49 exist, err = util.IsExist(repo_model.RepoPath("user2", "repo3")) 50 assert.NoError(t, err) 51 assert.True(t, exist) 52 unittest.AssertExistsAndLoadBean(t, &activities_model.Action{ 53 OpType: activities_model.ActionTransferRepo, 54 ActUserID: 2, 55 RepoID: 3, 56 Content: "org3/repo3", 57 }) 58 59 unittest.CheckConsistencyFor(t, &repo_model.Repository{}, &user_model.User{}, &organization.Team{}) 60 } 61 62 func TestStartRepositoryTransferSetPermission(t *testing.T) { 63 assert.NoError(t, unittest.PrepareTestDatabase()) 64 65 doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}) 66 recipient := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}) 67 repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}) 68 repo.Owner = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) 69 70 hasAccess, err := access_model.HasAnyUnitAccess(db.DefaultContext, recipient.ID, repo) 71 assert.NoError(t, err) 72 assert.False(t, hasAccess) 73 74 assert.NoError(t, StartRepositoryTransfer(db.DefaultContext, doer, recipient, repo, nil)) 75 76 hasAccess, err = access_model.HasAnyUnitAccess(db.DefaultContext, recipient.ID, repo) 77 assert.NoError(t, err) 78 assert.True(t, hasAccess) 79 80 unittest.CheckConsistencyFor(t, &repo_model.Repository{}, &user_model.User{}, &organization.Team{}) 81 } 82 83 func TestRepositoryTransfer(t *testing.T) { 84 assert.NoError(t, unittest.PrepareTestDatabase()) 85 86 doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}) 87 repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}) 88 89 transfer, err := models.GetPendingRepositoryTransfer(db.DefaultContext, repo) 90 assert.NoError(t, err) 91 assert.NotNil(t, transfer) 92 93 // Cancel transfer 94 assert.NoError(t, CancelRepositoryTransfer(db.DefaultContext, repo)) 95 96 transfer, err = models.GetPendingRepositoryTransfer(db.DefaultContext, repo) 97 assert.Error(t, err) 98 assert.Nil(t, transfer) 99 assert.True(t, models.IsErrNoPendingTransfer(err)) 100 101 user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 102 103 assert.NoError(t, models.CreatePendingRepositoryTransfer(db.DefaultContext, doer, user2, repo.ID, nil)) 104 105 transfer, err = models.GetPendingRepositoryTransfer(db.DefaultContext, repo) 106 assert.Nil(t, err) 107 assert.NoError(t, transfer.LoadAttributes(db.DefaultContext)) 108 assert.Equal(t, "user2", transfer.Recipient.Name) 109 110 org6 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 111 112 // Only transfer can be started at any given time 113 err = models.CreatePendingRepositoryTransfer(db.DefaultContext, doer, org6, repo.ID, nil) 114 assert.Error(t, err) 115 assert.True(t, models.IsErrRepoTransferInProgress(err)) 116 117 // Unknown user 118 err = models.CreatePendingRepositoryTransfer(db.DefaultContext, doer, &user_model.User{ID: 1000, LowerName: "user1000"}, repo.ID, nil) 119 assert.Error(t, err) 120 121 // Cancel transfer 122 assert.NoError(t, CancelRepositoryTransfer(db.DefaultContext, repo)) 123 }