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, &params.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, &params.ErrorResults{})
   105  			*(result.(*params.ErrorResults)) = params.ErrorResults{
   106  				Results: []params.ErrorResult{{
   107  					Error: &params.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, &params.ErrorResults{})
   132  			*(result.(*params.ErrorResults)) = params.ErrorResults{
   133  				Results: []params.ErrorResult{{
   134  					Error: &params.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, &params.ErrorResults{})
   168  			*(result.(*params.ErrorResults)) = params.ErrorResults{
   169  				Results: []params.ErrorResult{{
   170  					Error: &params.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  }