From f9aac34d2b8c651b77c01c6c8f401bc22385e9ac Mon Sep 17 00:00:00 2001 From: susanpann Date: Wed, 1 Nov 2023 15:13:17 +1000 Subject: [PATCH 1/4] chore: convert team service and tests --- pkg/teams/team_service.go | 79 ++++++++++++++++++++++ test/e2e/team_service_test.go | 121 ++++++++++++++++++++++++++++++++++ 2 files changed, 200 insertions(+) diff --git a/pkg/teams/team_service.go b/pkg/teams/team_service.go index 4105a62e..09cee544 100644 --- a/pkg/teams/team_service.go +++ b/pkg/teams/team_service.go @@ -4,6 +4,7 @@ import ( "github.com/OctopusDeploy/go-octopusdeploy/v2/internal" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/constants" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/core" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/newclient" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/resources" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/services" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/services/api" @@ -25,6 +26,8 @@ func NewTeamService(sling *sling.Sling, uriTemplate string) *TeamService { } // Add creates a new team. +// +// Deprecated: use teams.Add() func (s *TeamService) Add(team *Team) (*Team, error) { if IsNil(team) { return nil, internal.CreateInvalidParameterError(constants.OperationAdd, constants.ParameterTeam) @@ -46,6 +49,8 @@ func (s *TeamService) Add(team *Team) (*Team, error) { // Delete will delete a team if it is not a built-in team (i.e. the field, // CanBeDeleted is true). If the team cannot be deleted or an error occurs, it // returns an error. +// +// Deprecated: use teams.Delete() func (s *TeamService) Delete(team *Team) error { if team == nil { return internal.CreateInvalidParameterError(constants.OperationDelete, constants.ParameterTeam) @@ -62,6 +67,8 @@ func (s *TeamService) Delete(team *Team) error { // Get returns a collection of teams based on the criteria defined by its input // query parameter. If an error occurs, an empty collection is returned along // with the associated error. +// +// Deprecated: use teams.Get() func (s *TeamService) Get(teamsQuery TeamsQuery) (*resources.Resources[*Team], error) { path, err := s.GetURITemplate().Expand(teamsQuery) if err != nil { @@ -78,6 +85,8 @@ func (s *TeamService) Get(teamsQuery TeamsQuery) (*resources.Resources[*Team], e // GetAll returns all teams. If none can be found or an error occurs, it // returns an empty collection. +// +// Deprecated: use teams.GetAll() func (s *TeamService) GetAll() ([]*Team, error) { items := []*Team{} path, err := services.GetAllPath(s) @@ -91,6 +100,8 @@ func (s *TeamService) GetAll() ([]*Team, error) { // GetByID returns the team that matches the input ID. If one cannot be found, // it returns nil and an error. +// +// Deprecated: use teams.GetById() func (s *TeamService) GetByID(id string) (*Team, error) { if internal.IsEmpty(id) { return nil, internal.CreateInvalidParameterError(constants.OperationGetByID, constants.ParameterID) @@ -125,6 +136,8 @@ func (s *TeamService) GetByPartialName(partialName string) ([]*Team, error) { } // Update modifies a team based on the one provided as input. +// +// Deprecated: use teams.Update() func (s *TeamService) Update(team *Team) (*Team, error) { path, err := services.GetUpdatePath(s, team) if err != nil { @@ -150,3 +163,69 @@ func (s *TeamService) GetScopedUserRoles(team Team, query core.SkipTakeQuery) (* return resp.(*resources.Resources[*userroles.ScopedUserRole]), nil } + +// --- new --- + +const template = "/api/{spaceId}/teams{/id}{?skip,take,ids,partialName}" +const scopedUserRolesTemplate = "/api/teams{/id}/scopeduserroles" + +// Add creates a new team. +func Add(client newclient.Client, team *Team) (*Team, error) { + return newclient.Add[Team](client, template, team.SpaceID, team) +} + +// Get returns a collection of teams based on the criteria defined by its +// input query parameter. +func Get(client newclient.Client, spaceID string, teamsQuery TeamsQuery) (*resources.Resources[*Team], error) { + return newclient.GetByQuery[Team](client, template, spaceID, teamsQuery) +} + +// GetByID returns the team that matches the input ID. +func GetByID(client newclient.Client, spaceID string, ID string) (*Team, error) { + return newclient.GetByID[Team](client, template, spaceID, ID) +} + +// Update modifies a team based on the one provided as input. +func Update(client newclient.Client, team *Team) (*Team, error) { + return newclient.Update[Team](client, template, team.SpaceID, team.ID, team) +} + +// GetAll returns all teams. If an error occurs, it returns nil. +func GetAll(client newclient.Client, spaceID string) ([]*Team, error) { + return newclient.GetAll[Team](client, template, spaceID) +} + +// Delete will delete a team if it is not a built-in team (i.e. the field, +// CanBeDeleted is true). If the team cannot be deleted or an error occurs, it +// returns an error. +func Delete(client newclient.Client, team *Team) error { + if team == nil { + return internal.CreateInvalidParameterError(constants.OperationDelete, constants.ParameterTeam) + } + + if !team.CanBeDeleted { + return internal.CreateBuiltInTeamsCannotDeleteError() + } + + return newclient.DeleteByID(client, template, team.SpaceID, team.ID) +} + +// func GetScopedUserRoles(client newclient.Client, team *Team, query core.SkipTakeQuery) (*[]*userroles.ScopedUserRole, error) { +// values, _ := uritemplates.Struct2map(query) +// if values == nil { +// values = map[string]any{} +// } + +// values["id"] = team.ID +// path, err := client.URITemplateCache().Expand(scopedUserRolesTemplate, values) +// if err != nil { +// return nil, err +// } + +// res, err := newclient.Get[[]*userroles.ScopedUserRole](client.HttpSession(), path) +// if err != nil { +// return nil, err +// } + +// return res, nil +// } diff --git a/test/e2e/team_service_test.go b/test/e2e/team_service_test.go index c4f0877d..85b39847 100644 --- a/test/e2e/team_service_test.go +++ b/test/e2e/team_service_test.go @@ -168,3 +168,124 @@ func TestTeamServiceUpdate(t *testing.T) { IsEqualTeams(t, createdTeam, updatedTeam) defer DeleteTestTeam(t, client, updatedTeam) } + +// --- new --- +func TestTeamSetAddGetDelete_NewClient(t *testing.T) { + client := getOctopusClient() + require.NotNil(t, client) + + team := CreateTestTeam_NewClient(t, client) + require.NotNil(t, team) + defer DeleteTestTeam_NewClient(t, client, team) + + teamToCompare, err := teams.GetByID(client, team.SpaceID, team.GetID()) + require.NoError(t, err) + require.NotNil(t, teamToCompare) + IsEqualTeams(t, team, teamToCompare) +} + +func TestTeamServiceGetAll_NewClient(t *testing.T) { + client := getOctopusClient() + require.NotNil(t, client) + + // create 10 test teams (to be deleted) + for i := 0; i < 10; i++ { + team := CreateTestTeam_NewClient(t, client) + require.NotNil(t, team) + defer DeleteTestTeam_NewClient(t, client, team) + } + + allTeams, err := teams.GetAll(client, client.GetSpaceID()) + require.NoError(t, err) + require.NotNil(t, allTeams) + require.True(t, len(allTeams) >= 10) +} + +func TestTeamServiceGetByID_NewClient(t *testing.T) { + client := getOctopusClient() + require.NotNil(t, client) + + id := internal.GetRandomName() + team, err := teams.GetByID(client, client.GetSpaceID(), id) + require.Error(t, err) + require.Nil(t, team) + + // create 2 test teams (to be deleted) + for i := 0; i < 2; i++ { + team := CreateTestTeam_NewClient(t, client) + require.NotNil(t, team) + defer DeleteTestTeam_NewClient(t, client, team) + } + + allTeams, err := teams.GetAll(client, client.GetSpaceID()) + require.NoError(t, err) + require.NotNil(t, allTeams) + + for _, team := range allTeams { + teamToCompare, err := teams.GetByID(client, team.SpaceID, team.GetID()) + require.NoError(t, err) + IsEqualTeams(t, team, teamToCompare) + } +} + +func TestTeamServiceUpdate_NewClient(t *testing.T) { + client := getOctopusClient() + require.NotNil(t, client) + + createdTeam := CreateTestTeam_NewClient(t, client) + updatedTeam := UpdateTeam_NewClient(t, client, createdTeam) + IsEqualTeams(t, createdTeam, updatedTeam) + defer DeleteTestTeam_NewClient(t, client, updatedTeam) +} + +func CreateTestTeam_NewClient(t *testing.T, client *client.Client) *teams.Team { + if client == nil { + client = getOctopusClient() + } + require.NotNil(t, client) + + name := internal.GetRandomName() + + team := teams.NewTeam(name) + require.NoError(t, team.Validate()) + + createdTeam, err := teams.Add(client, team) + require.NoError(t, err) + require.NotNil(t, createdTeam) + require.NotEmpty(t, createdTeam.GetID()) + require.Equal(t, name, createdTeam.Name) + + return createdTeam +} + +func DeleteTestTeam_NewClient(t *testing.T, client *client.Client, team *teams.Team) { + require.NotNil(t, team) + + if client == nil { + client = getOctopusClient() + } + require.NotNil(t, client) + + err := teams.Delete(client, team) + assert.NoError(t, err) + + // verify the delete operation was successful + teams, err := teams.GetByID(client, team.SpaceID, team.GetID()) + assert.Error(t, err) + assert.Nil(t, teams) +} + +func UpdateTeam_NewClient(t *testing.T, client *client.Client, team *teams.Team) *teams.Team { + require.NotNil(t, team) + + if client == nil { + client = getOctopusClient() + } + require.NotNil(t, client) + + updatedTeam, err := teams.Update(client, team) + require.NoError(t, err) + require.NotNil(t, updatedTeam) + + return updatedTeam +} From 4317d7b672ad0495df06fc11a9c3017b9fc6c40a Mon Sep 17 00:00:00 2001 From: susanpann Date: Thu, 2 Nov 2023 10:17:47 +1000 Subject: [PATCH 2/4] chore: convert to newclient for scoped user roles --- pkg/scopeduserroles/scoped_user_role.go | 31 +++++++ pkg/scopeduserroles/scoped_user_role_query.go | 10 +++ .../scoped_user_role_service.go | 35 ++++++++ pkg/userroles/scoped_user_role_service.go | 5 ++ test/e2e/scoped_user_role_service_test.go | 83 +++++++++++++++++++ 5 files changed, 164 insertions(+) create mode 100644 pkg/scopeduserroles/scoped_user_role.go create mode 100644 pkg/scopeduserroles/scoped_user_role_query.go create mode 100644 pkg/scopeduserroles/scoped_user_role_service.go create mode 100644 test/e2e/scoped_user_role_service_test.go diff --git a/pkg/scopeduserroles/scoped_user_role.go b/pkg/scopeduserroles/scoped_user_role.go new file mode 100644 index 00000000..d92f2f41 --- /dev/null +++ b/pkg/scopeduserroles/scoped_user_role.go @@ -0,0 +1,31 @@ +package scopeduserroles + +import ( + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/resources" + "github.com/go-playground/validator/v10" +) + +type ScopedUserRole struct { + EnvironmentIDs []string `json:"EnvironmentIds,omitempty"` + ProjectIDs []string `json:"ProjectIds,omitempty"` + ProjectGroupIDs []string `json:"ProjectGroupIds,omitempty"` + TeamID string `json:"TeamId" validate:"required"` + TenantIDs []string `json:"TenantIds,omitempty"` + SpaceID string `json:"SpaceId"` + UserRoleID string `json:"UserRoleId" validate:"required"` + + resources.Resource +} + +func NewScopedUserRole(userRoleId string, teamId string) *ScopedUserRole { + return &ScopedUserRole{ + UserRoleID: userRoleId, + TeamID: teamId, + Resource: *resources.NewResource(), + } +} + +// Validate checks the state of the scoped user role and returns an error if invalid. +func (r *ScopedUserRole) Validate() error { + return validator.New().Struct(r) +} diff --git a/pkg/scopeduserroles/scoped_user_role_query.go b/pkg/scopeduserroles/scoped_user_role_query.go new file mode 100644 index 00000000..efd163d0 --- /dev/null +++ b/pkg/scopeduserroles/scoped_user_role_query.go @@ -0,0 +1,10 @@ +package scopeduserroles + +type ScopedUserRolesQuery struct { + IDs []string `uri:"ids,omitempty" url:"ids,omitempty"` + IncludeSystem bool `uri:"includeSystem,omitempty" url:"includeSystem,omitempty"` + PartialName string `uri:"partialName,omitempty" url:"partialName,omitempty"` + Skip int `uri:"skip,omitempty" url:"skip,omitempty"` + Spaces []string `uri:"spaces,omitempty" url:"spaces,omitempty"` + Take int `uri:"take,omitempty" url:"take,omitempty"` +} diff --git a/pkg/scopeduserroles/scoped_user_role_service.go b/pkg/scopeduserroles/scoped_user_role_service.go new file mode 100644 index 00000000..3edab31b --- /dev/null +++ b/pkg/scopeduserroles/scoped_user_role_service.go @@ -0,0 +1,35 @@ +package scopeduserroles + +import ( + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/newclient" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/resources" +) + +// --- new --- +const template = "/api/{spaceId}/scopeduserroles{/id}{?skip,take,ids,partialName,spaces,includeSystem}" + +// Add creates a new scoped user role. +func Add(client newclient.Client, scopedUserRole *ScopedUserRole) (*ScopedUserRole, error) { + return newclient.Add[ScopedUserRole](client, template, scopedUserRole.SpaceID, scopedUserRole) +} + +// Get returns a collection of scoped user roles based on the criteria defined by +// its input query parameter. +func Get(client newclient.Client, spaceID string, scopedUserRolesQuery ScopedUserRolesQuery) (*resources.Resources[*ScopedUserRole], error) { + return newclient.GetByQuery[ScopedUserRole](client, template, spaceID, scopedUserRolesQuery) +} + +// GetByID returns the scoped user role that matches the input ID. +func GetByID(client newclient.Client, spaceID string, ID string) (*ScopedUserRole, error) { + return newclient.GetByID[ScopedUserRole](client, template, spaceID, ID) +} + +// Update modifies a ScopedUserRole based on the one provided as input. +func Update(client newclient.Client, scopedUserRole *ScopedUserRole) (*ScopedUserRole, error) { + return newclient.Update[ScopedUserRole](client, template, scopedUserRole.SpaceID, scopedUserRole.ID, scopedUserRole) +} + +// DeleteByID deletes a scoped user role that matches the input ID +func DeleteByID(client newclient.Client, spaceID string, ID string) error { + return newclient.DeleteByID(client, template, spaceID, ID) +} diff --git a/pkg/userroles/scoped_user_role_service.go b/pkg/userroles/scoped_user_role_service.go index 580566e4..5b44a066 100644 --- a/pkg/userroles/scoped_user_role_service.go +++ b/pkg/userroles/scoped_user_role_service.go @@ -21,6 +21,7 @@ func NewScopedUserRoleService(sling *sling.Sling, uriTemplate string) *ScopedUse } } +// Deprecated: use scopeduserroles.Add() func (s *ScopedUserRoleService) Add(scopedUserRole *ScopedUserRole) (*ScopedUserRole, error) { if IsNil(scopedUserRole) { return nil, internal.CreateInvalidParameterError(constants.OperationAdd, constants.ParameterScopedUserRole) @@ -44,6 +45,8 @@ func (s *ScopedUserRoleService) Add(scopedUserRole *ScopedUserRole) (*ScopedUser // Currently no known query params, not even take and skip // Query params could exist, but are undocumented in the swagger +// +// Deprecated: use scopeduserroles.Get() func (s *ScopedUserRoleService) Get() (*resources.Resources[*ScopedUserRole], error) { path := s.BasePath @@ -54,6 +57,7 @@ func (s *ScopedUserRoleService) Get() (*resources.Resources[*ScopedUserRole], er return resp.(*resources.Resources[*ScopedUserRole]), nil } +// Deprecated: use scopeduserroles.GetById() func (s *ScopedUserRoleService) GetByID(id string) (*ScopedUserRole, error) { if internal.IsEmpty(id) { return nil, internal.CreateInvalidParameterError(constants.OperationGetByID, constants.ParameterID) @@ -71,6 +75,7 @@ func (s *ScopedUserRoleService) GetByID(id string) (*ScopedUserRole, error) { return resp.(*ScopedUserRole), nil } +// Deprecated: use scopeduserroles.Update() func (s *ScopedUserRoleService) Update(scopedUserRole *ScopedUserRole) (*ScopedUserRole, error) { if scopedUserRole == nil { return nil, internal.CreateInvalidParameterError(constants.OperationUpdate, constants.ParameterScopedUserRole) diff --git a/test/e2e/scoped_user_role_service_test.go b/test/e2e/scoped_user_role_service_test.go new file mode 100644 index 00000000..96452c8b --- /dev/null +++ b/test/e2e/scoped_user_role_service_test.go @@ -0,0 +1,83 @@ +package e2e + +import ( + "testing" + + "github.com/OctopusDeploy/go-octopusdeploy/v2/internal" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/client" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/scopeduserroles" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/userroles" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestScopedUserRoleService_AddGetUpdateDelete(t *testing.T) { + client := getOctopusClient() + require.NotNil(t, client) + + // Create user role with at least 1 space permission + name := internal.GetRandomName() + userrole := userroles.NewUserRole(name) + userrole.GrantedSpacePermissions = []string{"ProjectView"} + require.NoError(t, userrole.Validate()) + + createdUserRole, err := userroles.Add(client, userrole) + require.NotNil(t, createdUserRole) + require.NoError(t, err) + + team := CreateTestTeam_NewClient(t, client) + require.NotNil(t, team) + + // Add + scopedUserRole := scopeduserroles.NewScopedUserRole(createdUserRole.ID, team.ID) + scopedUserRole.SpaceID = client.GetSpaceID() + require.NoError(t, scopedUserRole.Validate()) + + createdRole, err := scopeduserroles.Add(client, scopedUserRole) + require.NotNil(t, createdRole) + require.NoError(t, err) + + // Get + userRoleToCompare, err := scopeduserroles.GetByID(client, createdRole.SpaceID, createdRole.GetID()) + require.NotNil(t, userRoleToCompare) + require.NoError(t, err) + + AssertEqualScopedUserRoles(t, createdRole, userRoleToCompare) + + // Update + updatedRole, err := scopeduserroles.Update(client, createdRole) + require.Nil(t, err) + assert.EqualValues(t, createdRole.ID, updatedRole.ID) + assert.EqualValues(t, createdRole.TeamID, updatedRole.TeamID) + + t.Cleanup(func() { + DeleteScopedUserRole(t, client, createdRole) + DeleteTestUserRole_NewClient(t, client, createdUserRole) + DeleteTestTeam_NewClient(t, client, team) + }) +} + +func DeleteScopedUserRole(t *testing.T, client *client.Client, scopedUserRole *scopeduserroles.ScopedUserRole) { + require.NotNil(t, scopedUserRole) + + if client == nil { + client = getOctopusClient() + } + require.NotNil(t, client) + + err := scopeduserroles.DeleteByID(client, scopedUserRole.SpaceID, scopedUserRole.GetID()) + assert.NoError(t, err) + + // verify the delete operation was successful + deletedUserRole, err := scopeduserroles.GetByID(client, scopedUserRole.SpaceID, scopedUserRole.GetID()) + assert.Error(t, err) + assert.Nil(t, deletedUserRole) +} + +func AssertEqualScopedUserRoles(t *testing.T, expected *scopeduserroles.ScopedUserRole, actual *scopeduserroles.ScopedUserRole) { + assert.Equal(t, expected.GetID(), actual.GetID()) + assert.Equal(t, expected.UserRoleID, actual.UserRoleID) + assert.Equal(t, expected.SpaceID, actual.SpaceID) + assert.Equal(t, expected.TeamID, actual.TeamID) + assert.True(t, internal.IsLinksEqual(expected.Links, actual.Links)) +} From 4f55fa9784384fd53188220cdc3836c3f2107119 Mon Sep 17 00:00:00 2001 From: susanpann Date: Thu, 2 Nov 2023 10:18:17 +1000 Subject: [PATCH 3/4] chore: update getscopeduserroles for team service --- pkg/teams/team_service.go | 39 +++++++++++++++++++--------------- test/e2e/team_service_test.go | 40 +++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 17 deletions(-) diff --git a/pkg/teams/team_service.go b/pkg/teams/team_service.go index 09cee544..65585f9a 100644 --- a/pkg/teams/team_service.go +++ b/pkg/teams/team_service.go @@ -6,6 +6,7 @@ import ( "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/core" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/newclient" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/resources" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/scopeduserroles" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/services" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/services/api" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/userroles" @@ -152,6 +153,9 @@ func (s *TeamService) Update(team *Team) (*Team, error) { return resp.(*Team), nil } +// GetScopedUserRoles returns user scoped roles scoped to the team provided +// +// Deprecated: use teams.GetScopedUserRoles() func (s *TeamService) GetScopedUserRoles(team Team, query core.SkipTakeQuery) (*resources.Resources[*userroles.ScopedUserRole], error) { template, _ := uritemplates.Parse(team.Links["ScopedUserRoles"]) path, _ := template.Expand(query) @@ -167,7 +171,7 @@ func (s *TeamService) GetScopedUserRoles(team Team, query core.SkipTakeQuery) (* // --- new --- const template = "/api/{spaceId}/teams{/id}{?skip,take,ids,partialName}" -const scopedUserRolesTemplate = "/api/teams{/id}/scopeduserroles" +const scopedUserRolesTemplate = "/api/teams{/id}/scopeduserroles{?skip,take}" // Add creates a new team. func Add(client newclient.Client, team *Team) (*Team, error) { @@ -210,22 +214,23 @@ func Delete(client newclient.Client, team *Team) error { return newclient.DeleteByID(client, template, team.SpaceID, team.ID) } -// func GetScopedUserRoles(client newclient.Client, team *Team, query core.SkipTakeQuery) (*[]*userroles.ScopedUserRole, error) { -// values, _ := uritemplates.Struct2map(query) -// if values == nil { -// values = map[string]any{} -// } +// GetScopedUserRoles returns scoped user roles scoped to the team provided +func GetScopedUserRoles(client newclient.Client, team *Team, query core.SkipTakeQuery) (*resources.Resources[*scopeduserroles.ScopedUserRole], error) { + values, _ := uritemplates.Struct2map(query) + if values == nil { + values = map[string]any{} + } -// values["id"] = team.ID -// path, err := client.URITemplateCache().Expand(scopedUserRolesTemplate, values) -// if err != nil { -// return nil, err -// } + values["id"] = team.ID + path, err := client.URITemplateCache().Expand(scopedUserRolesTemplate, values) + if err != nil { + return nil, err + } -// res, err := newclient.Get[[]*userroles.ScopedUserRole](client.HttpSession(), path) -// if err != nil { -// return nil, err -// } + res, err := newclient.Get[resources.Resources[*scopeduserroles.ScopedUserRole]](client.HttpSession(), path) + if err != nil { + return nil, err + } -// return res, nil -// } + return res, nil +} diff --git a/test/e2e/team_service_test.go b/test/e2e/team_service_test.go index 85b39847..3dc0b79b 100644 --- a/test/e2e/team_service_test.go +++ b/test/e2e/team_service_test.go @@ -6,7 +6,9 @@ import ( "github.com/OctopusDeploy/go-octopusdeploy/v2/internal" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/client" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/core" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/scopeduserroles" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/teams" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/userroles" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -238,6 +240,44 @@ func TestTeamServiceUpdate_NewClient(t *testing.T) { defer DeleteTestTeam_NewClient(t, client, updatedTeam) } +func TestTeamGetScopedUserRole_NewClient(t *testing.T) { + client := getOctopusClient() + require.NotNil(t, client) + + // Create user role with at least 1 space permission + name := internal.GetRandomName() + userrole := userroles.NewUserRole(name) + userrole.GrantedSpacePermissions = []string{"ProjectView"} + require.NoError(t, userrole.Validate()) + + createdUserRole, err := userroles.Add(client, userrole) + require.NotNil(t, createdUserRole) + require.NoError(t, err) + + team := CreateTestTeam_NewClient(t, client) + require.NotNil(t, team) + + scopedUserRole := scopeduserroles.NewScopedUserRole(createdUserRole.ID, team.ID) + scopedUserRole.SpaceID = client.GetSpaceID() + require.NoError(t, scopedUserRole.Validate()) + + createdRole, err := scopeduserroles.Add(client, scopedUserRole) + require.NotNil(t, createdRole) + require.NoError(t, err) + + teamScopedRoles, err := teams.GetScopedUserRoles(client, team, core.SkipTakeQuery{Take: 1}) + require.NoError(t, err) + require.NotNil(t, teamScopedRoles) + + AssertEqualScopedUserRoles(t, teamScopedRoles.Items[0], createdRole) + + t.Cleanup(func() { + DeleteScopedUserRole(t, client, createdRole) + DeleteTestUserRole_NewClient(t, client, createdUserRole) + DeleteTestTeam_NewClient(t, client, team) + }) +} + func CreateTestTeam_NewClient(t *testing.T, client *client.Client) *teams.Team { if client == nil { client = getOctopusClient() From 5083b69e1ec49f7fa0c0119ad6c73f22a6b4a754 Mon Sep 17 00:00:00 2001 From: susanpann Date: Thu, 2 Nov 2023 11:27:17 +1000 Subject: [PATCH 4/4] chore: remove spaceId from scopeduserrole template --- pkg/scopeduserroles/scoped_user_role_service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/scopeduserroles/scoped_user_role_service.go b/pkg/scopeduserroles/scoped_user_role_service.go index 3edab31b..cc61b051 100644 --- a/pkg/scopeduserroles/scoped_user_role_service.go +++ b/pkg/scopeduserroles/scoped_user_role_service.go @@ -6,7 +6,7 @@ import ( ) // --- new --- -const template = "/api/{spaceId}/scopeduserroles{/id}{?skip,take,ids,partialName,spaces,includeSystem}" +const template = "/api/scopeduserroles{/id}{?skip,take,ids,partialName,spaces,includeSystem}" // Add creates a new scoped user role. func Add(client newclient.Client, scopedUserRole *ScopedUserRole) (*ScopedUserRole, error) {