launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/state/apiserver/common/remove_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  	"launchpad.net/errgo/errors"
     8  	gc "launchpad.net/gocheck"
     9  
    10  	"launchpad.net/juju-core/state"
    11  	"launchpad.net/juju-core/state/api/params"
    12  	"launchpad.net/juju-core/state/apiserver/common"
    13  	apiservertesting "launchpad.net/juju-core/state/apiserver/testing"
    14  )
    15  
    16  type removeSuite struct{}
    17  
    18  var _ = gc.Suite(&removeSuite{})
    19  
    20  type fakeRemover struct {
    21  	state.Entity
    22  	life          state.Life
    23  	errEnsureDead error
    24  	errRemove     error
    25  	fetchError
    26  }
    27  
    28  func (r *fakeRemover) EnsureDead() error {
    29  	return r.errEnsureDead
    30  }
    31  
    32  func (r *fakeRemover) Remove() error {
    33  	return r.errRemove
    34  }
    35  
    36  func (r *fakeRemover) Life() state.Life {
    37  	return r.life
    38  }
    39  
    40  func (*removeSuite) TestRemove(c *gc.C) {
    41  	st := &fakeState{
    42  		entities: map[string]entityWithError{
    43  			"x0": &fakeRemover{life: state.Dying, errEnsureDead: errors.Newf("x0 EnsureDead fails")},
    44  			"x1": &fakeRemover{life: state.Dying, errRemove: errors.Newf("x1 Remove fails")},
    45  			"x2": &fakeRemover{life: state.Alive},
    46  			"x3": &fakeRemover{life: state.Dying},
    47  			"x4": &fakeRemover{life: state.Dead},
    48  			"x5": &fakeRemover{fetchError: "x5 error"},
    49  		},
    50  	}
    51  	getCanModify := func() (common.AuthFunc, error) {
    52  		return func(tag string) bool {
    53  			switch tag {
    54  			case "x0", "x1", "x2", "x3", "x5":
    55  				return true
    56  			}
    57  			return false
    58  		}, nil
    59  	}
    60  	r := common.NewRemover(st, true, getCanModify)
    61  	entities := params.Entities{[]params.Entity{
    62  		{"x0"}, {"x1"}, {"x2"}, {"x3"}, {"x4"}, {"x5"}, {"x6"},
    63  	}}
    64  	result, err := r.Remove(entities)
    65  	c.Assert(err, gc.IsNil)
    66  	c.Assert(result, gc.DeepEquals, params.ErrorResults{
    67  		Results: []params.ErrorResult{
    68  			{&params.Error{Message: "x0 EnsureDead fails"}},
    69  			{&params.Error{Message: "x1 Remove fails"}},
    70  			{&params.Error{Message: `cannot remove entity "x2": still alive`}},
    71  			{nil},
    72  			{apiservertesting.ErrUnauthorized},
    73  			{&params.Error{Message: "x5 error"}},
    74  			{apiservertesting.ErrUnauthorized},
    75  		},
    76  	})
    77  
    78  	// Make sure when callEnsureDead is false EnsureDead() doesn't
    79  	// get called.
    80  	r = common.NewRemover(st, false, getCanModify)
    81  	entities = params.Entities{[]params.Entity{{"x0"}, {"x1"}}}
    82  	result, err = r.Remove(entities)
    83  	c.Assert(err, gc.IsNil)
    84  	c.Assert(result, gc.DeepEquals, params.ErrorResults{
    85  		Results: []params.ErrorResult{
    86  			{nil},
    87  			{&params.Error{Message: "x1 Remove fails"}},
    88  		},
    89  	})
    90  }
    91  
    92  func (*removeSuite) TestRemoveError(c *gc.C) {
    93  	getCanModify := func() (common.AuthFunc, error) {
    94  		return nil, errors.Newf("pow")
    95  	}
    96  	r := common.NewRemover(&fakeState{}, true, getCanModify)
    97  	_, err := r.Remove(params.Entities{[]params.Entity{{"x0"}}})
    98  	c.Assert(err, gc.ErrorMatches, "pow")
    99  }
   100  
   101  func (*removeSuite) TestRemoveNoArgsNoError(c *gc.C) {
   102  	getCanModify := func() (common.AuthFunc, error) {
   103  		return nil, errors.Newf("pow")
   104  	}
   105  	r := common.NewRemover(&fakeState{}, true, getCanModify)
   106  	result, err := r.Remove(params.Entities{})
   107  	c.Assert(err, gc.IsNil)
   108  	c.Assert(result.Results, gc.HasLen, 0)
   109  }