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  }