github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/api/imagemetadatamanager/client_test.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package imagemetadatamanager_test
     5  
     6  import (
     7  	"regexp"
     8  
     9  	"github.com/juju/errors"
    10  	"github.com/juju/os/series"
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/api/base/testing"
    15  	"github.com/juju/juju/api/imagemetadatamanager"
    16  	"github.com/juju/juju/apiserver/params"
    17  	coretesting "github.com/juju/juju/testing"
    18  )
    19  
    20  type imagemetadataSuite struct {
    21  	coretesting.BaseSuite
    22  }
    23  
    24  var _ = gc.Suite(&imagemetadataSuite{})
    25  
    26  func (s *imagemetadataSuite) TestList(c *gc.C) {
    27  	// setup data for test
    28  	imageId := "imageid"
    29  	stream := "stream"
    30  	region := "region"
    31  
    32  	// This is used by filters to search function
    33  	testSeries := "trusty"
    34  	version, err := series.SeriesVersion(testSeries)
    35  	c.Assert(err, jc.ErrorIsNil)
    36  
    37  	arch := "arch"
    38  	virtType := "virt-type"
    39  	rootStorageType := "root-storage-type"
    40  	rootStorageSize := uint64(1024)
    41  	source := "source"
    42  
    43  	called := false
    44  	apiCaller := testing.APICallerFunc(
    45  		func(objType string,
    46  			version int,
    47  			id, request string,
    48  			a, result interface{},
    49  		) error {
    50  			called = true
    51  			c.Check(objType, gc.Equals, "ImageMetadataManager")
    52  			c.Check(id, gc.Equals, "")
    53  			c.Check(request, gc.Equals, "List")
    54  
    55  			args, ok := a.(params.ImageMetadataFilter)
    56  			c.Assert(ok, jc.IsTrue)
    57  
    58  			if results, k := result.(*params.ListCloudImageMetadataResult); k {
    59  				instances := []params.CloudImageMetadata{
    60  					{
    61  						ImageId:         imageId,
    62  						Stream:          args.Stream,
    63  						Region:          args.Region,
    64  						Version:         versionFromSeries(args.Series[0]),
    65  						Series:          args.Series[0],
    66  						Arch:            args.Arches[0],
    67  						VirtType:        args.VirtType,
    68  						RootStorageType: args.RootStorageType,
    69  						RootStorageSize: &rootStorageSize,
    70  						Source:          source,
    71  					},
    72  				}
    73  				results.Result = instances
    74  			}
    75  
    76  			return nil
    77  		})
    78  	client := imagemetadatamanager.NewClient(apiCaller)
    79  	found, err := client.List(
    80  		stream, region,
    81  		[]string{testSeries}, []string{arch},
    82  		virtType, rootStorageType,
    83  	)
    84  	c.Check(err, jc.ErrorIsNil)
    85  
    86  	c.Assert(called, jc.IsTrue)
    87  	expected := []params.CloudImageMetadata{
    88  		{
    89  			ImageId:         imageId,
    90  			Stream:          stream,
    91  			Region:          region,
    92  			Version:         version,
    93  			Series:          testSeries,
    94  			Arch:            arch,
    95  			VirtType:        virtType,
    96  			RootStorageType: rootStorageType,
    97  			RootStorageSize: &rootStorageSize,
    98  			Source:          source,
    99  		},
   100  	}
   101  	c.Assert(found, jc.DeepEquals, expected)
   102  }
   103  
   104  func (s *imagemetadataSuite) TestListFacadeCallError(c *gc.C) {
   105  	msg := "facade failure"
   106  	called := false
   107  	apiCaller := testing.APICallerFunc(
   108  		func(objType string,
   109  			version int,
   110  			id, request string,
   111  			a, result interface{},
   112  		) error {
   113  			called = true
   114  			c.Check(objType, gc.Equals, "ImageMetadataManager")
   115  			c.Check(id, gc.Equals, "")
   116  			c.Check(request, gc.Equals, "List")
   117  
   118  			return errors.New(msg)
   119  		})
   120  	client := imagemetadatamanager.NewClient(apiCaller)
   121  	found, err := client.List("", "", nil, nil, "", "")
   122  	c.Assert(errors.Cause(err), gc.ErrorMatches, msg)
   123  	c.Assert(found, gc.HasLen, 0)
   124  	c.Assert(called, jc.IsTrue)
   125  }
   126  
   127  func (s *imagemetadataSuite) TestSave(c *gc.C) {
   128  	m := params.CloudImageMetadata{}
   129  	called := false
   130  
   131  	apiCaller := testing.APICallerFunc(
   132  		func(objType string,
   133  			version int,
   134  			id, request string,
   135  			a, result interface{},
   136  		) error {
   137  			called = true
   138  			c.Check(objType, gc.Equals, "ImageMetadataManager")
   139  			c.Check(id, gc.Equals, "")
   140  			c.Check(request, gc.Equals, "Save")
   141  
   142  			c.Assert(a, gc.FitsTypeOf, params.MetadataSaveParams{})
   143  			args := a.(params.MetadataSaveParams)
   144  			c.Assert(args.Metadata, gc.HasLen, 1)
   145  			c.Assert(args.Metadata, jc.DeepEquals, []params.CloudImageMetadataList{
   146  				{[]params.CloudImageMetadata{m, m}},
   147  			})
   148  
   149  			c.Assert(result, gc.FitsTypeOf, &params.ErrorResults{})
   150  			*(result.(*params.ErrorResults)) = params.ErrorResults{
   151  				Results: []params.ErrorResult{{}},
   152  			}
   153  
   154  			return nil
   155  		})
   156  
   157  	client := imagemetadatamanager.NewClient(apiCaller)
   158  	err := client.Save([]params.CloudImageMetadata{m, m})
   159  	c.Check(err, jc.ErrorIsNil)
   160  	c.Assert(called, jc.IsTrue)
   161  }
   162  
   163  func (s *imagemetadataSuite) TestSaveFacadeCallError(c *gc.C) {
   164  	m := []params.CloudImageMetadata{{}}
   165  	msg := "facade failure"
   166  	apiCaller := testing.APICallerFunc(
   167  		func(objType string,
   168  			version int,
   169  			id, request string,
   170  			a, result interface{},
   171  		) error {
   172  			c.Check(objType, gc.Equals, "ImageMetadataManager")
   173  			c.Check(id, gc.Equals, "")
   174  			c.Check(request, gc.Equals, "Save")
   175  			return errors.New(msg)
   176  		})
   177  	client := imagemetadatamanager.NewClient(apiCaller)
   178  	err := client.Save(m)
   179  	c.Assert(errors.Cause(err), gc.ErrorMatches, msg)
   180  }
   181  
   182  func (s *imagemetadataSuite) TestSaveFacadeCallErrorResult(c *gc.C) {
   183  	m := []params.CloudImageMetadata{{}}
   184  	msg := "facade failure"
   185  	apiCaller := testing.APICallerFunc(
   186  		func(objType string,
   187  			version int,
   188  			id, request string,
   189  			a, result interface{},
   190  		) error {
   191  			c.Check(objType, gc.Equals, "ImageMetadataManager")
   192  			c.Check(id, gc.Equals, "")
   193  			c.Check(request, gc.Equals, "Save")
   194  			*(result.(*params.ErrorResults)) = params.ErrorResults{
   195  				Results: []params.ErrorResult{
   196  					{Error: &params.Error{Message: msg}},
   197  				},
   198  			}
   199  			return nil
   200  		})
   201  	client := imagemetadatamanager.NewClient(apiCaller)
   202  	err := client.Save(m)
   203  	c.Assert(errors.Cause(err), gc.ErrorMatches, msg)
   204  }
   205  
   206  var versionFromSeries = func(s string) string {
   207  	// For testing purposes only, there will not be an error :D
   208  	v, _ := series.SeriesVersion(s)
   209  	return v
   210  }
   211  
   212  func (s *imagemetadataSuite) TestDelete(c *gc.C) {
   213  	imageId := "tst12345"
   214  	called := false
   215  
   216  	apiCaller := testing.APICallerFunc(
   217  		func(objType string,
   218  			version int,
   219  			id, request string,
   220  			a, result interface{},
   221  		) error {
   222  			called = true
   223  			c.Check(objType, gc.Equals, "ImageMetadataManager")
   224  			c.Check(id, gc.Equals, "")
   225  			c.Check(request, gc.Equals, "Delete")
   226  
   227  			c.Assert(a, gc.FitsTypeOf, params.MetadataImageIds{})
   228  			c.Assert(a.(params.MetadataImageIds).Ids, gc.DeepEquals, []string{imageId})
   229  
   230  			results := result.(*params.ErrorResults)
   231  			results.Results = []params.ErrorResult{{}}
   232  			return nil
   233  		})
   234  
   235  	client := imagemetadatamanager.NewClient(apiCaller)
   236  	err := client.Delete(imageId)
   237  	c.Check(err, jc.ErrorIsNil)
   238  	c.Assert(called, jc.IsTrue)
   239  }
   240  
   241  func (s *imagemetadataSuite) TestDeleteMultipleResult(c *gc.C) {
   242  	imageId := "tst12345"
   243  	called := false
   244  
   245  	apiCaller := testing.APICallerFunc(
   246  		func(objType string,
   247  			version int,
   248  			id, request string,
   249  			a, result interface{},
   250  		) error {
   251  			called = true
   252  			c.Check(objType, gc.Equals, "ImageMetadataManager")
   253  			c.Check(id, gc.Equals, "")
   254  			c.Check(request, gc.Equals, "Delete")
   255  
   256  			results := result.(*params.ErrorResults)
   257  			results.Results = []params.ErrorResult{{}, {}}
   258  			return nil
   259  		})
   260  
   261  	client := imagemetadatamanager.NewClient(apiCaller)
   262  	err := client.Delete(imageId)
   263  	c.Assert(err, gc.ErrorMatches, regexp.QuoteMeta(`expected to find one result for image id "tst12345" but found 2`))
   264  	c.Assert(called, jc.IsTrue)
   265  }
   266  
   267  func (s *imagemetadataSuite) TestDeleteFailure(c *gc.C) {
   268  	called := false
   269  	msg := "save failure"
   270  
   271  	apiCaller := testing.APICallerFunc(
   272  		func(objType string,
   273  			version int,
   274  			id, request string,
   275  			a, result interface{},
   276  		) error {
   277  			called = true
   278  			c.Check(objType, gc.Equals, "ImageMetadataManager")
   279  			c.Check(id, gc.Equals, "")
   280  			c.Check(request, gc.Equals, "Delete")
   281  
   282  			results := result.(*params.ErrorResults)
   283  			results.Results = []params.ErrorResult{
   284  				{&params.Error{Message: msg}},
   285  			}
   286  			return nil
   287  		})
   288  
   289  	client := imagemetadatamanager.NewClient(apiCaller)
   290  	err := client.Delete("tst12345")
   291  	c.Assert(err, gc.ErrorMatches, msg)
   292  	c.Assert(called, jc.IsTrue)
   293  }
   294  
   295  func (s *imagemetadataSuite) TestDeleteFacadeCallError(c *gc.C) {
   296  	called := false
   297  	msg := "facade failure"
   298  	apiCaller := testing.APICallerFunc(
   299  		func(objType string,
   300  			version int,
   301  			id, request string,
   302  			a, result interface{},
   303  		) error {
   304  			called = true
   305  			c.Check(objType, gc.Equals, "ImageMetadataManager")
   306  			c.Check(id, gc.Equals, "")
   307  			c.Check(request, gc.Equals, "Delete")
   308  			return errors.New(msg)
   309  		})
   310  	client := imagemetadatamanager.NewClient(apiCaller)
   311  	err := client.Delete("tst12345")
   312  	c.Assert(err, gc.ErrorMatches, msg)
   313  	c.Assert(called, jc.IsTrue)
   314  }