github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/state/apiserver/common/setstatus_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package common_test
     5  
     6  import (
     7  	"fmt"
     8  
     9  	gc "launchpad.net/gocheck"
    10  
    11  	"launchpad.net/juju-core/state"
    12  	"launchpad.net/juju-core/state/api/params"
    13  	"launchpad.net/juju-core/state/apiserver/common"
    14  	apiservertesting "launchpad.net/juju-core/state/apiserver/testing"
    15  )
    16  
    17  type statusSetterSuite struct{}
    18  
    19  var _ = gc.Suite(&statusSetterSuite{})
    20  
    21  type fakeStatusSetter struct {
    22  	state.Entity
    23  	status params.Status
    24  	info   string
    25  	data   params.StatusData
    26  	err    error
    27  	fetchError
    28  }
    29  
    30  func (s *fakeStatusSetter) SetStatus(status params.Status, info string, data params.StatusData) error {
    31  	s.status = status
    32  	s.info = info
    33  	s.data = data
    34  	return s.err
    35  }
    36  
    37  func (*statusSetterSuite) TestSetStatus(c *gc.C) {
    38  	st := &fakeState{
    39  		entities: map[string]entityWithError{
    40  			"x0": &fakeStatusSetter{status: params.StatusPending, info: "blah", err: fmt.Errorf("x0 fails")},
    41  			"x1": &fakeStatusSetter{status: params.StatusStarted, info: "foo"},
    42  			"x2": &fakeStatusSetter{status: params.StatusError, info: "some info"},
    43  			"x3": &fakeStatusSetter{fetchError: "x3 error"},
    44  			"x4": &fakeStatusSetter{status: params.StatusStopped, info: ""},
    45  		},
    46  	}
    47  	getCanModify := func() (common.AuthFunc, error) {
    48  		return func(tag string) bool {
    49  			switch tag {
    50  			case "x0", "x1", "x2", "x3":
    51  				return true
    52  			}
    53  			return false
    54  		}, nil
    55  	}
    56  	s := common.NewStatusSetter(st, getCanModify)
    57  	args := params.SetStatus{
    58  		Entities: []params.SetEntityStatus{
    59  			{"x0", params.StatusStarted, "bar", nil},
    60  			{"x1", params.StatusStopped, "", nil},
    61  			{"x2", params.StatusPending, "not really", nil},
    62  			{"x3", params.StatusStopped, "", nil},
    63  			{"x4", params.StatusError, "blarg", nil},
    64  			{"x5", params.StatusStarted, "42", nil},
    65  		},
    66  	}
    67  	result, err := s.SetStatus(args)
    68  	c.Assert(err, gc.IsNil)
    69  	c.Assert(result, gc.DeepEquals, params.ErrorResults{
    70  		Results: []params.ErrorResult{
    71  			{&params.Error{Message: "x0 fails"}},
    72  			{nil},
    73  			{nil},
    74  			{&params.Error{Message: "x3 error"}},
    75  			{apiservertesting.ErrUnauthorized},
    76  			{apiservertesting.ErrUnauthorized},
    77  		},
    78  	})
    79  	get := func(tag string) *fakeStatusSetter {
    80  		return st.entities[tag].(*fakeStatusSetter)
    81  	}
    82  	c.Assert(get("x1").status, gc.Equals, params.StatusStopped)
    83  	c.Assert(get("x1").info, gc.Equals, "")
    84  	c.Assert(get("x2").status, gc.Equals, params.StatusPending)
    85  	c.Assert(get("x2").info, gc.Equals, "not really")
    86  }
    87  
    88  func (*statusSetterSuite) TestSetStatusError(c *gc.C) {
    89  	getCanModify := func() (common.AuthFunc, error) {
    90  		return nil, fmt.Errorf("pow")
    91  	}
    92  	s := common.NewStatusSetter(&fakeState{}, getCanModify)
    93  	args := params.SetStatus{
    94  		Entities: []params.SetEntityStatus{{"x0", "", "", nil}},
    95  	}
    96  	_, err := s.SetStatus(args)
    97  	c.Assert(err, gc.ErrorMatches, "pow")
    98  }
    99  
   100  func (*statusSetterSuite) TestSetStatusNoArgsNoError(c *gc.C) {
   101  	getCanModify := func() (common.AuthFunc, error) {
   102  		return nil, fmt.Errorf("pow")
   103  	}
   104  	s := common.NewStatusSetter(&fakeState{}, getCanModify)
   105  	result, err := s.SetStatus(params.SetStatus{})
   106  	c.Assert(err, gc.IsNil)
   107  	c.Assert(result.Results, gc.HasLen, 0)
   108  }