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