Files
threshold/internal/daemon/controller/handlers/managed_groups/validate_test.go
T
Jeff MitchellandJohan Brandhorst-Satzkorn 0bf60996c5 Add generic read/update/delete commands (#3967)
* Add generic read/update/delete commands

This adds three generic commands that use the resource prefix to
determine the subcommand to run and pass through args over to that
subcommand. Since this occurs very early on and to avoid loading
essentially every internal resource package, I moved subtype definitions
to globals.

* Update main.go

Co-authored-by: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>

* Update changelog and remove another deprecated command

---------

Co-authored-by: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
2023-11-01 16:24:16 -04:00

211 lines
6.0 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package managed_groups
import (
"context"
"fmt"
"strings"
"testing"
"github.com/hashicorp/boundary/globals"
pbs "github.com/hashicorp/boundary/internal/gen/controller/api/services"
pb "github.com/hashicorp/boundary/sdk/pbs/controller/api/resources/managedgroups"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/types/known/fieldmaskpb"
)
func fieldError(field, details string) string {
return fmt.Sprintf(`{name: %q, desc: %q}`, field, details)
}
func TestValidateCreateRequest(t *testing.T) {
t.Parallel()
cases := []struct {
name string
item *pb.ManagedGroup
errContains string
}{
{
name: "unrecognized authmethod prefix",
item: &pb.ManagedGroup{
AuthMethodId: "anything_1234567890",
},
errContains: fieldError(globals.AuthMethodIdField, "Unknown auth method type from ID."),
},
{
name: "mismatched oidc authmethod pw type",
item: &pb.ManagedGroup{
Type: "ldap",
AuthMethodId: globals.OidcAuthMethodPrefix + "_1234567890",
},
errContains: fieldError(globals.TypeField, "Doesn't match the parent resource's type."),
},
{
name: "missing oidc attributes",
item: &pb.ManagedGroup{
Type: globals.OidcSubtype.String(),
AuthMethodId: globals.OidcAuthMethodPrefix + "_1234567890",
Attrs: nil,
},
errContains: fieldError(globals.AttributesField, "Attribute fields is required."),
},
{
name: "bad oidc attributes",
item: &pb.ManagedGroup{
Type: globals.OidcSubtype.String(),
AuthMethodId: globals.OidcAuthMethodPrefix + "_1234567890",
Attrs: &pb.ManagedGroup_OidcManagedGroupAttributes{
OidcManagedGroupAttributes: &pb.OidcManagedGroupAttributes{
Filter: "foobar",
},
},
},
errContains: "Error evaluating submitted filter",
},
{
name: "no oidc errors",
item: &pb.ManagedGroup{
Type: globals.OidcSubtype.String(),
AuthMethodId: globals.OidcAuthMethodPrefix + "_1234567890",
Attrs: &pb.ManagedGroup_OidcManagedGroupAttributes{
OidcManagedGroupAttributes: &pb.OidcManagedGroupAttributes{
Filter: `"/foo/bar" == "zipzap"`,
},
},
},
},
{
name: "mismatched ldap authmethod pw type",
item: &pb.ManagedGroup{
Type: "oidc",
AuthMethodId: globals.LdapAuthMethodPrefix + "_1234567890",
},
errContains: fieldError(globals.TypeField, "Doesn't match the parent resource's type."),
},
{
name: "missing ldap attributes",
item: &pb.ManagedGroup{
Type: globals.LdapSubtype.String(),
AuthMethodId: globals.LdapAuthMethodPrefix + "_1234567890",
Attrs: nil,
},
errContains: fieldError(globals.AttributesField, "Attribute fields is required."),
},
{
name: "bad ldap attributes",
item: &pb.ManagedGroup{
Type: globals.LdapSubtype.String(),
AuthMethodId: globals.LdapAuthMethodPrefix + "_1234567890",
Attrs: &pb.ManagedGroup_LdapManagedGroupAttributes{
LdapManagedGroupAttributes: &pb.LdapManagedGroupAttributes{
GroupNames: []string{},
},
},
},
errContains: "name: \"attributes.group_names\", desc: \"This field is required.",
},
{
name: "no ldap errors",
item: &pb.ManagedGroup{
Type: globals.LdapSubtype.String(),
AuthMethodId: globals.LdapAuthMethodPrefix + "_1234567890",
Attrs: &pb.ManagedGroup_LdapManagedGroupAttributes{
LdapManagedGroupAttributes: &pb.LdapManagedGroupAttributes{
GroupNames: []string{"admin"},
},
},
},
},
}
for _, tc := range cases {
tc := tc // capture range variable
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
req := &pbs.CreateManagedGroupRequest{Item: tc.item}
err := validateCreateRequest(context.Background(), req)
if tc.errContains == "" {
require.NoError(t, err)
return
}
assert.True(t, strings.Contains(err.Error(), tc.errContains),
"%q wasn't contained in %q", tc.errContains, err.Error())
})
}
}
func TestValidateUpdateRequest(t *testing.T) {
t.Parallel()
cases := []struct {
name string
req *pbs.UpdateManagedGroupRequest
errContains string
}{
{
name: "oidc to password change type",
req: &pbs.UpdateManagedGroupRequest{
Id: globals.OidcManagedGroupPrefix + "_1234567890",
Item: &pb.ManagedGroup{
Type: globals.PasswordSubtype.String(),
},
},
errContains: fieldError(globals.TypeField, "Cannot modify the resource type."),
},
{
name: "oidc no error",
req: &pbs.UpdateManagedGroupRequest{
Id: globals.OidcManagedGroupPrefix + "_1234567890",
UpdateMask: &fieldmaskpb.FieldMask{Paths: []string{}},
Item: &pb.ManagedGroup{
Version: 1,
Attrs: &pb.ManagedGroup_OidcManagedGroupAttributes{
OidcManagedGroupAttributes: &pb.OidcManagedGroupAttributes{
Filter: `"/foo/bar" == "zipzap"`,
},
},
},
},
},
{
name: "ldap to password change type",
req: &pbs.UpdateManagedGroupRequest{
Id: globals.LdapManagedGroupPrefix + "_1234567890",
Item: &pb.ManagedGroup{
Type: globals.PasswordSubtype.String(),
},
},
errContains: fieldError(globals.TypeField, "Cannot modify the resource type."),
},
{
name: "ldap no error",
req: &pbs.UpdateManagedGroupRequest{
Id: globals.LdapManagedGroupPrefix + "_1234567890",
UpdateMask: &fieldmaskpb.FieldMask{Paths: []string{}},
Item: &pb.ManagedGroup{
Version: 1,
Attrs: &pb.ManagedGroup_LdapManagedGroupAttributes{
LdapManagedGroupAttributes: &pb.LdapManagedGroupAttributes{
GroupNames: []string{"admin"},
},
},
},
},
},
}
for _, tc := range cases {
tc := tc // capture range variable
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
err := validateUpdateRequest(context.Background(), tc.req)
if tc.errContains == "" {
require.NoError(t, err)
return
}
assert.True(t, strings.Contains(err.Error(), tc.errContains),
"%q wasn't contained in %q", tc.errContains, err.Error())
})
}
}