github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/apiserver/imagemetadata/metadata_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package imagemetadata_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  
    11  	"github.com/juju/juju/apiserver/params"
    12  	"github.com/juju/juju/state/cloudimagemetadata"
    13  )
    14  
    15  type metadataSuite struct {
    16  	baseImageMetadataSuite
    17  }
    18  
    19  var _ = gc.Suite(&metadataSuite{})
    20  
    21  func (s *metadataSuite) TestFindNil(c *gc.C) {
    22  	found, err := s.api.List(params.ImageMetadataFilter{})
    23  	c.Assert(err, jc.ErrorIsNil)
    24  	c.Assert(found.Result, gc.HasLen, 0)
    25  	s.assertCalls(c, findMetadata)
    26  }
    27  
    28  func (s *metadataSuite) TestFindEmpty(c *gc.C) {
    29  	s.state.findMetadata = func(f cloudimagemetadata.MetadataFilter) (map[string][]cloudimagemetadata.Metadata, error) {
    30  		return map[string][]cloudimagemetadata.Metadata{}, nil
    31  	}
    32  
    33  	found, err := s.api.List(params.ImageMetadataFilter{})
    34  	c.Assert(err, jc.ErrorIsNil)
    35  	c.Assert(found.Result, gc.HasLen, 0)
    36  	s.assertCalls(c, findMetadata)
    37  }
    38  
    39  func (s *metadataSuite) TestFindEmptyGroups(c *gc.C) {
    40  	s.state.findMetadata = func(f cloudimagemetadata.MetadataFilter) (map[string][]cloudimagemetadata.Metadata, error) {
    41  		return map[string][]cloudimagemetadata.Metadata{
    42  			"public": []cloudimagemetadata.Metadata{},
    43  			"custom": []cloudimagemetadata.Metadata{},
    44  		}, nil
    45  	}
    46  
    47  	found, err := s.api.List(params.ImageMetadataFilter{})
    48  	c.Assert(err, jc.ErrorIsNil)
    49  	c.Assert(found.Result, gc.HasLen, 0)
    50  	s.assertCalls(c, findMetadata)
    51  }
    52  
    53  func (s *metadataSuite) TestFindError(c *gc.C) {
    54  	msg := "find error"
    55  	s.state.findMetadata = func(f cloudimagemetadata.MetadataFilter) (map[string][]cloudimagemetadata.Metadata, error) {
    56  		return nil, errors.New(msg)
    57  	}
    58  
    59  	found, err := s.api.List(params.ImageMetadataFilter{})
    60  	c.Assert(err, gc.ErrorMatches, msg)
    61  	c.Assert(found.Result, gc.HasLen, 0)
    62  	s.assertCalls(c, findMetadata)
    63  }
    64  
    65  func (s *metadataSuite) TestFindOrder(c *gc.C) {
    66  	customImageId := "custom1"
    67  	customImageId2 := "custom2"
    68  	customImageId3 := "custom3"
    69  	publicImageId := "public1"
    70  
    71  	s.state.findMetadata = func(f cloudimagemetadata.MetadataFilter) (map[string][]cloudimagemetadata.Metadata, error) {
    72  		return map[string][]cloudimagemetadata.Metadata{
    73  				"public": []cloudimagemetadata.Metadata{
    74  					cloudimagemetadata.Metadata{ImageId: publicImageId, Priority: 15},
    75  				},
    76  				"custom": []cloudimagemetadata.Metadata{
    77  					cloudimagemetadata.Metadata{ImageId: customImageId, Priority: 87},
    78  					cloudimagemetadata.Metadata{ImageId: customImageId2, Priority: 20},
    79  					cloudimagemetadata.Metadata{ImageId: customImageId3, Priority: 56},
    80  				},
    81  			},
    82  			nil
    83  	}
    84  
    85  	found, err := s.api.List(params.ImageMetadataFilter{})
    86  	c.Assert(err, jc.ErrorIsNil)
    87  	c.Assert(found.Result, gc.HasLen, 4)
    88  
    89  	c.Assert(found.Result, jc.SameContents, []params.CloudImageMetadata{
    90  		params.CloudImageMetadata{ImageId: customImageId, Priority: 87},
    91  		params.CloudImageMetadata{ImageId: customImageId3, Priority: 56},
    92  		params.CloudImageMetadata{ImageId: customImageId2, Priority: 20},
    93  		params.CloudImageMetadata{ImageId: publicImageId, Priority: 15},
    94  	})
    95  	s.assertCalls(c, findMetadata)
    96  }
    97  
    98  func (s *metadataSuite) TestSaveEmpty(c *gc.C) {
    99  	errs, err := s.api.Save(params.MetadataSaveParams{})
   100  	c.Assert(err, jc.ErrorIsNil)
   101  	c.Assert(errs.Results, gc.HasLen, 0)
   102  	// not expected to call state :D
   103  	s.assertCalls(c, environConfig)
   104  }
   105  
   106  func (s *metadataSuite) TestSave(c *gc.C) {
   107  	m := params.CloudImageMetadata{
   108  		Source: "custom",
   109  	}
   110  	msg := "save error"
   111  
   112  	saveCalls := 0
   113  	s.state.saveMetadata = func(m []cloudimagemetadata.Metadata) error {
   114  		saveCalls += 1
   115  		c.Assert(m, gc.HasLen, saveCalls)
   116  		if saveCalls == 1 {
   117  			// don't err on first call
   118  			return nil
   119  		}
   120  		return errors.New(msg)
   121  	}
   122  
   123  	errs, err := s.api.Save(params.MetadataSaveParams{
   124  		Metadata: []params.CloudImageMetadataList{{
   125  			Metadata: []params.CloudImageMetadata{m},
   126  		}, {
   127  			Metadata: []params.CloudImageMetadata{m, m},
   128  		}},
   129  	})
   130  	c.Assert(err, jc.ErrorIsNil)
   131  	c.Assert(errs.Results, gc.HasLen, 2)
   132  	c.Assert(errs.Results[0].Error, gc.IsNil)
   133  	c.Assert(errs.Results[1].Error, gc.ErrorMatches, msg)
   134  	s.assertCalls(c, environConfig, saveMetadata, saveMetadata)
   135  }
   136  
   137  func (s *metadataSuite) TestDeleteEmpty(c *gc.C) {
   138  	errs, err := s.api.Delete(params.MetadataImageIds{})
   139  	c.Assert(err, jc.ErrorIsNil)
   140  	c.Assert(errs.Results, gc.HasLen, 0)
   141  	// not expected to call state :D
   142  	s.assertCalls(c)
   143  }
   144  
   145  func (s *metadataSuite) TestDelete(c *gc.C) {
   146  	idOk := "ok"
   147  	idFail := "fail"
   148  	msg := "delete error"
   149  
   150  	s.state.deleteMetadata = func(imageId string) error {
   151  		if imageId == idFail {
   152  			return errors.New(msg)
   153  		}
   154  		return nil
   155  	}
   156  
   157  	errs, err := s.api.Delete(params.MetadataImageIds{[]string{idOk, idFail}})
   158  	c.Assert(err, jc.ErrorIsNil)
   159  	c.Assert(errs.Results, gc.HasLen, 2)
   160  	c.Assert(errs.Results[0].Error, gc.IsNil)
   161  	c.Assert(errs.Results[1].Error, gc.ErrorMatches, msg)
   162  	s.assertCalls(c, deleteMetadata, deleteMetadata)
   163  }