// 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 ( ) )
}
} )
}