code.gitea.io/gitea@v1.21.7/models/perm/access/access_test.go (about)

     1  // Copyright 2017 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package access_test
     5  
     6  import (
     7  	"testing"
     8  
     9  	"code.gitea.io/gitea/models/db"
    10  	perm_model "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  	user_model "code.gitea.io/gitea/models/user"
    15  
    16  	"github.com/stretchr/testify/assert"
    17  )
    18  
    19  func TestAccessLevel(t *testing.T) {
    20  	assert.NoError(t, unittest.PrepareTestDatabase())
    21  
    22  	user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
    23  	user5 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5})
    24  	user29 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 29})
    25  	// A public repository owned by User 2
    26  	repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
    27  	assert.False(t, repo1.IsPrivate)
    28  	// A private repository owned by Org 3
    29  	repo3 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
    30  	assert.True(t, repo3.IsPrivate)
    31  
    32  	// Another public repository
    33  	repo4 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
    34  	assert.False(t, repo4.IsPrivate)
    35  	// org. owned private repo
    36  	repo24 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 24})
    37  
    38  	level, err := access_model.AccessLevel(db.DefaultContext, user2, repo1)
    39  	assert.NoError(t, err)
    40  	assert.Equal(t, perm_model.AccessModeOwner, level)
    41  
    42  	level, err = access_model.AccessLevel(db.DefaultContext, user2, repo3)
    43  	assert.NoError(t, err)
    44  	assert.Equal(t, perm_model.AccessModeOwner, level)
    45  
    46  	level, err = access_model.AccessLevel(db.DefaultContext, user5, repo1)
    47  	assert.NoError(t, err)
    48  	assert.Equal(t, perm_model.AccessModeRead, level)
    49  
    50  	level, err = access_model.AccessLevel(db.DefaultContext, user5, repo3)
    51  	assert.NoError(t, err)
    52  	assert.Equal(t, perm_model.AccessModeNone, level)
    53  
    54  	// restricted user has no access to a public repo
    55  	level, err = access_model.AccessLevel(db.DefaultContext, user29, repo1)
    56  	assert.NoError(t, err)
    57  	assert.Equal(t, perm_model.AccessModeNone, level)
    58  
    59  	// ... unless he's a collaborator
    60  	level, err = access_model.AccessLevel(db.DefaultContext, user29, repo4)
    61  	assert.NoError(t, err)
    62  	assert.Equal(t, perm_model.AccessModeWrite, level)
    63  
    64  	// ... or a team member
    65  	level, err = access_model.AccessLevel(db.DefaultContext, user29, repo24)
    66  	assert.NoError(t, err)
    67  	assert.Equal(t, perm_model.AccessModeRead, level)
    68  }
    69  
    70  func TestHasAccess(t *testing.T) {
    71  	assert.NoError(t, unittest.PrepareTestDatabase())
    72  
    73  	user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
    74  	user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5})
    75  	// A public repository owned by User 2
    76  	repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
    77  	assert.False(t, repo1.IsPrivate)
    78  	// A private repository owned by Org 3
    79  	repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
    80  	assert.True(t, repo2.IsPrivate)
    81  
    82  	has, err := access_model.HasAccess(db.DefaultContext, user1.ID, repo1)
    83  	assert.NoError(t, err)
    84  	assert.True(t, has)
    85  
    86  	_, err = access_model.HasAccess(db.DefaultContext, user1.ID, repo2)
    87  	assert.NoError(t, err)
    88  
    89  	_, err = access_model.HasAccess(db.DefaultContext, user2.ID, repo1)
    90  	assert.NoError(t, err)
    91  
    92  	_, err = access_model.HasAccess(db.DefaultContext, user2.ID, repo2)
    93  	assert.NoError(t, err)
    94  }
    95  
    96  func TestRepository_RecalculateAccesses(t *testing.T) {
    97  	// test with organization repo
    98  	assert.NoError(t, unittest.PrepareTestDatabase())
    99  	repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
   100  	assert.NoError(t, repo1.LoadOwner(db.DefaultContext))
   101  
   102  	_, err := db.GetEngine(db.DefaultContext).Delete(&repo_model.Collaboration{UserID: 2, RepoID: 3})
   103  	assert.NoError(t, err)
   104  	assert.NoError(t, access_model.RecalculateAccesses(db.DefaultContext, repo1))
   105  
   106  	access := &access_model.Access{UserID: 2, RepoID: 3}
   107  	has, err := db.GetEngine(db.DefaultContext).Get(access)
   108  	assert.NoError(t, err)
   109  	assert.True(t, has)
   110  	assert.Equal(t, perm_model.AccessModeOwner, access.Mode)
   111  }
   112  
   113  func TestRepository_RecalculateAccesses2(t *testing.T) {
   114  	// test with non-organization repo
   115  	assert.NoError(t, unittest.PrepareTestDatabase())
   116  	repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
   117  	assert.NoError(t, repo1.LoadOwner(db.DefaultContext))
   118  
   119  	_, err := db.GetEngine(db.DefaultContext).Delete(&repo_model.Collaboration{UserID: 4, RepoID: 4})
   120  	assert.NoError(t, err)
   121  	assert.NoError(t, access_model.RecalculateAccesses(db.DefaultContext, repo1))
   122  
   123  	has, err := db.GetEngine(db.DefaultContext).Get(&access_model.Access{UserID: 4, RepoID: 4})
   124  	assert.NoError(t, err)
   125  	assert.False(t, has)
   126  }