1// +build consulent
2
3package api
4
5import (
6	"testing"
7
8	"github.com/stretchr/testify/require"
9)
10
11func TestAPI_Namespaces(t *testing.T) {
12	t.Parallel()
13	c, s := makeACLClient(t)
14	defer s.Stop()
15
16	namespaces := c.Namespaces()
17	acl := c.ACL()
18
19	nsPolicy, _, err := acl.PolicyCreate(&ACLPolicy{
20		Name:  "ns-policy",
21		Rules: `operator = "write"`,
22	}, nil)
23	require.NoError(t, err)
24
25	nsRole, _, err := acl.RoleCreate(&ACLRole{
26		Name: "ns-role",
27		Policies: []*ACLRolePolicyLink{
28			{
29				ID: nsPolicy.ID,
30			},
31		},
32	}, nil)
33
34	require.NoError(t, err)
35
36	t.Run("Create Nameless", func(t *testing.T) {
37		ns := Namespace{
38			Description: "foo",
39		}
40
41		_, _, err := namespaces.Create(&ns, nil)
42		require.Error(t, err)
43		require.Contains(t, err.Error(), "Must specify a Name for Namespace creation")
44	})
45
46	t.Run("Create", func(t *testing.T) {
47		ns, _, err := namespaces.Create(&Namespace{
48			Name: "foo",
49			Meta: map[string]string{
50				"foo": "bar",
51			},
52		}, nil)
53		require.NoError(t, err)
54		require.NotNil(t, ns)
55		require.Equal(t, "foo", ns.Name)
56		require.Len(t, ns.Meta, 1)
57		require.Nil(t, ns.ACLs)
58
59		ns, _, err = namespaces.Create(&Namespace{
60			Name:        "acls",
61			Description: "This namespace has ACL config attached",
62			ACLs: &NamespaceACLConfig{
63				PolicyDefaults: []ACLLink{
64					{ID: nsPolicy.ID},
65				},
66				RoleDefaults: []ACLLink{
67					{ID: nsRole.ID},
68				},
69			},
70		}, nil)
71
72		require.NoError(t, err)
73		require.NotNil(t, ns)
74		require.NotNil(t, ns.ACLs)
75		require.Nil(t, ns.DeletedAt)
76	})
77
78	t.Run("Update Nameless", func(t *testing.T) {
79		ns := Namespace{
80			Description: "foo",
81		}
82
83		_, _, err := namespaces.Update(&ns, nil)
84		require.Error(t, err)
85		require.Contains(t, err.Error(), "Must specify a Name for Namespace updating")
86	})
87
88	t.Run("Update", func(t *testing.T) {
89		ns, _, err := namespaces.Update(&Namespace{
90			Name:        "foo",
91			Description: "updated description",
92		}, nil)
93
94		require.NoError(t, err)
95		require.NotNil(t, ns)
96		require.Equal(t, "updated description", ns.Description)
97	})
98
99	t.Run("List", func(t *testing.T) {
100		nsList, _, err := namespaces.List(nil)
101
102		require.NoError(t, err)
103		require.Len(t, nsList, 3)
104
105		found := make(map[string]struct{})
106		for _, ns := range nsList {
107			found[ns.Name] = struct{}{}
108		}
109
110		require.Contains(t, found, "default")
111		require.Contains(t, found, "foo")
112		require.Contains(t, found, "acls")
113	})
114
115	t.Run("Delete", func(t *testing.T) {
116		_, err := namespaces.Delete("foo", nil)
117		require.NoError(t, err)
118
119		// due to deferred deletion the namespace might still exist
120		// this checks that we get a nil return or that the obj has
121		// the deletion mark
122		ns, _, err := namespaces.Read("foo", nil)
123		require.NoError(t, err)
124		if ns != nil {
125			require.NotNil(t, ns.DeletedAt)
126			require.False(t, ns.DeletedAt.IsZero())
127		}
128	})
129}
130