2017-02-22 20:36:15 -05:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2017-02-22 20:36:15 -05:00
package models
import (
"strings"
"testing"
2021-11-24 17:49:20 +08:00
"code.gitea.io/gitea/models/db"
2022-03-29 14:29:02 +08:00
"code.gitea.io/gitea/models/organization"
2021-11-28 19:58:28 +08:00
"code.gitea.io/gitea/models/perm"
2022-05-11 18:09:36 +08:00
access_model "code.gitea.io/gitea/models/perm/access"
2021-12-10 09:27:50 +08:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-12 22:36:47 +08:00
"code.gitea.io/gitea/models/unittest"
2021-11-24 17:49:20 +08:00
user_model "code.gitea.io/gitea/models/user"
2021-11-17 20:34:35 +08:00
2017-02-22 20:36:15 -05:00
"github.com/stretchr/testify/assert"
)
func TestTeam_AddMember ( t * testing . T ) {
2021-11-12 22:36:47 +08:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-22 20:36:15 -05:00
2024-03-04 09:16:03 +01:00
test := func ( team * organization . Team , user * user_model . User ) {
assert . NoError ( t , AddTeamMember ( db . DefaultContext , team , user ) )
unittest . AssertExistsAndLoadBean ( t , & organization . TeamUser { UID : user . ID , TeamID : team . ID } )
unittest . CheckConsistencyFor ( t , & organization . Team { ID : team . ID } , & user_model . User { ID : team . OrgID } )
2017-02-22 20:36:15 -05:00
}
2024-03-04 09:16:03 +01:00
team1 := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 1 } )
team3 := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 3 } )
user2 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
user4 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 4 } )
test ( team1 , user2 )
test ( team1 , user4 )
test ( team3 , user2 )
2017-02-22 20:36:15 -05:00
}
func TestTeam_RemoveMember ( t * testing . T ) {
2021-11-12 22:36:47 +08:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-22 20:36:15 -05:00
2024-03-04 09:16:03 +01:00
testSuccess := func ( team * organization . Team , user * user_model . User ) {
assert . NoError ( t , RemoveTeamMember ( db . DefaultContext , team , user ) )
unittest . AssertNotExistsBean ( t , & organization . TeamUser { UID : user . ID , TeamID : team . ID } )
unittest . CheckConsistencyFor ( t , & organization . Team { ID : team . ID } )
2017-02-22 20:36:15 -05:00
}
2024-03-04 09:16:03 +01:00
team1 := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 1 } )
team2 := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 2 } )
team3 := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 3 } )
user2 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
user4 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 4 } )
testSuccess ( team1 , user4 )
testSuccess ( team2 , user2 )
testSuccess ( team3 , user2 )
err := RemoveTeamMember ( db . DefaultContext , team1 , user2 )
2022-03-29 14:29:02 +08:00
assert . True ( t , organization . IsErrLastOrgOwner ( err ) )
2017-02-22 20:36:15 -05:00
}
func TestIsUsableTeamName ( t * testing . T ) {
2022-03-29 14:29:02 +08:00
assert . NoError ( t , organization . IsUsableTeamName ( "usable" ) )
assert . True ( t , db . IsErrNameReserved ( organization . IsUsableTeamName ( "new" ) ) )
2017-02-22 20:36:15 -05:00
}
func TestNewTeam ( t * testing . T ) {
2021-11-12 22:36:47 +08:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-22 20:36:15 -05:00
const teamName = "newTeamName"
2022-03-29 14:29:02 +08:00
team := & organization . Team { Name : teamName , OrgID : 3 }
2023-09-14 19:09:32 +02:00
assert . NoError ( t , NewTeam ( db . DefaultContext , team ) )
2022-03-29 14:29:02 +08:00
unittest . AssertExistsAndLoadBean ( t , & organization . Team { Name : teamName } )
unittest . CheckConsistencyFor ( t , & organization . Team { } , & user_model . User { ID : team . OrgID } )
2017-02-22 20:36:15 -05:00
}
func TestUpdateTeam ( t * testing . T ) {
// successful update
2021-11-12 22:36:47 +08:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-22 20:36:15 -05:00
2022-08-16 10:22:25 +08:00
team := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 2 } )
2017-02-22 20:36:15 -05:00
team . LowerName = "newname"
team . Name = "newName"
team . Description = strings . Repeat ( "A long description!" , 100 )
2022-01-05 11:37:00 +08:00
team . AccessMode = perm . AccessModeAdmin
2023-09-14 19:09:32 +02:00
assert . NoError ( t , UpdateTeam ( db . DefaultContext , team , true , false ) )
2017-02-22 20:36:15 -05:00
2022-08-16 10:22:25 +08:00
team = unittest . AssertExistsAndLoadBean ( t , & organization . Team { Name : "newName" } )
2017-02-22 20:36:15 -05:00
assert . True ( t , strings . HasPrefix ( team . Description , "A long description!" ) )
2022-08-16 10:22:25 +08:00
access := unittest . AssertExistsAndLoadBean ( t , & access_model . Access { UserID : 4 , RepoID : 3 } )
2021-11-28 19:58:28 +08:00
assert . EqualValues ( t , perm . AccessModeAdmin , access . Mode )
2017-02-22 20:36:15 -05:00
2022-03-29 14:29:02 +08:00
unittest . CheckConsistencyFor ( t , & organization . Team { ID : team . ID } )
2017-02-22 20:36:15 -05:00
}
func TestUpdateTeam2 ( t * testing . T ) {
// update to already-existing team
2021-11-12 22:36:47 +08:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-22 20:36:15 -05:00
2022-08-16 10:22:25 +08:00
team := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 2 } )
2017-02-22 20:36:15 -05:00
team . LowerName = "owners"
team . Name = "Owners"
team . Description = strings . Repeat ( "A long description!" , 100 )
2023-09-14 19:09:32 +02:00
err := UpdateTeam ( db . DefaultContext , team , true , false )
2022-03-29 14:29:02 +08:00
assert . True ( t , organization . IsErrTeamAlreadyExist ( err ) )
2017-02-22 20:36:15 -05:00
2022-03-29 14:29:02 +08:00
unittest . CheckConsistencyFor ( t , & organization . Team { ID : team . ID } )
2017-02-22 20:36:15 -05:00
}
func TestDeleteTeam ( t * testing . T ) {
2021-11-12 22:36:47 +08:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-22 20:36:15 -05:00
2022-08-16 10:22:25 +08:00
team := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 2 } )
2023-09-14 19:09:32 +02:00
assert . NoError ( t , DeleteTeam ( db . DefaultContext , team ) )
2022-03-29 14:29:02 +08:00
unittest . AssertNotExistsBean ( t , & organization . Team { ID : team . ID } )
unittest . AssertNotExistsBean ( t , & organization . TeamRepo { TeamID : team . ID } )
unittest . AssertNotExistsBean ( t , & organization . TeamUser { TeamID : team . ID } )
2017-02-22 20:36:15 -05:00
// check that team members don't have "leftover" access to repos
2022-08-16 10:22:25 +08:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 4 } )
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 3 } )
2022-11-19 09:12:33 +01:00
accessMode , err := access_model . AccessLevel ( db . DefaultContext , user , repo )
2017-02-22 20:36:15 -05:00
assert . NoError ( t , err )
2021-11-28 19:58:28 +08:00
assert . True ( t , accessMode < perm . AccessModeWrite )
2017-02-22 20:36:15 -05:00
}
func TestAddTeamMember ( t * testing . T ) {
2021-11-12 22:36:47 +08:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-22 20:36:15 -05:00
2024-03-04 09:16:03 +01:00
test := func ( team * organization . Team , user * user_model . User ) {
assert . NoError ( t , AddTeamMember ( db . DefaultContext , team , user ) )
unittest . AssertExistsAndLoadBean ( t , & organization . TeamUser { UID : user . ID , TeamID : team . ID } )
unittest . CheckConsistencyFor ( t , & organization . Team { ID : team . ID } , & user_model . User { ID : team . OrgID } )
2017-02-22 20:36:15 -05:00
}
2024-03-04 09:16:03 +01:00
team1 := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 1 } )
team3 := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 3 } )
user2 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
user4 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 4 } )
test ( team1 , user2 )
test ( team1 , user4 )
test ( team3 , user2 )
2017-02-22 20:36:15 -05:00
}
func TestRemoveTeamMember ( t * testing . T ) {
2021-11-12 22:36:47 +08:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-22 20:36:15 -05:00
2024-03-04 09:16:03 +01:00
testSuccess := func ( team * organization . Team , user * user_model . User ) {
assert . NoError ( t , RemoveTeamMember ( db . DefaultContext , team , user ) )
unittest . AssertNotExistsBean ( t , & organization . TeamUser { UID : user . ID , TeamID : team . ID } )
unittest . CheckConsistencyFor ( t , & organization . Team { ID : team . ID } )
2017-02-22 20:36:15 -05:00
}
2024-03-04 09:16:03 +01:00
team1 := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 1 } )
team2 := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 2 } )
team3 := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 3 } )
user2 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
user4 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 4 } )
testSuccess ( team1 , user4 )
testSuccess ( team2 , user2 )
testSuccess ( team3 , user2 )
err := RemoveTeamMember ( db . DefaultContext , team1 , user2 )
2022-03-29 14:29:02 +08:00
assert . True ( t , organization . IsErrLastOrgOwner ( err ) )
2018-12-11 12:28:37 +01:00
}
2022-05-11 18:09:36 +08:00
func TestRepository_RecalculateAccesses3 ( t * testing . T ) {
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-08-16 10:22:25 +08:00
team5 := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 5 } )
user29 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 29 } )
2022-05-11 18:09:36 +08:00
2024-03-04 09:16:03 +01:00
has , err := db . GetEngine ( db . DefaultContext ) . Get ( & access_model . Access { UserID : user29 . ID , RepoID : 23 } )
2022-05-11 18:09:36 +08:00
assert . NoError ( t , err )
assert . False ( t , has )
// adding user29 to team5 should add an explicit access row for repo 23
// even though repo 23 is public
2024-03-04 09:16:03 +01:00
assert . NoError ( t , AddTeamMember ( db . DefaultContext , team5 , user29 ) )
2022-05-11 18:09:36 +08:00
2024-03-04 09:16:03 +01:00
has , err = db . GetEngine ( db . DefaultContext ) . Get ( & access_model . Access { UserID : user29 . ID , RepoID : 23 } )
2022-05-11 18:09:36 +08:00
assert . NoError ( t , err )
assert . True ( t , has )
}