github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/api/common/upgradeseries_test.go (about)

     1  // Copyright 2018 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package common_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/testing"
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  	"gopkg.in/juju/names.v2"
    12  
    13  	apitesting "github.com/juju/juju/api/base/testing"
    14  	"github.com/juju/juju/api/common"
    15  	"github.com/juju/juju/apiserver/params"
    16  	"github.com/juju/juju/core/model"
    17  )
    18  
    19  type upgradeSeriesSuite struct {
    20  	testing.IsolationSuite
    21  	tag names.Tag
    22  }
    23  
    24  var _ = gc.Suite(&upgradeSeriesSuite{})
    25  
    26  func (s *upgradeSeriesSuite) SetUpTest(c *gc.C) {
    27  	s.tag = names.NewMachineTag("0")
    28  }
    29  
    30  func (s *upgradeSeriesSuite) TestWatchUpgradeSeriesNotifications(c *gc.C) {
    31  	facadeCaller := apitesting.StubFacadeCaller{Stub: &testing.Stub{}}
    32  	facadeCaller.FacadeCallFn = func(name string, args, response interface{}) error {
    33  		c.Assert(name, gc.Equals, "WatchUpgradeSeriesNotifications")
    34  		c.Assert(args, jc.DeepEquals, params.Entities{Entities: []params.Entity{
    35  			{Tag: s.tag.String()},
    36  		}})
    37  		*(response.(*params.NotifyWatchResults)) = params.NotifyWatchResults{
    38  			Results: []params.NotifyWatchResult{{
    39  				NotifyWatcherId: "1",
    40  				Error:           nil,
    41  			}},
    42  		}
    43  		return nil
    44  	}
    45  	apiCaller := apitesting.APICallerFunc(
    46  		func(objType string,
    47  			version int,
    48  			id, request string,
    49  			a, result interface{},
    50  		) error {
    51  			c.Check(objType, gc.Equals, "NotifyWatcher")
    52  			c.Check(id, gc.Equals, "1")
    53  			c.Check(request, gc.Equals, "Next")
    54  			c.Check(a, gc.IsNil)
    55  			return nil
    56  		},
    57  	)
    58  	facadeCaller.ReturnRawAPICaller = apitesting.BestVersionCaller{APICallerFunc: apiCaller, BestVersion: 1}
    59  
    60  	api := common.NewUpgradeSeriesAPI(&facadeCaller, s.tag)
    61  	_, err := api.WatchUpgradeSeriesNotifications()
    62  	c.Assert(err, jc.ErrorIsNil)
    63  }
    64  
    65  func (s *upgradeSeriesSuite) TestUpgradeSeriesStatusPrepare(c *gc.C) {
    66  	facadeCaller := apitesting.StubFacadeCaller{Stub: &testing.Stub{}}
    67  	facadeCaller.FacadeCallFn = func(name string, args, response interface{}) error {
    68  		c.Assert(name, gc.Equals, "UpgradeSeriesUnitStatus")
    69  		c.Assert(args, jc.DeepEquals, params.Entities{Entities: []params.Entity{
    70  			{Tag: s.tag.String()},
    71  		}})
    72  		*(response.(*params.UpgradeSeriesStatusResults)) = params.UpgradeSeriesStatusResults{
    73  			Results: []params.UpgradeSeriesStatusResult{{Status: model.UpgradeSeriesCompleted}},
    74  		}
    75  		return nil
    76  	}
    77  	api := common.NewUpgradeSeriesAPI(&facadeCaller, s.tag)
    78  	watchResult, err := api.UpgradeSeriesUnitStatus()
    79  	c.Assert(err, jc.ErrorIsNil)
    80  
    81  	exp := []model.UpgradeSeriesStatus{model.UpgradeSeriesCompleted}
    82  	c.Check(watchResult, jc.SameContents, exp)
    83  }
    84  
    85  func (s *upgradeSeriesSuite) TestUpgradeSeriesStatusWithComplete(c *gc.C) {
    86  	facadeCaller := apitesting.StubFacadeCaller{Stub: &testing.Stub{}}
    87  	facadeCaller.FacadeCallFn = func(name string, args, response interface{}) error {
    88  		c.Assert(name, gc.Equals, "UpgradeSeriesUnitStatus")
    89  		c.Assert(args, jc.DeepEquals, params.Entities{Entities: []params.Entity{
    90  			{Tag: s.tag.String()},
    91  		}})
    92  		*(response.(*params.UpgradeSeriesStatusResults)) = params.UpgradeSeriesStatusResults{
    93  			Results: []params.UpgradeSeriesStatusResult{{Status: model.UpgradeSeriesCompleted}},
    94  		}
    95  		return nil
    96  	}
    97  	api := common.NewUpgradeSeriesAPI(&facadeCaller, s.tag)
    98  	watchResult, err := api.UpgradeSeriesUnitStatus()
    99  	c.Assert(err, jc.ErrorIsNil)
   100  
   101  	exp := []model.UpgradeSeriesStatus{model.UpgradeSeriesCompleted}
   102  	c.Check(watchResult, jc.SameContents, exp)
   103  }
   104  
   105  func (s *upgradeSeriesSuite) TestUpgradeSeriesStatusNotFound(c *gc.C) {
   106  	facadeCaller := apitesting.StubFacadeCaller{Stub: &testing.Stub{}}
   107  	facadeCaller.FacadeCallFn = func(name string, args, response interface{}) error {
   108  		c.Assert(name, gc.Equals, "UpgradeSeriesUnitStatus")
   109  		c.Assert(args, jc.DeepEquals, params.Entities{Entities: []params.Entity{
   110  			{Tag: s.tag.String()},
   111  		}})
   112  		*(response.(*params.UpgradeSeriesStatusResults)) = params.UpgradeSeriesStatusResults{
   113  			Results: []params.UpgradeSeriesStatusResult{{
   114  				Error: &params.Error{
   115  					Code:    params.CodeNotFound,
   116  					Message: `testing`,
   117  				},
   118  			}},
   119  		}
   120  		return nil
   121  	}
   122  	api := common.NewUpgradeSeriesAPI(&facadeCaller, s.tag)
   123  	watchResult, err := api.UpgradeSeriesUnitStatus()
   124  	c.Assert(err, gc.ErrorMatches, "testing")
   125  	c.Check(errors.IsNotFound(err), jc.IsTrue)
   126  	c.Check(watchResult, gc.HasLen, 0)
   127  }
   128  
   129  func (s *upgradeSeriesSuite) TestUpgradeSeriesStatusMultiple(c *gc.C) {
   130  	facadeCaller := apitesting.StubFacadeCaller{Stub: &testing.Stub{}}
   131  	facadeCaller.FacadeCallFn = func(name string, args, response interface{}) error {
   132  		c.Assert(name, gc.Equals, "UpgradeSeriesUnitStatus")
   133  		c.Assert(args, jc.DeepEquals, params.Entities{Entities: []params.Entity{
   134  			{Tag: s.tag.String()},
   135  		}})
   136  		*(response.(*params.UpgradeSeriesStatusResults)) = params.UpgradeSeriesStatusResults{
   137  			Results: []params.UpgradeSeriesStatusResult{
   138  				{Status: "prepare started"},
   139  				{Status: "prepare completed"},
   140  			},
   141  		}
   142  		return nil
   143  	}
   144  	api := common.NewUpgradeSeriesAPI(&facadeCaller, s.tag)
   145  	watchResult, err := api.UpgradeSeriesUnitStatus()
   146  	c.Assert(err, jc.ErrorIsNil)
   147  
   148  	exp := []model.UpgradeSeriesStatus{model.UpgradeSeriesPrepareStarted, model.UpgradeSeriesPrepareCompleted}
   149  	c.Check(watchResult, jc.SameContents, exp)
   150  }
   151  
   152  func (s *upgradeSeriesSuite) TestSetUpgradeSeriesStatus(c *gc.C) {
   153  	facadeCaller := apitesting.StubFacadeCaller{Stub: &testing.Stub{}}
   154  	facadeCaller.FacadeCallFn = func(name string, args, response interface{}) error {
   155  		c.Assert(name, gc.Equals, "SetUpgradeSeriesUnitStatus")
   156  		c.Assert(args, jc.DeepEquals, params.UpgradeSeriesStatusParams{
   157  			Params: []params.UpgradeSeriesStatusParam{{
   158  				Entity: params.Entity{Tag: s.tag.String()},
   159  				Status: model.UpgradeSeriesError,
   160  			}},
   161  		})
   162  		*(response.(*params.ErrorResults)) = params.ErrorResults{
   163  			Results: []params.ErrorResult{{
   164  				Error: nil,
   165  			}},
   166  		}
   167  		return nil
   168  	}
   169  	api := common.NewUpgradeSeriesAPI(&facadeCaller, s.tag)
   170  	err := api.SetUpgradeSeriesUnitStatus(model.UpgradeSeriesError, "")
   171  	c.Assert(err, jc.ErrorIsNil)
   172  }
   173  
   174  func (s *upgradeSeriesSuite) TestSetUpgradeSeriesStatusNotOne(c *gc.C) {
   175  	facadeCaller := apitesting.StubFacadeCaller{Stub: &testing.Stub{}}
   176  	facadeCaller.FacadeCallFn = func(name string, args, response interface{}) error {
   177  		c.Assert(name, gc.Equals, "SetUpgradeSeriesUnitStatus")
   178  		c.Assert(args, jc.DeepEquals, params.UpgradeSeriesStatusParams{
   179  			Params: []params.UpgradeSeriesStatusParam{{
   180  				Entity: params.Entity{Tag: s.tag.String()},
   181  				Status: model.UpgradeSeriesError,
   182  			}},
   183  		})
   184  		*(response.(*params.ErrorResults)) = params.ErrorResults{
   185  			Results: []params.ErrorResult{},
   186  		}
   187  		return nil
   188  	}
   189  	api := common.NewUpgradeSeriesAPI(&facadeCaller, s.tag)
   190  	err := api.SetUpgradeSeriesUnitStatus(model.UpgradeSeriesError, "")
   191  	c.Assert(err, gc.ErrorMatches, "expected 1 result, got 0")
   192  }
   193  
   194  func (s *upgradeSeriesSuite) TestSetUpgradeSeriesStatusResultError(c *gc.C) {
   195  	facadeCaller := apitesting.StubFacadeCaller{Stub: &testing.Stub{}}
   196  	facadeCaller.FacadeCallFn = func(name string, args, response interface{}) error {
   197  		c.Assert(name, gc.Equals, "SetUpgradeSeriesUnitStatus")
   198  		c.Assert(args, jc.DeepEquals, params.UpgradeSeriesStatusParams{
   199  			Params: []params.UpgradeSeriesStatusParam{{
   200  				Entity: params.Entity{Tag: s.tag.String()},
   201  				Status: model.UpgradeSeriesError,
   202  			}},
   203  		})
   204  		*(response.(*params.ErrorResults)) = params.ErrorResults{
   205  			Results: []params.ErrorResult{{
   206  				Error: &params.Error{Message: "error in call"},
   207  			}},
   208  		}
   209  		return nil
   210  	}
   211  	api := common.NewUpgradeSeriesAPI(&facadeCaller, s.tag)
   212  	err := api.SetUpgradeSeriesUnitStatus(model.UpgradeSeriesError, "")
   213  	c.Assert(err, gc.ErrorMatches, "error in call")
   214  }