mirror of https://github.com/goharbor/harbor.git
297 lines
9.4 KiB
Go
297 lines
9.4 KiB
Go
// Copyright Project Harbor Authors
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package dao
|
|
|
|
import (
|
|
"database/sql"
|
|
"github.com/goharbor/harbor/src/common"
|
|
_ "github.com/goharbor/harbor/src/common/dao"
|
|
testDao "github.com/goharbor/harbor/src/common/dao"
|
|
"github.com/goharbor/harbor/src/lib/orm"
|
|
"github.com/goharbor/harbor/src/pkg/member/models"
|
|
"github.com/goharbor/harbor/src/pkg/project"
|
|
"github.com/goharbor/harbor/src/pkg/user"
|
|
userDao "github.com/goharbor/harbor/src/pkg/user/dao"
|
|
"github.com/goharbor/harbor/src/pkg/usergroup"
|
|
ugModel "github.com/goharbor/harbor/src/pkg/usergroup/model"
|
|
htesting "github.com/goharbor/harbor/src/testing"
|
|
"github.com/stretchr/testify/suite"
|
|
"testing"
|
|
)
|
|
|
|
type DaoTestSuite struct {
|
|
htesting.Suite
|
|
dao DAO
|
|
projectMgr project.Manager
|
|
projectID int64
|
|
userMgr user.Manager
|
|
}
|
|
|
|
func (s *DaoTestSuite) SetupSuite() {
|
|
s.Suite.SetupSuite()
|
|
s.Suite.ClearTables = []string{"project_member"}
|
|
s.dao = New()
|
|
// Extract to test utils
|
|
initSqls := []string{
|
|
"insert into harbor_user (username, email, password, realname) values ('member_test_01', 'member_test_01@example.com', '123456', 'member_test_01')",
|
|
"insert into project (name, owner_id) values ('member_test_01', 1)",
|
|
"insert into user_group (group_name, group_type, ldap_group_dn) values ('test_group_01', 1, 'CN=harbor_users,OU=sample,OU=vmware,DC=harbor,DC=com')",
|
|
"update project set owner_id = (select user_id from harbor_user where username = 'member_test_01') where name = 'member_test_01'",
|
|
"insert into project_member (project_id, entity_id, entity_type, role) values ( (select project_id from project where name = 'member_test_01') , (select user_id from harbor_user where username = 'member_test_01'), 'u', 1)",
|
|
"insert into project_member (project_id, entity_id, entity_type, role) values ( (select project_id from project where name = 'member_test_01') , (select id from user_group where group_name = 'test_group_01'), 'g', 1)",
|
|
|
|
"insert into harbor_user (username, email, password, realname) values ('member_test_02', 'member_test_02@example.com', '123456', 'member_test_02')",
|
|
"insert into project (name, owner_id) values ('member_test_02', 1)",
|
|
"insert into user_group (group_name, group_type, ldap_group_dn) values ('test_group_02', 1, 'CN=harbor_users,OU=sample,OU=vmware,DC=harbor,DC=com')",
|
|
"update project set owner_id = (select user_id from harbor_user where username = 'member_test_02') where name = 'member_test_02'",
|
|
"insert into project_member (project_id, entity_id, entity_type, role) values ( (select project_id from project where name = 'member_test_02') , (select user_id from harbor_user where username = 'member_test_02'), 'u', 1)",
|
|
"insert into project_member (project_id, entity_id, entity_type, role) values ( (select project_id from project where name = 'member_test_02') , (select id from user_group where group_name = 'test_group_02'), 'g', 1)",
|
|
}
|
|
|
|
clearSqls := []string{
|
|
"delete from project where name='member_test_01' or name='member_test_02'",
|
|
"delete from harbor_user where username='member_test_01' or username='member_test_02' or username='pm_sample'",
|
|
"delete from user_group",
|
|
"delete from project_member where id > 1",
|
|
}
|
|
testDao.PrepareTestData(clearSqls, initSqls)
|
|
s.projectMgr = project.Mgr
|
|
s.userMgr = user.Mgr
|
|
ctx := s.Context()
|
|
proj, err := s.projectMgr.Get(ctx, "member_test_01")
|
|
s.Nil(err)
|
|
s.NotNil(proj)
|
|
s.projectID = proj.ProjectID
|
|
}
|
|
func (s *DaoTestSuite) TearDownSuite() {
|
|
}
|
|
|
|
func (s *DaoTestSuite) TestAddProjectMember() {
|
|
ctx := s.Context()
|
|
proj, err := s.projectMgr.Get(ctx, "member_test_01")
|
|
s.Nil(err)
|
|
s.NotNil(proj)
|
|
|
|
member := models.Member{
|
|
ProjectID: proj.ProjectID,
|
|
EntityID: 1,
|
|
EntityType: common.UserMember,
|
|
Role: common.RoleProjectAdmin,
|
|
}
|
|
pmid, err := s.dao.AddProjectMember(ctx, member)
|
|
s.Nil(err)
|
|
s.True(pmid > 0)
|
|
|
|
queryMember := models.Member{
|
|
ProjectID: proj.ProjectID,
|
|
ID: pmid,
|
|
}
|
|
memberList, err := s.dao.GetProjectMember(ctx, queryMember, nil)
|
|
s.Nil(err)
|
|
s.False(len(memberList) == 0)
|
|
|
|
_, err = s.dao.AddProjectMember(ctx, models.Member{
|
|
ProjectID: -1,
|
|
EntityID: 1,
|
|
EntityType: common.UserMember,
|
|
Role: common.RoleProjectAdmin,
|
|
})
|
|
|
|
s.NotNil(err)
|
|
|
|
_, err = s.dao.AddProjectMember(ctx, models.Member{
|
|
ProjectID: 1,
|
|
EntityID: -1,
|
|
EntityType: common.UserMember,
|
|
Role: common.RoleProjectAdmin,
|
|
})
|
|
|
|
s.NotNil(err)
|
|
}
|
|
|
|
func (s *DaoTestSuite) TestUpdateProjectMemberRole() {
|
|
ctx := s.Context()
|
|
proj, err := s.projectMgr.Get(ctx, "member_test_01")
|
|
s.Nil(err)
|
|
s.NotNil(proj)
|
|
user := userDao.User{
|
|
Username: "pm_sample",
|
|
Email: sql.NullString{String: "pm_sample@example.com", Valid: true},
|
|
Realname: "pm_sample",
|
|
Password: "1234567d",
|
|
}
|
|
o, err := orm.FromContext(ctx)
|
|
s.Nil(err)
|
|
userID, err := o.Insert(&user)
|
|
s.Nil(err)
|
|
member := models.Member{
|
|
ProjectID: proj.ProjectID,
|
|
EntityID: int(userID),
|
|
EntityType: common.UserMember,
|
|
Role: common.RoleProjectAdmin,
|
|
}
|
|
|
|
pmid, err := s.dao.AddProjectMember(ctx, member)
|
|
s.Nil(err)
|
|
s.dao.UpdateProjectMemberRole(ctx, proj.ProjectID, pmid, common.RoleDeveloper)
|
|
|
|
queryMember := models.Member{
|
|
ProjectID: proj.ProjectID,
|
|
EntityID: int(userID),
|
|
EntityType: common.UserMember,
|
|
}
|
|
|
|
memberList, err := s.dao.GetProjectMember(ctx, queryMember, nil)
|
|
s.Nil(err)
|
|
s.True(len(memberList) == 1, "project member should exist")
|
|
memberItem := memberList[0]
|
|
s.Equal(common.RoleDeveloper, memberItem.Role, "should be developer role")
|
|
s.Equal(user.Username, memberItem.Entityname)
|
|
|
|
memberList2, err := s.dao.SearchMemberByName(ctx, proj.ProjectID, "pm_sample")
|
|
s.Nil(err)
|
|
s.True(len(memberList2) > 0)
|
|
|
|
memberList3, err := s.dao.SearchMemberByName(ctx, proj.ProjectID, "")
|
|
s.Nil(err)
|
|
s.True(len(memberList3) > 0, "failed to search project member")
|
|
}
|
|
|
|
func (s *DaoTestSuite) TestGetProjectMembers() {
|
|
ctx := s.Context()
|
|
|
|
query1 := models.Member{ProjectID: s.projectID, Entityname: "member_test_01", EntityType: common.UserMember}
|
|
member1, err := s.dao.GetProjectMember(ctx, query1, nil)
|
|
s.Nil(err)
|
|
s.True(len(member1) > 0)
|
|
s.Equal(member1[0].Entityname, "member_test_01")
|
|
|
|
query2 := models.Member{ProjectID: s.projectID, Entityname: "test_group_01", EntityType: common.GroupMember}
|
|
member2, err := s.dao.GetProjectMember(ctx, query2, nil)
|
|
s.Nil(err)
|
|
s.True(len(member2) > 0)
|
|
s.Equal(member2[0].Entityname, "test_group_01")
|
|
}
|
|
|
|
func (s *DaoTestSuite) TestGetTotalOfProjectMembers() {
|
|
ctx := s.Context()
|
|
tot, err := s.dao.GetTotalOfProjectMembers(ctx, s.projectID, nil)
|
|
s.Nil(err)
|
|
s.Equal(2, int(tot))
|
|
}
|
|
|
|
func (s *DaoTestSuite) TestListRoles() {
|
|
ctx := s.Context()
|
|
|
|
// nil user
|
|
roles, err := s.dao.ListRoles(ctx, nil, 1)
|
|
s.Nil(err)
|
|
s.Len(roles, 0)
|
|
|
|
// user with empty groups
|
|
u, err := s.userMgr.GetByName(ctx, "member_test_01")
|
|
s.Nil(err)
|
|
s.NotNil(u)
|
|
user := &models.User{
|
|
UserID: u.UserID,
|
|
Username: u.Username,
|
|
}
|
|
roles, err = s.dao.ListRoles(ctx, user, s.projectID)
|
|
s.Nil(err)
|
|
s.Len(roles, 1)
|
|
|
|
// user with a group whose ID doesn't exist
|
|
user.GroupIDs = []int{9999}
|
|
roles, err = s.dao.ListRoles(ctx, user, s.projectID)
|
|
s.Nil(err)
|
|
s.Len(roles, 1)
|
|
s.Equal(common.RoleProjectAdmin, roles[0])
|
|
|
|
// user with a valid group
|
|
groupID, err := usergroup.Mgr.Create(ctx, ugModel.UserGroup{
|
|
GroupName: "group_for_list_role",
|
|
GroupType: 1,
|
|
LdapGroupDN: "CN=list_role_users,OU=sample,OU=vmware,DC=harbor,DC=com",
|
|
})
|
|
|
|
s.Nil(err)
|
|
defer usergroup.Mgr.Delete(ctx, groupID)
|
|
|
|
memberID, err := s.dao.AddProjectMember(ctx, models.Member{
|
|
ProjectID: s.projectID,
|
|
Role: common.RoleDeveloper,
|
|
EntityID: groupID,
|
|
EntityType: "g",
|
|
})
|
|
s.Nil(err)
|
|
defer s.dao.DeleteProjectMemberByID(ctx, s.projectID, memberID)
|
|
|
|
user.GroupIDs = []int{groupID}
|
|
roles, err = s.dao.ListRoles(ctx, user, s.projectID)
|
|
s.Nil(err)
|
|
s.Len(roles, 2)
|
|
s.Equal(common.RoleProjectAdmin, roles[0])
|
|
s.Equal(common.RoleDeveloper, roles[1])
|
|
}
|
|
|
|
func (s *DaoTestSuite) TestDeleteProjectMember() {
|
|
ctx := s.Context()
|
|
var addMember = models.Member{
|
|
ProjectID: s.projectID,
|
|
EntityID: 1,
|
|
EntityType: common.UserMember,
|
|
Role: common.RoleDeveloper,
|
|
}
|
|
pmid, err := s.dao.AddProjectMember(ctx, addMember)
|
|
s.Nil(err)
|
|
s.True(pmid > 0)
|
|
|
|
err = s.dao.DeleteProjectMemberByID(ctx, s.projectID, pmid)
|
|
s.Nil(err)
|
|
|
|
// not exist
|
|
err = s.dao.DeleteProjectMemberByID(ctx, s.projectID, -1)
|
|
s.Nil(err)
|
|
|
|
}
|
|
|
|
func (s *DaoTestSuite) TestDeleteProjectMemberByUserId() {
|
|
ctx := s.Context()
|
|
userID := 22
|
|
var addMember = models.Member{
|
|
ProjectID: s.projectID,
|
|
EntityID: userID,
|
|
EntityType: common.UserMember,
|
|
Role: common.RoleDeveloper,
|
|
}
|
|
pmid, err := s.dao.AddProjectMember(ctx, addMember)
|
|
s.Nil(err)
|
|
s.True(pmid > 0)
|
|
|
|
err = s.dao.DeleteProjectMemberByUserID(ctx, userID)
|
|
s.Nil(err)
|
|
|
|
queryMember := models.Member{ProjectID: s.projectID, EntityID: userID, EntityType: common.UserMember}
|
|
|
|
// not exist
|
|
members, err := s.dao.GetProjectMember(ctx, queryMember, nil)
|
|
s.True(len(members) == 0)
|
|
s.Nil(err)
|
|
}
|
|
|
|
func TestDaoTestSuite(t *testing.T) {
|
|
suite.Run(t, &DaoTestSuite{})
|
|
}
|