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 }