github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/api/client/secretbackends/client_test.go (about) 1 // Copyright 2022 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package secretbackends_test 5 6 import ( 7 "time" 8 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/api/base/testing" 13 "github.com/juju/juju/api/client/secretbackends" 14 "github.com/juju/juju/core/status" 15 "github.com/juju/juju/rpc/params" 16 coretesting "github.com/juju/juju/testing" 17 ) 18 19 var _ = gc.Suite(&SecretBackendsSuite{}) 20 21 type SecretBackendsSuite struct { 22 coretesting.BaseSuite 23 } 24 25 func (s *SecretBackendsSuite) TestNewClient(c *gc.C) { 26 apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 27 return nil 28 }) 29 client := secretbackends.NewClient(apiCaller) 30 c.Assert(client, gc.NotNil) 31 } 32 33 func ptr[T any](v T) *T { 34 return &v 35 } 36 37 func (s *SecretBackendsSuite) TestListSecretBackends(c *gc.C) { 38 config := map[string]interface{}{"foo": "bar"} 39 apiCaller := testing.BestVersionCaller{ 40 APICallerFunc: testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 41 c.Check(objType, gc.Equals, "SecretBackends") 42 c.Check(version, gc.Equals, 1) 43 c.Check(id, gc.Equals, "") 44 c.Check(request, gc.Equals, "ListSecretBackends") 45 c.Check(arg, jc.DeepEquals, params.ListSecretBackendsArgs{Names: []string{"myvault"}, Reveal: true}) 46 c.Assert(result, gc.FitsTypeOf, ¶ms.ListSecretBackendsResults{}) 47 *(result.(*params.ListSecretBackendsResults)) = params.ListSecretBackendsResults{ 48 []params.SecretBackendResult{{ 49 Result: params.SecretBackend{ 50 Name: "foo", 51 BackendType: "vault", 52 TokenRotateInterval: ptr(666 * time.Minute), 53 Config: config, 54 }, 55 ID: "backend-id", 56 NumSecrets: 666, 57 Status: "error", 58 Message: "vault is sealed", 59 }}, 60 } 61 return nil 62 }), BestVersion: 1, 63 } 64 client := secretbackends.NewClient(apiCaller) 65 result, err := client.ListSecretBackends([]string{"myvault"}, true) 66 c.Assert(err, jc.ErrorIsNil) 67 c.Assert(result, jc.DeepEquals, []secretbackends.SecretBackend{{ 68 Name: "foo", 69 BackendType: "vault", 70 TokenRotateInterval: ptr(666 * time.Minute), 71 Config: config, 72 NumSecrets: 666, 73 Status: status.Error, 74 Message: "vault is sealed", 75 ID: "backend-id", 76 }}) 77 } 78 79 func (s *SecretBackendsSuite) TestAddSecretsBackend(c *gc.C) { 80 backend := secretbackends.CreateSecretBackend{ 81 ID: "backend-id", 82 Name: "foo", 83 BackendType: "vault", 84 TokenRotateInterval: ptr(666 * time.Minute), 85 Config: map[string]interface{}{"foo": "bar"}, 86 } 87 apiCaller := testing.BestVersionCaller{ 88 APICallerFunc: testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 89 c.Check(objType, gc.Equals, "SecretBackends") 90 c.Check(version, gc.Equals, 1) 91 c.Check(id, gc.Equals, "") 92 c.Check(request, gc.Equals, "AddSecretBackends") 93 c.Check(arg, jc.DeepEquals, params.AddSecretBackendArgs{ 94 Args: []params.AddSecretBackendArg{{ 95 ID: "backend-id", 96 SecretBackend: params.SecretBackend{ 97 Name: backend.Name, 98 BackendType: backend.BackendType, 99 TokenRotateInterval: backend.TokenRotateInterval, 100 Config: backend.Config, 101 }, 102 }}, 103 }) 104 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 105 *(result.(*params.ErrorResults)) = params.ErrorResults{ 106 Results: []params.ErrorResult{{ 107 Error: ¶ms.Error{Message: "FAIL"}, 108 }}, 109 } 110 return nil 111 }), BestVersion: 1, 112 } 113 client := secretbackends.NewClient(apiCaller) 114 err := client.AddSecretBackend(backend) 115 c.Assert(err, gc.ErrorMatches, "FAIL") 116 } 117 118 func (s *SecretBackendsSuite) TestRemoveSecretsBackend(c *gc.C) { 119 apiCaller := testing.BestVersionCaller{ 120 APICallerFunc: testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 121 c.Check(objType, gc.Equals, "SecretBackends") 122 c.Check(version, gc.Equals, 1) 123 c.Check(id, gc.Equals, "") 124 c.Check(request, gc.Equals, "RemoveSecretBackends") 125 c.Check(arg, jc.DeepEquals, params.RemoveSecretBackendArgs{ 126 Args: []params.RemoveSecretBackendArg{{ 127 Name: "foo", 128 Force: true, 129 }}, 130 }) 131 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 132 *(result.(*params.ErrorResults)) = params.ErrorResults{ 133 Results: []params.ErrorResult{{ 134 Error: ¶ms.Error{Message: "FAIL"}, 135 }}, 136 } 137 return nil 138 }), BestVersion: 1, 139 } 140 client := secretbackends.NewClient(apiCaller) 141 err := client.RemoveSecretBackend("foo", true) 142 c.Assert(err, gc.ErrorMatches, "FAIL") 143 } 144 145 func (s *SecretBackendsSuite) TestUpdateSecretsBackend(c *gc.C) { 146 backend := secretbackends.UpdateSecretBackend{ 147 Name: "foo", 148 NameChange: ptr("new-name"), 149 TokenRotateInterval: ptr(666 * time.Minute), 150 Config: map[string]interface{}{"foo": "bar"}, 151 } 152 apiCaller := testing.BestVersionCaller{ 153 APICallerFunc: testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 154 c.Check(objType, gc.Equals, "SecretBackends") 155 c.Check(version, gc.Equals, 1) 156 c.Check(id, gc.Equals, "") 157 c.Check(request, gc.Equals, "UpdateSecretBackends") 158 c.Check(arg, jc.DeepEquals, params.UpdateSecretBackendArgs{ 159 Args: []params.UpdateSecretBackendArg{{ 160 Name: backend.Name, 161 TokenRotateInterval: backend.TokenRotateInterval, 162 Config: backend.Config, 163 NameChange: backend.NameChange, 164 Force: true, 165 }}, 166 }) 167 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 168 *(result.(*params.ErrorResults)) = params.ErrorResults{ 169 Results: []params.ErrorResult{{ 170 Error: ¶ms.Error{Message: "FAIL"}, 171 }}, 172 } 173 return nil 174 }), BestVersion: 1, 175 } 176 client := secretbackends.NewClient(apiCaller) 177 err := client.UpdateSecretBackend(backend, true) 178 c.Assert(err, gc.ErrorMatches, "FAIL") 179 }