github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/plugins/juju-metadata/deleteimage_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package main
     5  
     6  import (
     7  	"github.com/juju/cmd/cmdtesting"
     8  	"github.com/juju/errors"
     9  	gitjujutesting "github.com/juju/testing"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/cmd/modelcmd"
    14  	"github.com/juju/juju/jujuclient/jujuclienttesting"
    15  )
    16  
    17  const deleteTestId = "tst12345"
    18  
    19  type deleteImageSuite struct {
    20  	BaseCloudImageMetadataSuite
    21  
    22  	mockAPI *mockDeleteAPI
    23  
    24  	deletedIds []string
    25  }
    26  
    27  var _ = gc.Suite(&deleteImageSuite{})
    28  
    29  func (s *deleteImageSuite) SetUpTest(c *gc.C) {
    30  	s.BaseCloudImageMetadataSuite.SetUpTest(c)
    31  
    32  	s.deletedIds = []string{}
    33  	s.mockAPI = &mockDeleteAPI{
    34  		delete: func(imageId string) error {
    35  			s.deletedIds = append(s.deletedIds, imageId)
    36  			return nil
    37  		},
    38  		Stub: &gitjujutesting.Stub{},
    39  	}
    40  }
    41  
    42  func (s *deleteImageSuite) TestDeleteImageMetadata(c *gc.C) {
    43  	s.assertDeleteImageMetadata(c, deleteTestId)
    44  }
    45  
    46  func (s *deleteImageSuite) TestDeleteImageMetadataNoImageId(c *gc.C) {
    47  	s.assertDeleteImageMetadataErr(c, "image ID must be supplied when deleting image metadata")
    48  }
    49  
    50  func (s *deleteImageSuite) TestDeleteImageMetadataManyImageIds(c *gc.C) {
    51  	s.assertDeleteImageMetadataErr(c, "only one image ID can be supplied as an argument to this command", deleteTestId, deleteTestId)
    52  }
    53  
    54  func (s *deleteImageSuite) TestDeleteImageMetadataFailed(c *gc.C) {
    55  	msg := "failed"
    56  	s.mockAPI.delete = func(imageId string) error {
    57  		return errors.New(msg)
    58  	}
    59  	s.assertDeleteImageMetadataErr(c, msg, deleteTestId)
    60  	s.mockAPI.CheckCallNames(c, "Delete", "Close")
    61  }
    62  
    63  func (s *deleteImageSuite) runDeleteImageMetadata(c *gc.C, args ...string) error {
    64  	tstDelete := &deleteImageMetadataCommand{}
    65  	tstDelete.SetClientStore(jujuclienttesting.MinimalStore())
    66  	tstDelete.newAPIFunc = func() (MetadataDeleteAPI, error) {
    67  		return s.mockAPI, nil
    68  	}
    69  	deleteCmd := modelcmd.Wrap(tstDelete)
    70  
    71  	_, err := cmdtesting.RunCommand(c, deleteCmd, args...)
    72  	return err
    73  }
    74  
    75  func (s *deleteImageSuite) assertDeleteImageMetadata(c *gc.C, id string) {
    76  	err := s.runDeleteImageMetadata(c, id)
    77  	c.Assert(err, jc.ErrorIsNil)
    78  	c.Assert(s.deletedIds, gc.DeepEquals, []string{id})
    79  	s.mockAPI.CheckCallNames(c, "Delete", "Close")
    80  }
    81  
    82  func (s *deleteImageSuite) assertDeleteImageMetadataErr(c *gc.C, errorMsg string, args ...string) {
    83  	err := s.runDeleteImageMetadata(c, args...)
    84  	c.Assert(err, gc.ErrorMatches, errorMsg)
    85  	c.Assert(s.deletedIds, gc.DeepEquals, []string{})
    86  }
    87  
    88  type mockDeleteAPI struct {
    89  	*gitjujutesting.Stub
    90  
    91  	delete func(imageId string) error
    92  }
    93  
    94  func (s mockDeleteAPI) Close() error {
    95  	s.MethodCall(s, "Close")
    96  	return nil
    97  }
    98  
    99  func (s mockDeleteAPI) Delete(imageId string) error {
   100  	s.MethodCall(s, "Delete", imageId)
   101  	return s.delete(imageId)
   102  }