github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/secretsdrainworker/manifold_test.go (about)

     1  // Copyright 2023 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package secretsdrainworker_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/loggo"
     9  	"github.com/juju/testing"
    10  	jc "github.com/juju/testing/checkers"
    11  	"github.com/juju/worker/v3"
    12  	dt "github.com/juju/worker/v3/dependency/testing"
    13  	"go.uber.org/mock/gomock"
    14  	gc "gopkg.in/check.v1"
    15  
    16  	"github.com/juju/juju/api/base"
    17  	jujusecrets "github.com/juju/juju/secrets"
    18  	"github.com/juju/juju/worker/secretsdrainworker"
    19  	"github.com/juju/juju/worker/secretsdrainworker/mocks"
    20  )
    21  
    22  type ManifoldSuite struct {
    23  	testing.IsolationSuite
    24  	config secretsdrainworker.ManifoldConfig
    25  }
    26  
    27  var _ = gc.Suite(&ManifoldSuite{})
    28  
    29  func (s *ManifoldSuite) SetUpTest(c *gc.C) {
    30  	s.IsolationSuite.SetUpTest(c)
    31  	s.config = s.validConfig()
    32  }
    33  
    34  func (s *ManifoldSuite) validConfig() secretsdrainworker.ManifoldConfig {
    35  	return secretsdrainworker.ManifoldConfig{
    36  		APICallerName: "api-caller",
    37  		Logger:        loggo.GetLogger("test"),
    38  		NewWorker: func(config secretsdrainworker.Config) (worker.Worker, error) {
    39  			return nil, nil
    40  		},
    41  		NewSecretsDrainFacade: func(base.APICaller) secretsdrainworker.SecretsDrainFacade { return nil },
    42  		NewBackendsClient: func(base.APICaller) (jujusecrets.BackendsClient, error) {
    43  			return nil, nil
    44  		},
    45  	}
    46  }
    47  
    48  func (s *ManifoldSuite) TestValid(c *gc.C) {
    49  	c.Check(s.config.Validate(), jc.ErrorIsNil)
    50  }
    51  
    52  func (s *ManifoldSuite) TestMissingAPICallerName(c *gc.C) {
    53  	s.config.APICallerName = ""
    54  	s.checkNotValid(c, "empty APICallerName not valid")
    55  }
    56  
    57  func (s *ManifoldSuite) TestMissingLogger(c *gc.C) {
    58  	s.config.Logger = nil
    59  	s.checkNotValid(c, "nil Logger not valid")
    60  }
    61  func (s *ManifoldSuite) TestMissingNewWorker(c *gc.C) {
    62  	s.config.NewWorker = nil
    63  	s.checkNotValid(c, "nil NewWorker not valid")
    64  }
    65  
    66  func (s *ManifoldSuite) TestMissingNewFacade(c *gc.C) {
    67  	s.config.NewSecretsDrainFacade = nil
    68  	s.checkNotValid(c, "nil NewSecretsDrainFacade not valid")
    69  }
    70  
    71  func (s *ManifoldSuite) TestMissingNewBackendsClient(c *gc.C) {
    72  	s.config.NewBackendsClient = nil
    73  	s.checkNotValid(c, "nil NewBackendsClient not valid")
    74  }
    75  
    76  func (s *ManifoldSuite) checkNotValid(c *gc.C, expect string) {
    77  	err := s.config.Validate()
    78  	c.Check(err, gc.ErrorMatches, expect)
    79  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    80  }
    81  
    82  func (s *ManifoldSuite) TestStart(c *gc.C) {
    83  	ctrl := gomock.NewController(c)
    84  	defer ctrl.Finish()
    85  
    86  	facade := mocks.NewMockSecretsDrainFacade(ctrl)
    87  	s.config.NewSecretsDrainFacade = func(base.APICaller) secretsdrainworker.SecretsDrainFacade {
    88  		return facade
    89  	}
    90  
    91  	backendClients := mocks.NewMockBackendsClient(ctrl)
    92  	s.config.NewBackendsClient = func(base.APICaller) (jujusecrets.BackendsClient, error) {
    93  		return backendClients, nil
    94  	}
    95  
    96  	called := false
    97  	s.config.NewWorker = func(config secretsdrainworker.Config) (worker.Worker, error) {
    98  		called = true
    99  		mc := jc.NewMultiChecker()
   100  		mc.AddExpr(`_.Facade`, gc.NotNil)
   101  		mc.AddExpr(`_.Logger`, gc.NotNil)
   102  		mc.AddExpr(`_.SecretsBackendGetter`, gc.NotNil)
   103  		c.Check(config, mc, secretsdrainworker.Config{SecretsDrainFacade: facade})
   104  		return nil, nil
   105  	}
   106  	manifold := secretsdrainworker.Manifold(s.config)
   107  	w, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{
   108  		"api-caller": struct{ base.APICaller }{&mockAPICaller{}},
   109  	}))
   110  	c.Assert(w, gc.IsNil)
   111  	c.Assert(err, jc.ErrorIsNil)
   112  	c.Assert(called, jc.IsTrue)
   113  }
   114  
   115  type mockAPICaller struct {
   116  	base.APICaller
   117  }
   118  
   119  func (*mockAPICaller) BestFacadeVersion(facade string) int {
   120  	return 1
   121  }