github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/application/suspendrelation_test.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package application_test
     5  
     6  import (
     7  	"github.com/juju/cmd/cmdtesting"
     8  	"github.com/juju/errors"
     9  	"github.com/juju/testing"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/apiserver/common"
    14  	"github.com/juju/juju/cmd/juju/application"
    15  	"github.com/juju/juju/jujuclient/jujuclienttesting"
    16  	coretesting "github.com/juju/juju/testing"
    17  )
    18  
    19  type SuspendRelationSuite struct {
    20  	testing.IsolationSuite
    21  	mockAPI *mockSuspendAPI
    22  }
    23  
    24  func (s *SuspendRelationSuite) SetUpTest(c *gc.C) {
    25  	s.IsolationSuite.SetUpTest(c)
    26  	s.mockAPI = &mockSuspendAPI{Stub: &testing.Stub{}, version: 6}
    27  	s.mockAPI.setRelationSuspendedFunc = func(relationIds []int, suspended bool, message string) error {
    28  		return s.mockAPI.NextErr()
    29  	}
    30  }
    31  
    32  var _ = gc.Suite(&SuspendRelationSuite{})
    33  
    34  func (s *SuspendRelationSuite) runSuspendRelation(c *gc.C, args ...string) error {
    35  	store := jujuclienttesting.MinimalStore()
    36  	_, err := cmdtesting.RunCommand(c, application.NewSuspendRelationCommandForTest(s.mockAPI, store), args...)
    37  	return err
    38  }
    39  
    40  func (s *SuspendRelationSuite) TestSuspendRelationInvalidArguments(c *gc.C) {
    41  	// No arguments
    42  	err := s.runSuspendRelation(c)
    43  	c.Assert(err, gc.ErrorMatches, "no relation ids specified")
    44  
    45  	// argument not an integer
    46  	err = s.runSuspendRelation(c, "application1")
    47  	c.Assert(err, gc.ErrorMatches, `relation ID "application1" not valid`)
    48  }
    49  
    50  func (s *SuspendRelationSuite) TestSuspendRelationIdOldServer(c *gc.C) {
    51  	s.mockAPI.version = 4
    52  	err := s.runSuspendRelation(c, "123")
    53  	c.Assert(err, gc.ErrorMatches, "suspending a relation is not supported by this version of Juju")
    54  	s.mockAPI.CheckCall(c, 0, "Close")
    55  }
    56  
    57  func (s *SuspendRelationSuite) TestSuspendRelationSuccess(c *gc.C) {
    58  	err := s.runSuspendRelation(c, "123", "456", "--message", "message")
    59  	c.Assert(err, jc.ErrorIsNil)
    60  	s.mockAPI.CheckCall(c, 0, "SetRelationSuspended", []int{123, 456}, true, "message")
    61  	s.mockAPI.CheckCall(c, 1, "Close")
    62  }
    63  
    64  func (s *SuspendRelationSuite) TestSuspendRelationFail(c *gc.C) {
    65  	msg := "fail suspend-relation at API"
    66  	s.mockAPI.SetErrors(errors.New(msg))
    67  	err := s.runSuspendRelation(c, "123")
    68  	c.Assert(err, gc.ErrorMatches, msg)
    69  	s.mockAPI.CheckCall(c, 0, "SetRelationSuspended", []int{123}, true, "")
    70  	s.mockAPI.CheckCall(c, 1, "Close")
    71  }
    72  
    73  func (s *SuspendRelationSuite) TestSuspendRelationBlocked(c *gc.C) {
    74  	s.mockAPI.SetErrors(common.OperationBlockedError("TestSuspendRelationBlocked"))
    75  	err := s.runSuspendRelation(c, "123")
    76  	coretesting.AssertOperationWasBlocked(c, err, ".*TestSuspendRelationBlocked.*")
    77  	s.mockAPI.CheckCall(c, 0, "SetRelationSuspended", []int{123}, true, "")
    78  	s.mockAPI.CheckCall(c, 1, "Close")
    79  }
    80  
    81  type mockSuspendAPI struct {
    82  	*testing.Stub
    83  	version                  int
    84  	setRelationSuspendedFunc func(relationIds []int, suspended bool, message string) error
    85  }
    86  
    87  func (s mockSuspendAPI) Close() error {
    88  	s.MethodCall(s, "Close")
    89  	return s.NextErr()
    90  }
    91  
    92  func (s mockSuspendAPI) SetRelationSuspended(relationIds []int, suspended bool, message string) error {
    93  	s.MethodCall(s, "SetRelationSuspended", relationIds, suspended, message)
    94  	return s.setRelationSuspendedFunc(relationIds, suspended, message)
    95  }
    96  
    97  func (s mockSuspendAPI) BestAPIVersion() int {
    98  	return s.version
    99  }