code.gitea.io/gitea@v1.22.3/models/perm/access/repo_permission_test.go (about)

     1  // Copyright 2024 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package access
     5  
     6  import (
     7  	"testing"
     8  
     9  	perm_model "code.gitea.io/gitea/models/perm"
    10  	repo_model "code.gitea.io/gitea/models/repo"
    11  	"code.gitea.io/gitea/models/unit"
    12  	user_model "code.gitea.io/gitea/models/user"
    13  
    14  	"github.com/stretchr/testify/assert"
    15  )
    16  
    17  func TestHasAnyUnitAccess(t *testing.T) {
    18  	perm := Permission{}
    19  	assert.False(t, perm.HasAnyUnitAccess())
    20  
    21  	perm = Permission{
    22  		units: []*repo_model.RepoUnit{{Type: unit.TypeWiki}},
    23  	}
    24  	assert.False(t, perm.HasAnyUnitAccess())
    25  	assert.False(t, perm.HasAnyUnitAccessOrEveryoneAccess())
    26  
    27  	perm = Permission{
    28  		units:              []*repo_model.RepoUnit{{Type: unit.TypeWiki}},
    29  		everyoneAccessMode: map[unit.Type]perm_model.AccessMode{unit.TypeIssues: perm_model.AccessModeRead},
    30  	}
    31  	assert.False(t, perm.HasAnyUnitAccess())
    32  	assert.True(t, perm.HasAnyUnitAccessOrEveryoneAccess())
    33  
    34  	perm = Permission{
    35  		AccessMode: perm_model.AccessModeRead,
    36  		units:      []*repo_model.RepoUnit{{Type: unit.TypeWiki}},
    37  	}
    38  	assert.True(t, perm.HasAnyUnitAccess())
    39  
    40  	perm = Permission{
    41  		unitsMode: map[unit.Type]perm_model.AccessMode{unit.TypeWiki: perm_model.AccessModeRead},
    42  	}
    43  	assert.True(t, perm.HasAnyUnitAccess())
    44  }
    45  
    46  func TestApplyEveryoneRepoPermission(t *testing.T) {
    47  	perm := Permission{
    48  		AccessMode: perm_model.AccessModeNone,
    49  		units: []*repo_model.RepoUnit{
    50  			{Type: unit.TypeWiki, EveryoneAccessMode: perm_model.AccessModeRead},
    51  		},
    52  	}
    53  	applyEveryoneRepoPermission(nil, &perm)
    54  	assert.False(t, perm.CanRead(unit.TypeWiki))
    55  
    56  	perm = Permission{
    57  		AccessMode: perm_model.AccessModeNone,
    58  		units: []*repo_model.RepoUnit{
    59  			{Type: unit.TypeWiki, EveryoneAccessMode: perm_model.AccessModeRead},
    60  		},
    61  	}
    62  	applyEveryoneRepoPermission(&user_model.User{ID: 0}, &perm)
    63  	assert.False(t, perm.CanRead(unit.TypeWiki))
    64  
    65  	perm = Permission{
    66  		AccessMode: perm_model.AccessModeNone,
    67  		units: []*repo_model.RepoUnit{
    68  			{Type: unit.TypeWiki, EveryoneAccessMode: perm_model.AccessModeRead},
    69  		},
    70  	}
    71  	applyEveryoneRepoPermission(&user_model.User{ID: 1}, &perm)
    72  	assert.True(t, perm.CanRead(unit.TypeWiki))
    73  
    74  	perm = Permission{
    75  		AccessMode: perm_model.AccessModeWrite,
    76  		units: []*repo_model.RepoUnit{
    77  			{Type: unit.TypeWiki, EveryoneAccessMode: perm_model.AccessModeRead},
    78  		},
    79  	}
    80  	applyEveryoneRepoPermission(&user_model.User{ID: 1}, &perm)
    81  	// it should work the same as "EveryoneAccessMode: none" because the default AccessMode should be applied to units
    82  	assert.True(t, perm.CanWrite(unit.TypeWiki))
    83  
    84  	perm = Permission{
    85  		units: []*repo_model.RepoUnit{
    86  			{Type: unit.TypeWiki, EveryoneAccessMode: perm_model.AccessModeRead},
    87  		},
    88  		unitsMode: map[unit.Type]perm_model.AccessMode{
    89  			unit.TypeWiki: perm_model.AccessModeWrite,
    90  		},
    91  	}
    92  	applyEveryoneRepoPermission(&user_model.User{ID: 1}, &perm)
    93  	assert.True(t, perm.CanWrite(unit.TypeWiki))
    94  }
    95  
    96  func TestUnitAccessMode(t *testing.T) {
    97  	perm := Permission{
    98  		AccessMode: perm_model.AccessModeNone,
    99  	}
   100  	assert.Equal(t, perm_model.AccessModeNone, perm.UnitAccessMode(unit.TypeWiki), "no unit, no map, use AccessMode")
   101  
   102  	perm = Permission{
   103  		AccessMode: perm_model.AccessModeRead,
   104  		units: []*repo_model.RepoUnit{
   105  			{Type: unit.TypeWiki},
   106  		},
   107  	}
   108  	assert.Equal(t, perm_model.AccessModeRead, perm.UnitAccessMode(unit.TypeWiki), "only unit, no map, use AccessMode")
   109  
   110  	perm = Permission{
   111  		AccessMode: perm_model.AccessModeAdmin,
   112  		unitsMode: map[unit.Type]perm_model.AccessMode{
   113  			unit.TypeWiki: perm_model.AccessModeRead,
   114  		},
   115  	}
   116  	assert.Equal(t, perm_model.AccessModeAdmin, perm.UnitAccessMode(unit.TypeWiki), "no unit, only map, admin overrides map")
   117  
   118  	perm = Permission{
   119  		AccessMode: perm_model.AccessModeNone,
   120  		unitsMode: map[unit.Type]perm_model.AccessMode{
   121  			unit.TypeWiki: perm_model.AccessModeRead,
   122  		},
   123  	}
   124  	assert.Equal(t, perm_model.AccessModeRead, perm.UnitAccessMode(unit.TypeWiki), "no unit, only map, use map")
   125  
   126  	perm = Permission{
   127  		AccessMode: perm_model.AccessModeNone,
   128  		units: []*repo_model.RepoUnit{
   129  			{Type: unit.TypeWiki},
   130  		},
   131  		unitsMode: map[unit.Type]perm_model.AccessMode{
   132  			unit.TypeWiki: perm_model.AccessModeRead,
   133  		},
   134  	}
   135  	assert.Equal(t, perm_model.AccessModeRead, perm.UnitAccessMode(unit.TypeWiki), "has unit, and map, use map")
   136  }