// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 package userpass import ( "fmt" "reflect" "testing" stepwise "github.com/hashicorp/vault-testing-stepwise" dockerEnvironment "github.com/hashicorp/vault-testing-stepwise/environments/docker" "github.com/hashicorp/vault/api" "github.com/hashicorp/vault/sdk/helper/policyutil" "github.com/mitchellh/mapstructure" ) func TestAccBackend_stepwise_UserCrud(t *testing.T) { customPluginName := "my-userpass" envOptions := &stepwise.MountOptions{ RegistryName: customPluginName, PluginType: api.PluginTypeCredential, PluginName: "userpass", MountPathPrefix: customPluginName, } stepwise.Run(t, stepwise.Case{ Environment: dockerEnvironment.NewEnvironment(customPluginName, envOptions), Steps: []stepwise.Step{ testAccStepwiseUser(t, "web", "password", "foo"), testAccStepwiseReadUser(t, "web", "foo"), testAccStepwiseDeleteUser(t, "web"), testAccStepwiseReadUser(t, "web", ""), }, }) } func testAccStepwiseUser( t *testing.T, name string, password string, policies string, ) stepwise.Step { return stepwise.Step{ Operation: stepwise.UpdateOperation, Path: "users/" + name, Data: map[string]interface{}{ "password": password, "policies": policies, }, } } func testAccStepwiseDeleteUser(t *testing.T, name string) stepwise.Step { return stepwise.Step{ Operation: stepwise.DeleteOperation, Path: "users/" + name, } } func testAccStepwiseReadUser(t *testing.T, name string, policies string) stepwise.Step { return stepwise.Step{ Operation: stepwise.ReadOperation, Path: "users/" + name, Assert: func(resp *api.Secret, err error) error { if resp == nil { if policies == "" { return nil } return fmt.Errorf("unexpected nil response") } var d struct { Policies []string `mapstructure:"policies"` } if err := mapstructure.Decode(resp.Data, &d); err != nil { return err } expectedPolicies := policyutil.ParsePolicies(policies) if !reflect.DeepEqual(d.Policies, expectedPolicies) { return fmt.Errorf("Actual policies: %#v\nExpected policies: %#v", d.Policies, expectedPolicies) } return nil }, } }