github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/caasapplicationprovisioner/manifold_test.go (about)

     1  // Copyright 2020 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package caasapplicationprovisioner_test
     5  
     6  import (
     7  	"github.com/juju/clock"
     8  	"github.com/juju/errors"
     9  	"github.com/juju/loggo"
    10  	"github.com/juju/names/v5"
    11  	"github.com/juju/testing"
    12  	jc "github.com/juju/testing/checkers"
    13  	"github.com/juju/worker/v3"
    14  	dt "github.com/juju/worker/v3/dependency/testing"
    15  	gc "gopkg.in/check.v1"
    16  
    17  	"github.com/juju/juju/api/base"
    18  	"github.com/juju/juju/caas"
    19  	"github.com/juju/juju/worker/caasapplicationprovisioner"
    20  )
    21  
    22  type ManifoldSuite struct {
    23  	testing.IsolationSuite
    24  	config caasapplicationprovisioner.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() caasapplicationprovisioner.ManifoldConfig {
    35  	return caasapplicationprovisioner.ManifoldConfig{
    36  		APICallerName: "api-caller",
    37  		BrokerName:    "broker",
    38  		ClockName:     "clock",
    39  		NewWorker: func(config caasapplicationprovisioner.Config) (worker.Worker, error) {
    40  			return nil, nil
    41  		},
    42  		Logger: loggo.GetLogger("test"),
    43  	}
    44  }
    45  
    46  func (s *ManifoldSuite) TestValid(c *gc.C) {
    47  	c.Check(s.config.Validate(), jc.ErrorIsNil)
    48  }
    49  
    50  func (s *ManifoldSuite) TestMissingAPICallerName(c *gc.C) {
    51  	s.config.APICallerName = ""
    52  	s.checkNotValid(c, "empty APICallerName not valid")
    53  }
    54  
    55  func (s *ManifoldSuite) TestMissingBrokerName(c *gc.C) {
    56  	s.config.BrokerName = ""
    57  	s.checkNotValid(c, "empty BrokerName not valid")
    58  }
    59  
    60  func (s *ManifoldSuite) TestMissingClockName(c *gc.C) {
    61  	s.config.ClockName = ""
    62  	s.checkNotValid(c, "empty ClockName not valid")
    63  }
    64  
    65  func (s *ManifoldSuite) TestMissingNewWorker(c *gc.C) {
    66  	s.config.NewWorker = nil
    67  	s.checkNotValid(c, "nil NewWorker not valid")
    68  }
    69  
    70  func (s *ManifoldSuite) TestMissingLogger(c *gc.C) {
    71  	s.config.Logger = nil
    72  	s.checkNotValid(c, "nil Logger not valid")
    73  }
    74  
    75  func (s *ManifoldSuite) checkNotValid(c *gc.C, expect string) {
    76  	err := s.config.Validate()
    77  	c.Check(err, gc.ErrorMatches, expect)
    78  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    79  }
    80  
    81  func (s *ManifoldSuite) TestStart(c *gc.C) {
    82  	called := false
    83  	s.config.NewWorker = func(config caasapplicationprovisioner.Config) (worker.Worker, error) {
    84  		called = true
    85  		mc := jc.NewMultiChecker()
    86  		mc.AddExpr(`_.Facade`, gc.NotNil)
    87  		mc.AddExpr(`_.Broker`, gc.NotNil)
    88  		mc.AddExpr(`_.Clock`, gc.NotNil)
    89  		mc.AddExpr(`_.Logger`, gc.NotNil)
    90  		mc.AddExpr(`_.NewAppWorker`, gc.NotNil)
    91  		mc.AddExpr(`_.UnitFacade`, gc.NotNil)
    92  		c.Check(config, mc, caasapplicationprovisioner.Config{
    93  			ModelTag: names.NewModelTag("ffffffff-ffff-ffff-ffff-ffffffffffff"),
    94  		})
    95  		return nil, nil
    96  	}
    97  	manifold := caasapplicationprovisioner.Manifold(s.config)
    98  	w, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{
    99  		"api-caller": struct{ base.APICaller }{&mockAPICaller{}},
   100  		"broker":     struct{ caas.Broker }{},
   101  		"clock":      struct{ clock.Clock }{},
   102  	}))
   103  	c.Assert(w, gc.IsNil)
   104  	c.Assert(err, jc.ErrorIsNil)
   105  	c.Assert(called, jc.IsTrue)
   106  }
   107  
   108  type mockAPICaller struct {
   109  	base.APICaller
   110  }
   111  
   112  func (*mockAPICaller) BestFacadeVersion(facade string) int {
   113  	return 1
   114  }
   115  
   116  func (*mockAPICaller) ModelTag() (names.ModelTag, bool) {
   117  	return names.NewModelTag("ffffffff-ffff-ffff-ffff-ffffffffffff"), true
   118  }