github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/crossmodel/remove_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package crossmodel_test 5 6 import ( 7 "bytes" 8 "strings" 9 10 "github.com/juju/cmd" 11 "github.com/juju/cmd/cmdtesting" 12 "github.com/juju/errors" 13 jc "github.com/juju/testing/checkers" 14 gc "gopkg.in/check.v1" 15 16 "github.com/juju/juju/cmd/juju/crossmodel" 17 ) 18 19 type removeSuite struct { 20 BaseCrossModelSuite 21 mockAPI *mockRemoveAPI 22 } 23 24 var _ = gc.Suite(&removeSuite{}) 25 26 func (s *removeSuite) SetUpTest(c *gc.C) { 27 s.BaseCrossModelSuite.SetUpTest(c) 28 s.mockAPI = &mockRemoveAPI{version: 2} 29 } 30 31 func (s *removeSuite) runRemove(c *gc.C, args ...string) (*cmd.Context, error) { 32 return cmdtesting.RunCommand(c, crossmodel.NewRemoveCommandForTest(s.store, s.mockAPI), args...) 33 } 34 35 func (s *removeSuite) TestNonExistentController(c *gc.C) { 36 _, err := s.runRemove(c, "", "-c", "bad") 37 c.Assert(err, gc.ErrorMatches, `controller bad not found`) 38 } 39 40 func (s *removeSuite) TestRemoveURLError(c *gc.C) { 41 _, err := s.runRemove(c, "fred/model.foo/db2") 42 c.Assert(err, gc.ErrorMatches, "application offer URL has invalid form.*") 43 } 44 45 func (s *removeSuite) TestRemoveInconsistentControllers(c *gc.C) { 46 _, err := s.runRemove(c, "ctrl:fred/model.db2", "ctrl2:fred/model.db2") 47 c.Assert(err, gc.ErrorMatches, "all offer URLs must use the same controller") 48 } 49 50 func (s *removeSuite) TestRemoveApiError(c *gc.C) { 51 s.mockAPI.msg = "fail" 52 _, err := s.runRemove(c, "fred/model.db2", "-y") 53 c.Assert(err, gc.ErrorMatches, ".*fail.*") 54 } 55 56 func (s *removeSuite) TestRemove(c *gc.C) { 57 s.mockAPI.expectedURLs = []string{"fred/model.db2", "mary/model.db2"} 58 _, err := s.runRemove(c, "fred/model.db2", "mary/model.db2", "-y") 59 c.Assert(err, jc.ErrorIsNil) 60 } 61 62 func (s *removeSuite) TestRemoveForce(c *gc.C) { 63 s.mockAPI.expectedURLs = []string{"fred/model.db2", "mary/model.db2"} 64 s.mockAPI.expectedForce = true 65 _, err := s.runRemove(c, "fred/model.db2", "mary/model.db2", "-y", "--force") 66 c.Assert(err, jc.ErrorIsNil) 67 } 68 69 func (s *removeSuite) TestRemoveForceMessage(c *gc.C) { 70 var stdin, stdout, stderr bytes.Buffer 71 ctx, err := cmd.DefaultContext() 72 c.Assert(err, jc.ErrorIsNil) 73 ctx.Stdout = &stdout 74 ctx.Stderr = &stderr 75 ctx.Stdin = &stdin 76 stdin.WriteString("y") 77 78 com := crossmodel.NewRemoveCommandForTest(s.store, s.mockAPI) 79 err = cmdtesting.InitCommand(com, []string{"fred/model.db2", "--force"}) 80 c.Assert(err, jc.ErrorIsNil) 81 com.Run(ctx) 82 c.Assert(cmdtesting.Stderr(ctx), gc.Equals, "") 83 84 expected := ` 85 WARNING! This command will remove offers: fred/model.db2 86 This includes all relations to those offers. 87 88 Continue [y/N]? `[1:] 89 90 c.Assert(cmdtesting.Stdout(ctx), gc.Equals, expected) 91 } 92 93 func (s *removeSuite) TestRemoveNameOnly(c *gc.C) { 94 s.mockAPI.expectedURLs = []string{"fred/test.db2"} 95 _, err := s.runRemove(c, "db2") 96 c.Assert(err, jc.ErrorIsNil) 97 } 98 99 func (s *removeSuite) TestOldAPI(c *gc.C) { 100 s.mockAPI.version = 1 101 _, err := s.runRemove(c, "fred/model.db2", "mary/model.db2", "-y", "--force") 102 c.Assert(err, gc.ErrorMatches, "on this juju controller, remove-offer --force not supported") 103 } 104 105 func (s *removeSuite) TestOldAPINoForce(c *gc.C) { 106 s.mockAPI.expectedURLs = []string{"fred/model.db2", "mary/model.db2"} 107 s.mockAPI.version = 1 108 _, err := s.runRemove(c, "fred/model.db2", "mary/model.db2") 109 c.Assert(err, jc.ErrorIsNil) 110 } 111 112 type mockRemoveAPI struct { 113 version int 114 msg string 115 expectedForce bool 116 expectedURLs []string 117 } 118 119 func (s mockRemoveAPI) Close() error { 120 return nil 121 } 122 123 func (s mockRemoveAPI) BestAPIVersion() int { 124 return s.version 125 } 126 127 func (s mockRemoveAPI) DestroyOffers(force bool, offerURLs ...string) error { 128 if s.msg != "" { 129 return errors.New(s.msg) 130 } 131 if s.expectedForce != force { 132 return errors.New("mismatched force arg") 133 } 134 if strings.Join(s.expectedURLs, ",") != strings.Join(offerURLs, ",") { 135 return errors.Errorf("mismatched URLs: %v != %v", s.expectedURLs, offerURLs) 136 } 137 return nil 138 }