code.gitea.io/gitea@v1.22.3/models/git/branch_test.go (about)

     1  // Copyright 2017 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package git_test
     5  
     6  import (
     7  	"context"
     8  	"testing"
     9  
    10  	"code.gitea.io/gitea/models/db"
    11  	git_model "code.gitea.io/gitea/models/git"
    12  	issues_model "code.gitea.io/gitea/models/issues"
    13  	repo_model "code.gitea.io/gitea/models/repo"
    14  	"code.gitea.io/gitea/models/unittest"
    15  	"code.gitea.io/gitea/modules/git"
    16  	"code.gitea.io/gitea/modules/optional"
    17  
    18  	"github.com/stretchr/testify/assert"
    19  )
    20  
    21  func TestAddDeletedBranch(t *testing.T) {
    22  	assert.NoError(t, unittest.PrepareTestDatabase())
    23  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
    24  	assert.EqualValues(t, git.Sha1ObjectFormat.Name(), repo.ObjectFormatName)
    25  	firstBranch := unittest.AssertExistsAndLoadBean(t, &git_model.Branch{ID: 1})
    26  
    27  	assert.True(t, firstBranch.IsDeleted)
    28  	assert.NoError(t, git_model.AddDeletedBranch(db.DefaultContext, repo.ID, firstBranch.Name, firstBranch.DeletedByID))
    29  	assert.NoError(t, git_model.AddDeletedBranch(db.DefaultContext, repo.ID, "branch2", int64(1)))
    30  
    31  	secondBranch := unittest.AssertExistsAndLoadBean(t, &git_model.Branch{RepoID: repo.ID, Name: "branch2"})
    32  	assert.True(t, secondBranch.IsDeleted)
    33  
    34  	commit := &git.Commit{
    35  		ID:            git.MustIDFromString(secondBranch.CommitID),
    36  		CommitMessage: secondBranch.CommitMessage,
    37  		Committer: &git.Signature{
    38  			When: secondBranch.CommitTime.AsLocalTime(),
    39  		},
    40  	}
    41  
    42  	_, err := git_model.UpdateBranch(db.DefaultContext, repo.ID, secondBranch.PusherID, secondBranch.Name, commit)
    43  	assert.NoError(t, err)
    44  }
    45  
    46  func TestGetDeletedBranches(t *testing.T) {
    47  	assert.NoError(t, unittest.PrepareTestDatabase())
    48  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
    49  
    50  	branches, err := db.Find[git_model.Branch](db.DefaultContext, git_model.FindBranchOptions{
    51  		ListOptions:     db.ListOptionsAll,
    52  		RepoID:          repo.ID,
    53  		IsDeletedBranch: optional.Some(true),
    54  	})
    55  	assert.NoError(t, err)
    56  	assert.Len(t, branches, 2)
    57  }
    58  
    59  func TestGetDeletedBranch(t *testing.T) {
    60  	assert.NoError(t, unittest.PrepareTestDatabase())
    61  	firstBranch := unittest.AssertExistsAndLoadBean(t, &git_model.Branch{ID: 1})
    62  
    63  	assert.NotNil(t, getDeletedBranch(t, firstBranch))
    64  }
    65  
    66  func TestDeletedBranchLoadUser(t *testing.T) {
    67  	assert.NoError(t, unittest.PrepareTestDatabase())
    68  
    69  	firstBranch := unittest.AssertExistsAndLoadBean(t, &git_model.Branch{ID: 1})
    70  	secondBranch := unittest.AssertExistsAndLoadBean(t, &git_model.Branch{ID: 2})
    71  
    72  	branch := getDeletedBranch(t, firstBranch)
    73  	assert.Nil(t, branch.DeletedBy)
    74  	branch.LoadDeletedBy(db.DefaultContext)
    75  	assert.NotNil(t, branch.DeletedBy)
    76  	assert.Equal(t, "user1", branch.DeletedBy.Name)
    77  
    78  	branch = getDeletedBranch(t, secondBranch)
    79  	assert.Nil(t, branch.DeletedBy)
    80  	branch.LoadDeletedBy(db.DefaultContext)
    81  	assert.NotNil(t, branch.DeletedBy)
    82  	assert.Equal(t, "Ghost", branch.DeletedBy.Name)
    83  }
    84  
    85  func TestRemoveDeletedBranch(t *testing.T) {
    86  	assert.NoError(t, unittest.PrepareTestDatabase())
    87  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
    88  
    89  	firstBranch := unittest.AssertExistsAndLoadBean(t, &git_model.Branch{ID: 1})
    90  
    91  	err := git_model.RemoveDeletedBranchByID(db.DefaultContext, repo.ID, 1)
    92  	assert.NoError(t, err)
    93  	unittest.AssertNotExistsBean(t, firstBranch)
    94  	unittest.AssertExistsAndLoadBean(t, &git_model.Branch{ID: 2})
    95  }
    96  
    97  func getDeletedBranch(t *testing.T, branch *git_model.Branch) *git_model.Branch {
    98  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
    99  
   100  	deletedBranch, err := git_model.GetDeletedBranchByID(db.DefaultContext, repo.ID, branch.ID)
   101  	assert.NoError(t, err)
   102  	assert.Equal(t, branch.ID, deletedBranch.ID)
   103  	assert.Equal(t, branch.Name, deletedBranch.Name)
   104  	assert.Equal(t, branch.CommitID, deletedBranch.CommitID)
   105  	assert.Equal(t, branch.DeletedByID, deletedBranch.DeletedByID)
   106  
   107  	return deletedBranch
   108  }
   109  
   110  func TestFindRenamedBranch(t *testing.T) {
   111  	assert.NoError(t, unittest.PrepareTestDatabase())
   112  	branch, exist, err := git_model.FindRenamedBranch(db.DefaultContext, 1, "dev")
   113  	assert.NoError(t, err)
   114  	assert.True(t, exist)
   115  	assert.Equal(t, "master", branch.To)
   116  
   117  	_, exist, err = git_model.FindRenamedBranch(db.DefaultContext, 1, "unknow")
   118  	assert.NoError(t, err)
   119  	assert.False(t, exist)
   120  }
   121  
   122  func TestRenameBranch(t *testing.T) {
   123  	assert.NoError(t, unittest.PrepareTestDatabase())
   124  	repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
   125  	_isDefault := false
   126  
   127  	ctx, committer, err := db.TxContext(db.DefaultContext)
   128  	defer committer.Close()
   129  	assert.NoError(t, err)
   130  	assert.NoError(t, git_model.UpdateProtectBranch(ctx, repo1, &git_model.ProtectedBranch{
   131  		RepoID:   repo1.ID,
   132  		RuleName: "master",
   133  	}, git_model.WhitelistOptions{}))
   134  	assert.NoError(t, committer.Commit())
   135  
   136  	assert.NoError(t, git_model.RenameBranch(db.DefaultContext, repo1, "master", "main", func(ctx context.Context, isDefault bool) error {
   137  		_isDefault = isDefault
   138  		return nil
   139  	}))
   140  
   141  	assert.True(t, _isDefault)
   142  	repo1 = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
   143  	assert.Equal(t, "main", repo1.DefaultBranch)
   144  
   145  	pull := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 1}) // merged
   146  	assert.Equal(t, "master", pull.BaseBranch)
   147  
   148  	pull = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2}) // open
   149  	assert.Equal(t, "main", pull.BaseBranch)
   150  
   151  	renamedBranch := unittest.AssertExistsAndLoadBean(t, &git_model.RenamedBranch{ID: 2})
   152  	assert.Equal(t, "master", renamedBranch.From)
   153  	assert.Equal(t, "main", renamedBranch.To)
   154  	assert.Equal(t, int64(1), renamedBranch.RepoID)
   155  
   156  	unittest.AssertExistsAndLoadBean(t, &git_model.ProtectedBranch{
   157  		RepoID:   repo1.ID,
   158  		RuleName: "main",
   159  	})
   160  }
   161  
   162  func TestOnlyGetDeletedBranchOnCorrectRepo(t *testing.T) {
   163  	assert.NoError(t, unittest.PrepareTestDatabase())
   164  
   165  	// Get deletedBranch with ID of 1 on repo with ID 2.
   166  	// This should return a nil branch as this deleted branch
   167  	// is actually on repo with ID 1.
   168  	repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
   169  
   170  	deletedBranch, err := git_model.GetDeletedBranchByID(db.DefaultContext, repo2.ID, 1)
   171  
   172  	// Expect error, and the returned branch is nil.
   173  	assert.Error(t, err)
   174  	assert.Nil(t, deletedBranch)
   175  
   176  	// Now get the deletedBranch with ID of 1 on repo with ID 1.
   177  	// This should return the deletedBranch.
   178  	repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
   179  
   180  	deletedBranch, err = git_model.GetDeletedBranchByID(db.DefaultContext, repo1.ID, 1)
   181  
   182  	// Expect no error, and the returned branch to be not nil.
   183  	assert.NoError(t, err)
   184  	assert.NotNil(t, deletedBranch)
   185  }