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  }