consul/api/namespace_test.go

133 lines
2.8 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
//go:build consulent
package api
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestAPI_Namespaces(t *testing.T) {
t.Parallel()
c, s := makeACLClient(t)
defer s.Stop()
namespaces := c.Namespaces()
acl := c.ACL()
nsPolicy, _, err := acl.PolicyCreate(&ACLPolicy{
Name: "ns-policy",
Rules: `operator = "write"`,
}, nil)
require.NoError(t, err)
nsRole, _, err := acl.RoleCreate(&ACLRole{
Name: "ns-role",
Policies: []*ACLRolePolicyLink{
{
ID: nsPolicy.ID,
},
},
}, nil)
require.NoError(t, err)
t.Run("Create Nameless", func(t *testing.T) {
ns := Namespace{
Description: "foo",
}
_, _, err := namespaces.Create(&ns, nil)
require.Error(t, err)
require.Contains(t, err.Error(), "Must specify a Name for Namespace creation")
})
t.Run("Create", func(t *testing.T) {
ns, _, err := namespaces.Create(&Namespace{
Name: "foo",
Meta: map[string]string{
"foo": "bar",
},
}, nil)
require.NoError(t, err)
require.NotNil(t, ns)
require.Equal(t, "foo", ns.Name)
require.Len(t, ns.Meta, 1)
require.Nil(t, ns.ACLs)
ns, _, err = namespaces.Create(&Namespace{
Name: "acls",
Description: "This namespace has ACL config attached",
ACLs: &NamespaceACLConfig{
PolicyDefaults: []ACLLink{
{ID: nsPolicy.ID},
},
RoleDefaults: []ACLLink{
{ID: nsRole.ID},
},
},
}, nil)
require.NoError(t, err)
require.NotNil(t, ns)
require.NotNil(t, ns.ACLs)
require.Nil(t, ns.DeletedAt)
})
t.Run("Update Nameless", func(t *testing.T) {
ns := Namespace{
Description: "foo",
}
_, _, err := namespaces.Update(&ns, nil)
require.Error(t, err)
require.Contains(t, err.Error(), "Must specify a Name for Namespace updating")
})
t.Run("Update", func(t *testing.T) {
ns, _, err := namespaces.Update(&Namespace{
Name: "foo",
Description: "updated description",
}, nil)
require.NoError(t, err)
require.NotNil(t, ns)
require.Equal(t, "updated description", ns.Description)
})
t.Run("List", func(t *testing.T) {
nsList, _, err := namespaces.List(nil)
require.NoError(t, err)
require.Len(t, nsList, 3)
found := make(map[string]struct{})
for _, ns := range nsList {
found[ns.Name] = struct{}{}
}
require.Contains(t, found, "default")
require.Contains(t, found, "foo")
require.Contains(t, found, "acls")
})
t.Run("Delete", func(t *testing.T) {
_, err := namespaces.Delete("foo", nil)
require.NoError(t, err)
// due to deferred deletion the namespace might still exist
// this checks that we get a nil return or that the obj has
// the deletion mark
ns, _, err := namespaces.Read("foo", nil)
require.NoError(t, err)
if ns != nil {
require.NotNil(t, ns.DeletedAt)
require.False(t, ns.DeletedAt.IsZero())
}
})
}