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

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package charmrevision_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/clock"
    10  	"github.com/juju/errors"
    11  	"github.com/juju/testing"
    12  	jc "github.com/juju/testing/checkers"
    13  	"github.com/juju/worker/v3"
    14  	"github.com/juju/worker/v3/dependency"
    15  	dt "github.com/juju/worker/v3/dependency/testing"
    16  	gc "gopkg.in/check.v1"
    17  
    18  	"github.com/juju/juju/api/base"
    19  	"github.com/juju/juju/worker/charmrevision"
    20  )
    21  
    22  type ManifoldSuite struct {
    23  	testing.IsolationSuite
    24  }
    25  
    26  var _ = gc.Suite(&ManifoldSuite{})
    27  
    28  func (s *ManifoldSuite) TestManifold(c *gc.C) {
    29  	manifold := charmrevision.Manifold(charmrevision.ManifoldConfig{
    30  		APICallerName: "billy",
    31  	})
    32  
    33  	c.Check(manifold.Inputs, jc.DeepEquals, []string{"billy"})
    34  	c.Check(manifold.Start, gc.NotNil)
    35  	c.Check(manifold.Output, gc.IsNil)
    36  }
    37  
    38  func (s *ManifoldSuite) TestMissingAPICaller(c *gc.C) {
    39  	manifold := charmrevision.Manifold(charmrevision.ManifoldConfig{
    40  		APICallerName: "api-caller",
    41  		Clock:         fakeClock{},
    42  	})
    43  
    44  	_, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{
    45  		"api-caller": dependency.ErrMissing,
    46  	}))
    47  	c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing)
    48  }
    49  
    50  func (s *ManifoldSuite) TestMissingClock(c *gc.C) {
    51  	manifold := charmrevision.Manifold(charmrevision.ManifoldConfig{
    52  		APICallerName: "api-caller",
    53  	})
    54  
    55  	_, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{
    56  		"api-caller": fakeAPICaller{},
    57  	}))
    58  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    59  	c.Check(err.Error(), gc.Equals, "nil Clock not valid")
    60  }
    61  
    62  func (s *ManifoldSuite) TestNewFacadeError(c *gc.C) {
    63  	fakeAPICaller := &fakeAPICaller{}
    64  
    65  	stub := testing.Stub{}
    66  	manifold := charmrevision.Manifold(charmrevision.ManifoldConfig{
    67  		APICallerName: "api-caller",
    68  		Clock:         fakeClock{},
    69  		NewFacade: func(apiCaller base.APICaller) (charmrevision.Facade, error) {
    70  			stub.AddCall("NewFacade", apiCaller)
    71  			return nil, errors.New("blefgh")
    72  		},
    73  	})
    74  
    75  	_, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{
    76  		"api-caller": fakeAPICaller,
    77  	}))
    78  	c.Check(err, gc.ErrorMatches, "cannot create facade: blefgh")
    79  	stub.CheckCalls(c, []testing.StubCall{{
    80  		"NewFacade", []interface{}{fakeAPICaller},
    81  	}})
    82  }
    83  
    84  func (s *ManifoldSuite) TestNewWorkerError(c *gc.C) {
    85  	fakeClock := &fakeClock{}
    86  	fakeFacade := &fakeFacade{}
    87  	fakeAPICaller := &fakeAPICaller{}
    88  
    89  	stub := testing.Stub{}
    90  	manifold := charmrevision.Manifold(charmrevision.ManifoldConfig{
    91  		APICallerName: "api-caller",
    92  		Clock:         fakeClock,
    93  		NewFacade: func(apiCaller base.APICaller) (charmrevision.Facade, error) {
    94  			stub.AddCall("NewFacade", apiCaller)
    95  			return fakeFacade, nil
    96  		},
    97  		NewWorker: func(config charmrevision.Config) (worker.Worker, error) {
    98  			stub.AddCall("NewWorker", config)
    99  			return nil, errors.New("snrght")
   100  		},
   101  	})
   102  
   103  	_, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{
   104  		"api-caller": fakeAPICaller,
   105  	}))
   106  	c.Check(err, gc.ErrorMatches, "cannot create worker: snrght")
   107  	stub.CheckCalls(c, []testing.StubCall{{
   108  		"NewFacade", []interface{}{fakeAPICaller},
   109  	}, {
   110  		"NewWorker", []interface{}{charmrevision.Config{
   111  			RevisionUpdater: fakeFacade,
   112  			Clock:           fakeClock,
   113  		}},
   114  	}})
   115  }
   116  
   117  func (s *ManifoldSuite) TestSuccess(c *gc.C) {
   118  	fakeClock := &fakeClock{}
   119  	fakeFacade := &fakeFacade{}
   120  	fakeWorker := &fakeWorker{}
   121  	fakeAPICaller := &fakeAPICaller{}
   122  
   123  	stub := testing.Stub{}
   124  	manifold := charmrevision.Manifold(charmrevision.ManifoldConfig{
   125  		APICallerName: "api-caller",
   126  		Clock:         fakeClock,
   127  		Period:        10 * time.Minute,
   128  		NewFacade: func(apiCaller base.APICaller) (charmrevision.Facade, error) {
   129  			stub.AddCall("NewFacade", apiCaller)
   130  			return fakeFacade, nil
   131  		},
   132  		NewWorker: func(config charmrevision.Config) (worker.Worker, error) {
   133  			stub.AddCall("NewWorker", config)
   134  			return fakeWorker, nil
   135  		},
   136  	})
   137  
   138  	w, err := manifold.Start(dt.StubContext(nil, map[string]interface{}{
   139  		"api-caller": fakeAPICaller,
   140  	}))
   141  	c.Check(w, gc.Equals, fakeWorker)
   142  	c.Check(err, jc.ErrorIsNil)
   143  	stub.CheckCalls(c, []testing.StubCall{{
   144  		"NewFacade", []interface{}{fakeAPICaller},
   145  	}, {
   146  		"NewWorker", []interface{}{charmrevision.Config{
   147  			Period:          10 * time.Minute,
   148  			RevisionUpdater: fakeFacade,
   149  			Clock:           fakeClock,
   150  		}},
   151  	}})
   152  }
   153  
   154  type fakeAPICaller struct {
   155  	base.APICaller
   156  }
   157  
   158  type fakeClock struct {
   159  	clock.Clock
   160  }
   161  
   162  type fakeWorker struct {
   163  	worker.Worker
   164  }
   165  
   166  type fakeFacade struct {
   167  	charmrevision.Facade
   168  }