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 }