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

     1  // Copyright 2012-2014 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  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  	"gopkg.in/juju/names.v2"
    11  
    12  	"github.com/juju/juju/apiserver/common"
    13  	"github.com/juju/juju/apiserver/params"
    14  	"github.com/juju/juju/state"
    15  	"github.com/juju/juju/testing"
    16  )
    17  
    18  type mockBlock struct {
    19  	state.Block
    20  	t state.BlockType
    21  	m string
    22  }
    23  
    24  func (m mockBlock) Id() string { return "" }
    25  
    26  func (m mockBlock) Tag() (names.Tag, error) { return names.NewModelTag("mocktesting"), nil }
    27  
    28  func (m mockBlock) Type() state.BlockType { return m.t }
    29  
    30  func (m mockBlock) Message() string { return m.m }
    31  
    32  func (m mockBlock) ModelUUID() string { return "" }
    33  
    34  type blockCheckerSuite struct {
    35  	testing.FakeJujuXDGDataHomeSuite
    36  	aBlock                  state.Block
    37  	destroy, remove, change state.Block
    38  
    39  	blockchecker *common.BlockChecker
    40  }
    41  
    42  var _ = gc.Suite(&blockCheckerSuite{})
    43  
    44  func (s *blockCheckerSuite) SetUpTest(c *gc.C) {
    45  	s.FakeJujuXDGDataHomeSuite.SetUpTest(c)
    46  	s.destroy = mockBlock{t: state.DestroyBlock, m: "Mock BLOCK testing: DESTROY"}
    47  	s.remove = mockBlock{t: state.RemoveBlock, m: "Mock BLOCK testing: REMOVE"}
    48  	s.change = mockBlock{t: state.ChangeBlock, m: "Mock BLOCK testing: CHANGE"}
    49  	s.blockchecker = common.NewBlockChecker(s)
    50  }
    51  
    52  func (mock *blockCheckerSuite) GetBlockForType(t state.BlockType) (state.Block, bool, error) {
    53  	if mock.aBlock.Type() == t {
    54  		return mock.aBlock, true, nil
    55  	} else {
    56  		return nil, false, nil
    57  	}
    58  }
    59  
    60  func (s *blockCheckerSuite) TestDestroyBlockChecker(c *gc.C) {
    61  	s.aBlock = s.destroy
    62  	s.assertErrorBlocked(c, true, s.blockchecker.DestroyAllowed(), s.destroy.Message())
    63  
    64  	s.aBlock = s.remove
    65  	s.assertErrorBlocked(c, true, s.blockchecker.DestroyAllowed(), s.remove.Message())
    66  
    67  	s.aBlock = s.change
    68  	s.assertErrorBlocked(c, true, s.blockchecker.DestroyAllowed(), s.change.Message())
    69  }
    70  
    71  func (s *blockCheckerSuite) TestRemoveBlockChecker(c *gc.C) {
    72  	s.aBlock = s.destroy
    73  	s.assertErrorBlocked(c, false, s.blockchecker.RemoveAllowed(), s.destroy.Message())
    74  
    75  	s.aBlock = s.remove
    76  	s.assertErrorBlocked(c, true, s.blockchecker.RemoveAllowed(), s.remove.Message())
    77  
    78  	s.aBlock = s.change
    79  	s.assertErrorBlocked(c, true, s.blockchecker.RemoveAllowed(), s.change.Message())
    80  }
    81  
    82  func (s *blockCheckerSuite) TestChangeBlockChecker(c *gc.C) {
    83  	s.aBlock = s.destroy
    84  	s.assertErrorBlocked(c, false, s.blockchecker.ChangeAllowed(), s.destroy.Message())
    85  
    86  	s.aBlock = s.remove
    87  	s.assertErrorBlocked(c, false, s.blockchecker.ChangeAllowed(), s.remove.Message())
    88  
    89  	s.aBlock = s.change
    90  	s.assertErrorBlocked(c, true, s.blockchecker.ChangeAllowed(), s.change.Message())
    91  }
    92  
    93  func (s *blockCheckerSuite) assertErrorBlocked(c *gc.C, blocked bool, err error, msg string) {
    94  	if blocked {
    95  		c.Assert(params.IsCodeOperationBlocked(err), jc.IsTrue)
    96  		c.Assert(err, gc.ErrorMatches, msg)
    97  	} else {
    98  		c.Assert(errors.Cause(err), jc.ErrorIsNil)
    99  	}
   100  }