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

     1  // Copyright 2018 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package caas_test
     5  
     6  import (
     7  	"github.com/juju/cmd"
     8  	"github.com/juju/cmd/cmdtesting"
     9  	"github.com/juju/errors"
    10  	"github.com/juju/loggo"
    11  	jujutesting "github.com/juju/testing"
    12  	jc "github.com/juju/testing/checkers"
    13  	gc "gopkg.in/check.v1"
    14  
    15  	"github.com/juju/juju/cloud"
    16  	"github.com/juju/juju/cmd/juju/caas"
    17  )
    18  
    19  type removeCAASSuite struct {
    20  	jujutesting.IsolationSuite
    21  	fakeCloudAPI        *fakeRemoveCloudAPI
    22  	store               *fakeCloudMetadataStore
    23  	fileCredentialStore *fakeCredentialStore
    24  }
    25  
    26  var _ = gc.Suite(&removeCAASSuite{})
    27  
    28  type fakeRemoveCloudAPI struct {
    29  	caas.RemoveCloudAPI
    30  	jujutesting.Stub
    31  }
    32  
    33  func (api *fakeRemoveCloudAPI) RemoveCloud(cloud string) error {
    34  	api.AddCall("RemoveCloud", cloud)
    35  	return api.NextErr()
    36  }
    37  
    38  func (api *fakeRemoveCloudAPI) Close() error {
    39  	return nil
    40  }
    41  
    42  func (s *removeCAASSuite) SetUpTest(c *gc.C) {
    43  	s.IsolationSuite.SetUpTest(c)
    44  	s.fakeCloudAPI = &fakeRemoveCloudAPI{}
    45  	s.fileCredentialStore = &fakeCredentialStore{}
    46  
    47  	var logger loggo.Logger
    48  	s.store = &fakeCloudMetadataStore{CallMocker: jujutesting.NewCallMocker(logger)}
    49  
    50  	k8sCloud := cloud.Cloud{Name: "myk8s", Type: "kubernetes"}
    51  	initialCloudMap := map[string]cloud.Cloud{"myk8s": k8sCloud}
    52  
    53  	s.store.Call("PersonalCloudMetadata").Returns(initialCloudMap, nil)
    54  	s.store.Call("WritePersonalCloudMetadata", map[string]cloud.Cloud{}).Returns(nil)
    55  }
    56  
    57  func (s *removeCAASSuite) makeCommand() cmd.Command {
    58  	removecmd := caas.NewRemoveCAASCommandForTest(
    59  		s.store,
    60  		s.fileCredentialStore,
    61  		NewMockClientStore(),
    62  		func() (caas.RemoveCloudAPI, error) {
    63  			return s.fakeCloudAPI, nil
    64  		},
    65  	)
    66  	return removecmd
    67  }
    68  
    69  func (s *removeCAASSuite) runCommand(c *gc.C, cmd cmd.Command, args ...string) (*cmd.Context, error) {
    70  	return cmdtesting.RunCommand(c, cmd, args...)
    71  }
    72  
    73  func (s *removeCAASSuite) TestExtraArg(c *gc.C) {
    74  	cmd := s.makeCommand()
    75  	_, err := s.runCommand(c, cmd, "k8sname", "extra")
    76  	c.Assert(err, gc.ErrorMatches, `unrecognized args: \["extra"\]`)
    77  }
    78  
    79  func (s *removeCAASSuite) TestMissingName(c *gc.C) {
    80  	cmd := s.makeCommand()
    81  	_, err := s.runCommand(c, cmd)
    82  	c.Assert(err, gc.ErrorMatches, `missing k8s name.`)
    83  }
    84  
    85  func (s *removeCAASSuite) TestRemove(c *gc.C) {
    86  	cmd := s.makeCommand()
    87  	_, err := s.runCommand(c, cmd, "myk8s")
    88  	c.Assert(err, jc.ErrorIsNil)
    89  
    90  	s.fakeCloudAPI.CheckCallNames(c, "RemoveCloud")
    91  	s.fakeCloudAPI.CheckCall(c, 0, "RemoveCloud", "myk8s")
    92  
    93  	s.store.CheckCallNames(c, "PersonalCloudMetadata", "WritePersonalCloudMetadata")
    94  	s.store.CheckCall(c, 1, "WritePersonalCloudMetadata", map[string]cloud.Cloud{})
    95  
    96  	s.fileCredentialStore.CheckCallNames(c, "UpdateCredential")
    97  	s.fileCredentialStore.CheckCall(c, 0, "UpdateCredential", "myk8s", cloud.CloudCredential{})
    98  }
    99  
   100  func (s *removeCAASSuite) TestRemoveNotInController(c *gc.C) {
   101  	s.fakeCloudAPI.SetErrors(errors.NotFoundf("cloud"))
   102  	cmd := s.makeCommand()
   103  	_, err := s.runCommand(c, cmd, "myk8s")
   104  	c.Assert(err, gc.ErrorMatches, "cannot remove k8s cloud from controller.*")
   105  
   106  	s.store.CheckNoCalls(c)
   107  	s.fileCredentialStore.CheckNoCalls(c)
   108  }
   109  
   110  func (s *removeCAASSuite) TestRemoveNotInLocal(c *gc.C) {
   111  	cmd := s.makeCommand()
   112  	_, err := s.runCommand(c, cmd, "yourk8s")
   113  	c.Assert(err, jc.ErrorIsNil)
   114  
   115  	s.fakeCloudAPI.CheckCallNames(c, "RemoveCloud")
   116  	s.fakeCloudAPI.CheckCall(c, 0, "RemoveCloud", "yourk8s")
   117  
   118  	s.store.CheckCallNames(c, "PersonalCloudMetadata")
   119  	s.fileCredentialStore.CheckCall(c, 0, "UpdateCredential", "yourk8s", cloud.CloudCredential{})
   120  }