@@ -6,12 +6,16 @@ package access
66import (
77 "testing"
88
9+ "code.gitea.io/gitea/models/db"
10+ "code.gitea.io/gitea/models/organization"
911 perm_model "code.gitea.io/gitea/models/perm"
1012 repo_model "code.gitea.io/gitea/models/repo"
1113 "code.gitea.io/gitea/models/unit"
14+ "code.gitea.io/gitea/models/unittest"
1215 user_model "code.gitea.io/gitea/models/user"
1316
1417 "github.com/stretchr/testify/assert"
18+ "github.com/stretchr/testify/require"
1519)
1620
1721func TestHasAnyUnitAccess (t * testing.T ) {
@@ -152,3 +156,45 @@ func TestUnitAccessMode(t *testing.T) {
152156 }
153157 assert .Equal (t , perm_model .AccessModeRead , perm .UnitAccessMode (unit .TypeWiki ), "has unit, and map, use map" )
154158}
159+
160+ func TestGetUserRepoPermission (t * testing.T ) {
161+ assert .NoError (t , unittest .PrepareTestDatabase ())
162+ ctx := t .Context ()
163+ repo32 := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {ID : 32 }) // org public repo
164+ require .NoError (t , repo32 .LoadOwner (ctx ))
165+ require .True (t , repo32 .Owner .IsOrganization ())
166+
167+ require .NoError (t , db .TruncateBeans (ctx , & organization.Team {}, & organization.TeamUser {}, & organization.TeamRepo {}, & organization.TeamUnit {}))
168+ org := repo32 .Owner
169+ user := unittest .AssertExistsAndLoadBean (t , & user_model.User {ID : 4 })
170+ team := & organization.Team {OrgID : org .ID , LowerName : "test_team" }
171+ require .NoError (t , db .Insert (ctx , team ))
172+
173+ t .Run ("DoerInTeamWithNoRepo" , func (t * testing.T ) {
174+ require .NoError (t , db .Insert (ctx , & organization.TeamUser {OrgID : org .ID , TeamID : team .ID , UID : user .ID }))
175+ perm , err := GetUserRepoPermission (ctx , repo32 , user )
176+ require .NoError (t , err )
177+ assert .Equal (t , perm_model .AccessModeRead , perm .AccessMode )
178+ assert .Nil (t , perm .unitsMode ) // doer in the team, but has no access to the repo
179+ })
180+
181+ require .NoError (t , db .Insert (ctx , & organization.TeamRepo {OrgID : org .ID , TeamID : team .ID , RepoID : repo32 .ID }))
182+ require .NoError (t , db .Insert (ctx , & organization.TeamUnit {OrgID : org .ID , TeamID : team .ID , Type : unit .TypeCode , AccessMode : perm_model .AccessModeNone }))
183+ t .Run ("DoerWithTeamUnitAccessNone" , func (t * testing.T ) {
184+ perm , err := GetUserRepoPermission (ctx , repo32 , user )
185+ require .NoError (t , err )
186+ assert .Equal (t , perm_model .AccessModeRead , perm .AccessMode )
187+ assert .Equal (t , perm_model .AccessModeRead , perm .unitsMode [unit .TypeCode ])
188+ assert .Equal (t , perm_model .AccessModeRead , perm .unitsMode [unit .TypeIssues ])
189+ })
190+
191+ require .NoError (t , db .TruncateBeans (ctx , & organization.TeamUnit {}))
192+ require .NoError (t , db .Insert (ctx , & organization.TeamUnit {OrgID : org .ID , TeamID : team .ID , Type : unit .TypeCode , AccessMode : perm_model .AccessModeWrite }))
193+ t .Run ("DoerWithTeamUnitAccessWrite" , func (t * testing.T ) {
194+ perm , err := GetUserRepoPermission (ctx , repo32 , user )
195+ require .NoError (t , err )
196+ assert .Equal (t , perm_model .AccessModeRead , perm .AccessMode )
197+ assert .Equal (t , perm_model .AccessModeWrite , perm .unitsMode [unit .TypeCode ])
198+ assert .Equal (t , perm_model .AccessModeRead , perm .unitsMode [unit .TypeIssues ])
199+ })
200+ }
0 commit comments