code.gitea.io/gitea@v1.22.3/models/repo/collaboration_test.go (about)

     1  // Copyright 2022 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package repo_test
     5  
     6  import (
     7  	"testing"
     8  
     9  	"code.gitea.io/gitea/models/db"
    10  	"code.gitea.io/gitea/models/perm"
    11  	access_model "code.gitea.io/gitea/models/perm/access"
    12  	repo_model "code.gitea.io/gitea/models/repo"
    13  	"code.gitea.io/gitea/models/unittest"
    14  
    15  	"github.com/stretchr/testify/assert"
    16  )
    17  
    18  func TestRepository_GetCollaborators(t *testing.T) {
    19  	assert.NoError(t, unittest.PrepareTestDatabase())
    20  	test := func(repoID int64) {
    21  		repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: repoID})
    22  		collaborators, _, err := repo_model.GetCollaborators(db.DefaultContext, &repo_model.FindCollaborationOptions{RepoID: repo.ID})
    23  		assert.NoError(t, err)
    24  		expectedLen, err := db.GetEngine(db.DefaultContext).Count(&repo_model.Collaboration{RepoID: repoID})
    25  		assert.NoError(t, err)
    26  		assert.Len(t, collaborators, int(expectedLen))
    27  		for _, collaborator := range collaborators {
    28  			assert.EqualValues(t, collaborator.User.ID, collaborator.Collaboration.UserID)
    29  			assert.EqualValues(t, repoID, collaborator.Collaboration.RepoID)
    30  		}
    31  	}
    32  	test(1)
    33  	test(2)
    34  	test(3)
    35  	test(4)
    36  
    37  	// Test db.ListOptions
    38  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 22})
    39  
    40  	collaborators1, _, err := repo_model.GetCollaborators(db.DefaultContext, &repo_model.FindCollaborationOptions{
    41  		ListOptions: db.ListOptions{PageSize: 1, Page: 1},
    42  		RepoID:      repo.ID,
    43  	})
    44  	assert.NoError(t, err)
    45  	assert.Len(t, collaborators1, 1)
    46  
    47  	collaborators2, _, err := repo_model.GetCollaborators(db.DefaultContext, &repo_model.FindCollaborationOptions{
    48  		ListOptions: db.ListOptions{PageSize: 1, Page: 2},
    49  		RepoID:      repo.ID,
    50  	})
    51  	assert.NoError(t, err)
    52  	assert.Len(t, collaborators2, 1)
    53  
    54  	assert.NotEqualValues(t, collaborators1[0].ID, collaborators2[0].ID)
    55  }
    56  
    57  func TestRepository_IsCollaborator(t *testing.T) {
    58  	assert.NoError(t, unittest.PrepareTestDatabase())
    59  
    60  	test := func(repoID, userID int64, expected bool) {
    61  		repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: repoID})
    62  		actual, err := repo_model.IsCollaborator(db.DefaultContext, repo.ID, userID)
    63  		assert.NoError(t, err)
    64  		assert.Equal(t, expected, actual)
    65  	}
    66  	test(3, 2, true)
    67  	test(3, unittest.NonexistentID, false)
    68  	test(4, 2, false)
    69  	test(4, 4, true)
    70  }
    71  
    72  func TestRepository_ChangeCollaborationAccessMode(t *testing.T) {
    73  	assert.NoError(t, unittest.PrepareTestDatabase())
    74  
    75  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
    76  	assert.NoError(t, repo_model.ChangeCollaborationAccessMode(db.DefaultContext, repo, 4, perm.AccessModeAdmin))
    77  
    78  	collaboration := unittest.AssertExistsAndLoadBean(t, &repo_model.Collaboration{RepoID: repo.ID, UserID: 4})
    79  	assert.EqualValues(t, perm.AccessModeAdmin, collaboration.Mode)
    80  
    81  	access := unittest.AssertExistsAndLoadBean(t, &access_model.Access{UserID: 4, RepoID: repo.ID})
    82  	assert.EqualValues(t, perm.AccessModeAdmin, access.Mode)
    83  
    84  	assert.NoError(t, repo_model.ChangeCollaborationAccessMode(db.DefaultContext, repo, 4, perm.AccessModeAdmin))
    85  
    86  	assert.NoError(t, repo_model.ChangeCollaborationAccessMode(db.DefaultContext, repo, unittest.NonexistentID, perm.AccessModeAdmin))
    87  
    88  	// Disvard invalid input.
    89  	assert.NoError(t, repo_model.ChangeCollaborationAccessMode(db.DefaultContext, repo, 4, perm.AccessMode(unittest.NonexistentID)))
    90  
    91  	unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: repo.ID})
    92  }
    93  
    94  func TestRepository_IsOwnerMemberCollaborator(t *testing.T) {
    95  	assert.NoError(t, unittest.PrepareTestDatabase())
    96  
    97  	repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
    98  
    99  	// Organisation owner.
   100  	actual, err := repo_model.IsOwnerMemberCollaborator(db.DefaultContext, repo1, 2)
   101  	assert.NoError(t, err)
   102  	assert.True(t, actual)
   103  
   104  	// Team member.
   105  	actual, err = repo_model.IsOwnerMemberCollaborator(db.DefaultContext, repo1, 4)
   106  	assert.NoError(t, err)
   107  	assert.True(t, actual)
   108  
   109  	// Normal user.
   110  	actual, err = repo_model.IsOwnerMemberCollaborator(db.DefaultContext, repo1, 1)
   111  	assert.NoError(t, err)
   112  	assert.False(t, actual)
   113  
   114  	repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
   115  
   116  	// Collaborator.
   117  	actual, err = repo_model.IsOwnerMemberCollaborator(db.DefaultContext, repo2, 4)
   118  	assert.NoError(t, err)
   119  	assert.True(t, actual)
   120  
   121  	repo3 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 15})
   122  
   123  	// Repository owner.
   124  	actual, err = repo_model.IsOwnerMemberCollaborator(db.DefaultContext, repo3, 2)
   125  	assert.NoError(t, err)
   126  	assert.True(t, actual)
   127  }
   128  
   129  func TestRepo_GetCollaboration(t *testing.T) {
   130  	assert.NoError(t, unittest.PrepareTestDatabase())
   131  
   132  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
   133  
   134  	// Existing collaboration.
   135  	collab, err := repo_model.GetCollaboration(db.DefaultContext, repo.ID, 4)
   136  	assert.NoError(t, err)
   137  	assert.NotNil(t, collab)
   138  	assert.EqualValues(t, 4, collab.UserID)
   139  	assert.EqualValues(t, 4, collab.RepoID)
   140  
   141  	// Non-existing collaboration.
   142  	collab, err = repo_model.GetCollaboration(db.DefaultContext, repo.ID, 1)
   143  	assert.NoError(t, err)
   144  	assert.Nil(t, collab)
   145  }