@@ -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