2017-02-23 04:36:15 +03:00
// Copyright 2017 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package models
import (
"strings"
"testing"
2021-11-24 12:49:20 +03:00
"code.gitea.io/gitea/models/db"
2022-03-29 09:29:02 +03:00
"code.gitea.io/gitea/models/organization"
2021-11-28 14:58:28 +03:00
"code.gitea.io/gitea/models/perm"
2022-05-11 13:09:36 +03:00
access_model "code.gitea.io/gitea/models/perm/access"
2021-12-10 04:27:50 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-12 17:36:47 +03:00
"code.gitea.io/gitea/models/unittest"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2021-11-17 15:34:35 +03:00
2017-02-23 04:36:15 +03:00
"github.com/stretchr/testify/assert"
)
func TestTeam_AddMember ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-23 04:36:15 +03:00
test := func ( teamID , userID int64 ) {
2022-03-29 09:29:02 +03:00
team := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : teamID } ) . ( * organization . Team )
assert . NoError ( t , AddTeamMember ( team , userID ) )
unittest . AssertExistsAndLoadBean ( t , & organization . TeamUser { UID : userID , TeamID : teamID } )
unittest . CheckConsistencyFor ( t , & organization . Team { ID : teamID } , & user_model . User { ID : team . OrgID } )
2017-02-23 04:36:15 +03:00
}
test ( 1 , 2 )
test ( 1 , 4 )
test ( 3 , 2 )
}
func TestTeam_RemoveMember ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-23 04:36:15 +03:00
testSuccess := func ( teamID , userID int64 ) {
2022-03-29 09:29:02 +03:00
team := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : teamID } ) . ( * organization . Team )
assert . NoError ( t , RemoveTeamMember ( team , userID ) )
unittest . AssertNotExistsBean ( t , & organization . TeamUser { UID : userID , TeamID : teamID } )
unittest . CheckConsistencyFor ( t , & organization . Team { ID : teamID } )
2017-02-23 04:36:15 +03:00
}
testSuccess ( 1 , 4 )
testSuccess ( 2 , 2 )
testSuccess ( 3 , 2 )
2021-11-16 11:53:21 +03:00
testSuccess ( 3 , unittest . NonexistentID )
2017-02-23 04:36:15 +03:00
2022-03-29 09:29:02 +03:00
team := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 1 } ) . ( * organization . Team )
err := RemoveTeamMember ( team , 2 )
assert . True ( t , organization . IsErrLastOrgOwner ( err ) )
2017-02-23 04:36:15 +03:00
}
func TestTeam_HasRepository ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-23 04:36:15 +03:00
test := func ( teamID , repoID int64 , expected bool ) {
2022-03-29 09:29:02 +03:00
team := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : teamID } ) . ( * organization . Team )
assert . Equal ( t , expected , HasRepository ( team , repoID ) )
2017-02-23 04:36:15 +03:00
}
test ( 1 , 1 , false )
test ( 1 , 3 , true )
test ( 1 , 5 , true )
2021-11-16 11:53:21 +03:00
test ( 1 , unittest . NonexistentID , false )
2017-02-23 04:36:15 +03:00
test ( 2 , 3 , true )
test ( 2 , 5 , false )
}
func TestTeam_AddRepository ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-23 04:36:15 +03:00
2017-03-15 03:52:01 +03:00
testSuccess := func ( teamID , repoID int64 ) {
2022-03-29 09:29:02 +03:00
team := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : teamID } ) . ( * organization . Team )
2021-12-10 04:27:50 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : repoID } ) . ( * repo_model . Repository )
2022-03-29 09:29:02 +03:00
assert . NoError ( t , AddRepository ( team , repo ) )
unittest . AssertExistsAndLoadBean ( t , & organization . TeamRepo { TeamID : teamID , RepoID : repoID } )
unittest . CheckConsistencyFor ( t , & organization . Team { ID : teamID } , & repo_model . Repository { ID : repoID } )
2017-02-23 04:36:15 +03:00
}
2017-03-15 03:52:01 +03:00
testSuccess ( 2 , 3 )
testSuccess ( 2 , 5 )
2017-02-23 04:36:15 +03:00
2022-03-29 09:29:02 +03:00
team := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 1 } ) . ( * organization . Team )
2021-12-10 04:27:50 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } ) . ( * repo_model . Repository )
2022-03-29 09:29:02 +03:00
assert . Error ( t , AddRepository ( team , repo ) )
unittest . CheckConsistencyFor ( t , & organization . Team { ID : 1 } , & repo_model . Repository { ID : 1 } )
2017-02-23 04:36:15 +03:00
}
func TestTeam_RemoveRepository ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-23 04:36:15 +03:00
testSuccess := func ( teamID , repoID int64 ) {
2022-03-29 09:29:02 +03:00
team := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : teamID } ) . ( * organization . Team )
assert . NoError ( t , RemoveRepository ( team , repoID ) )
unittest . AssertNotExistsBean ( t , & organization . TeamRepo { TeamID : teamID , RepoID : repoID } )
unittest . CheckConsistencyFor ( t , & organization . Team { ID : teamID } , & repo_model . Repository { ID : repoID } )
2017-02-23 04:36:15 +03:00
}
testSuccess ( 2 , 3 )
testSuccess ( 2 , 5 )
2021-11-16 11:53:21 +03:00
testSuccess ( 1 , unittest . NonexistentID )
2017-02-23 04:36:15 +03:00
}
func TestIsUsableTeamName ( t * testing . T ) {
2022-03-29 09:29:02 +03:00
assert . NoError ( t , organization . IsUsableTeamName ( "usable" ) )
assert . True ( t , db . IsErrNameReserved ( organization . IsUsableTeamName ( "new" ) ) )
2017-02-23 04:36:15 +03:00
}
func TestNewTeam ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-23 04:36:15 +03:00
const teamName = "newTeamName"
2022-03-29 09:29:02 +03:00
team := & organization . Team { Name : teamName , OrgID : 3 }
2017-02-23 04:36:15 +03:00
assert . NoError ( t , NewTeam ( team ) )
2022-03-29 09:29:02 +03:00
unittest . AssertExistsAndLoadBean ( t , & organization . Team { Name : teamName } )
unittest . CheckConsistencyFor ( t , & organization . Team { } , & user_model . User { ID : team . OrgID } )
2017-02-23 04:36:15 +03:00
}
func TestUpdateTeam ( t * testing . T ) {
// successful update
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-23 04:36:15 +03:00
2022-03-29 09:29:02 +03:00
team := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 2 } ) . ( * organization . Team )
2017-02-23 04:36:15 +03:00
team . LowerName = "newname"
team . Name = "newName"
team . Description = strings . Repeat ( "A long description!" , 100 )
2022-01-05 06:37:00 +03:00
team . AccessMode = perm . AccessModeAdmin
2019-11-06 12:37:14 +03:00
assert . NoError ( t , UpdateTeam ( team , true , false ) )
2017-02-23 04:36:15 +03:00
2022-03-29 09:29:02 +03:00
team = unittest . AssertExistsAndLoadBean ( t , & organization . Team { Name : "newName" } ) . ( * organization . Team )
2017-02-23 04:36:15 +03:00
assert . True ( t , strings . HasPrefix ( team . Description , "A long description!" ) )
2022-05-11 13:09:36 +03:00
access := unittest . AssertExistsAndLoadBean ( t , & access_model . Access { UserID : 4 , RepoID : 3 } ) . ( * access_model . Access )
2021-11-28 14:58:28 +03:00
assert . EqualValues ( t , perm . AccessModeAdmin , access . Mode )
2017-02-23 04:36:15 +03:00
2022-03-29 09:29:02 +03:00
unittest . CheckConsistencyFor ( t , & organization . Team { ID : team . ID } )
2017-02-23 04:36:15 +03:00
}
func TestUpdateTeam2 ( t * testing . T ) {
// update to already-existing team
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-23 04:36:15 +03:00
2022-03-29 09:29:02 +03:00
team := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 2 } ) . ( * organization . Team )
2017-02-23 04:36:15 +03:00
team . LowerName = "owners"
team . Name = "Owners"
team . Description = strings . Repeat ( "A long description!" , 100 )
2019-11-06 12:37:14 +03:00
err := UpdateTeam ( team , true , false )
2022-03-29 09:29:02 +03:00
assert . True ( t , organization . IsErrTeamAlreadyExist ( err ) )
2017-02-23 04:36:15 +03:00
2022-03-29 09:29:02 +03:00
unittest . CheckConsistencyFor ( t , & organization . Team { ID : team . ID } )
2017-02-23 04:36:15 +03:00
}
func TestDeleteTeam ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-23 04:36:15 +03:00
2022-03-29 09:29:02 +03:00
team := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 2 } ) . ( * organization . Team )
2017-02-23 04:36:15 +03:00
assert . NoError ( t , DeleteTeam ( team ) )
2022-03-29 09:29:02 +03: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-23 04:36:15 +03:00
// check that team members don't have "leftover" access to repos
2021-11-24 12:49:20 +03:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 4 } ) . ( * user_model . User )
2021-12-10 04:27:50 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 3 } ) . ( * repo_model . Repository )
2022-05-11 13:09:36 +03:00
accessMode , err := access_model . AccessLevel ( user , repo )
2017-02-23 04:36:15 +03:00
assert . NoError ( t , err )
2021-11-28 14:58:28 +03:00
assert . True ( t , accessMode < perm . AccessModeWrite )
2017-02-23 04:36:15 +03:00
}
func TestAddTeamMember ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-23 04:36:15 +03:00
test := func ( teamID , userID int64 ) {
2022-03-29 09:29:02 +03:00
team := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : teamID } ) . ( * organization . Team )
2017-02-24 09:25:09 +03:00
assert . NoError ( t , AddTeamMember ( team , userID ) )
2022-03-29 09:29:02 +03:00
unittest . AssertExistsAndLoadBean ( t , & organization . TeamUser { UID : userID , TeamID : teamID } )
unittest . CheckConsistencyFor ( t , & organization . Team { ID : teamID } , & user_model . User { ID : team . OrgID } )
2017-02-23 04:36:15 +03:00
}
test ( 1 , 2 )
test ( 1 , 4 )
test ( 3 , 2 )
}
func TestRemoveTeamMember ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-23 04:36:15 +03:00
testSuccess := func ( teamID , userID int64 ) {
2022-03-29 09:29:02 +03:00
team := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : teamID } ) . ( * organization . Team )
2017-02-24 09:25:09 +03:00
assert . NoError ( t , RemoveTeamMember ( team , userID ) )
2022-03-29 09:29:02 +03:00
unittest . AssertNotExistsBean ( t , & organization . TeamUser { UID : userID , TeamID : teamID } )
unittest . CheckConsistencyFor ( t , & organization . Team { ID : teamID } )
2017-02-23 04:36:15 +03:00
}
testSuccess ( 1 , 4 )
testSuccess ( 2 , 2 )
testSuccess ( 3 , 2 )
2021-11-16 11:53:21 +03:00
testSuccess ( 3 , unittest . NonexistentID )
2017-02-23 04:36:15 +03:00
2022-03-29 09:29:02 +03:00
team := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 1 } ) . ( * organization . Team )
2017-02-24 09:25:09 +03:00
err := RemoveTeamMember ( team , 2 )
2022-03-29 09:29:02 +03:00
assert . True ( t , organization . IsErrLastOrgOwner ( err ) )
2018-12-11 14:28:37 +03:00
}
2022-05-11 13:09:36 +03:00
func TestRepository_RecalculateAccesses3 ( t * testing . T ) {
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
team5 := unittest . AssertExistsAndLoadBean ( t , & organization . Team { ID : 5 } ) . ( * organization . Team )
user29 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 29 } ) . ( * user_model . User )
has , err := db . GetEngine ( db . DefaultContext ) . Get ( & access_model . Access { UserID : 29 , RepoID : 23 } )
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
assert . NoError ( t , AddTeamMember ( team5 , user29 . ID ) )
has , err = db . GetEngine ( db . DefaultContext ) . Get ( & access_model . Access { UserID : 29 , RepoID : 23 } )
assert . NoError ( t , err )
assert . True ( t , has )
}