github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/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, []string{findMetadata})
    26  }
    27  
    28  func (s *metadataSuite) TestFindEmpty(c *gc.C) {
    29  	s.state.findMetadata = func(f cloudimagemetadata.MetadataFilter) (map[cloudimagemetadata.SourceType][]cloudimagemetadata.Metadata, error) {
    30  		s.calls = append(s.calls, findMetadata)
    31  		return map[cloudimagemetadata.SourceType][]cloudimagemetadata.Metadata{}, nil
    32  	}
    33  
    34  	found, err := s.api.List(params.ImageMetadataFilter{})
    35  	c.Assert(err, jc.ErrorIsNil)
    36  	c.Assert(found.Result, gc.HasLen, 0)
    37  	s.assertCalls(c, []string{findMetadata})
    38  }
    39  
    40  func (s *metadataSuite) TestFindEmptyGroups(c *gc.C) {
    41  	s.state.findMetadata = func(f cloudimagemetadata.MetadataFilter) (map[cloudimagemetadata.SourceType][]cloudimagemetadata.Metadata, error) {
    42  		s.calls = append(s.calls, findMetadata)
    43  		return map[cloudimagemetadata.SourceType][]cloudimagemetadata.Metadata{
    44  			cloudimagemetadata.Public: []cloudimagemetadata.Metadata{},
    45  			cloudimagemetadata.Custom: []cloudimagemetadata.Metadata{},
    46  		}, nil
    47  	}
    48  
    49  	found, err := s.api.List(params.ImageMetadataFilter{})
    50  	c.Assert(err, jc.ErrorIsNil)
    51  	c.Assert(found.Result, gc.HasLen, 0)
    52  	s.assertCalls(c, []string{findMetadata})
    53  }
    54  
    55  func (s *metadataSuite) TestFindError(c *gc.C) {
    56  	msg := "find error"
    57  	s.state.findMetadata = func(f cloudimagemetadata.MetadataFilter) (map[cloudimagemetadata.SourceType][]cloudimagemetadata.Metadata, error) {
    58  		s.calls = append(s.calls, findMetadata)
    59  		return nil, errors.New(msg)
    60  	}
    61  
    62  	found, err := s.api.List(params.ImageMetadataFilter{})
    63  	c.Assert(err, gc.ErrorMatches, msg)
    64  	c.Assert(found.Result, gc.HasLen, 0)
    65  	s.assertCalls(c, []string{findMetadata})
    66  }
    67  
    68  func (s *metadataSuite) TestFindOrder(c *gc.C) {
    69  	customImageId := "custom1"
    70  	customImageId2 := "custom2"
    71  	customImageId3 := "custom3"
    72  	publicImageId := "public1"
    73  
    74  	s.state.findMetadata = func(f cloudimagemetadata.MetadataFilter) (map[cloudimagemetadata.SourceType][]cloudimagemetadata.Metadata, error) {
    75  		s.calls = append(s.calls, findMetadata)
    76  		return map[cloudimagemetadata.SourceType][]cloudimagemetadata.Metadata{
    77  				cloudimagemetadata.Public: []cloudimagemetadata.Metadata{
    78  					cloudimagemetadata.Metadata{ImageId: publicImageId},
    79  				},
    80  				cloudimagemetadata.Custom: []cloudimagemetadata.Metadata{
    81  					cloudimagemetadata.Metadata{ImageId: customImageId},
    82  					cloudimagemetadata.Metadata{ImageId: customImageId2},
    83  					cloudimagemetadata.Metadata{ImageId: customImageId3},
    84  				},
    85  			},
    86  			nil
    87  	}
    88  
    89  	found, err := s.api.List(params.ImageMetadataFilter{})
    90  	c.Assert(err, jc.ErrorIsNil)
    91  	c.Assert(found.Result, gc.HasLen, 4)
    92  	c.Assert(found.Result, jc.SameContents, []params.CloudImageMetadata{
    93  		params.CloudImageMetadata{ImageId: customImageId},
    94  		params.CloudImageMetadata{ImageId: customImageId2},
    95  		params.CloudImageMetadata{ImageId: customImageId3},
    96  		params.CloudImageMetadata{ImageId: publicImageId},
    97  	})
    98  	s.assertCalls(c, []string{findMetadata})
    99  }
   100  
   101  func (s *metadataSuite) TestSaveEmpty(c *gc.C) {
   102  	errs, err := s.api.Save(params.MetadataSaveParams{})
   103  	c.Assert(err, jc.ErrorIsNil)
   104  	c.Assert(errs.Results, gc.HasLen, 0)
   105  	// not expected to call state :D
   106  	s.assertCalls(c, []string{})
   107  }
   108  
   109  func (s *metadataSuite) TestSave(c *gc.C) {
   110  	m := params.CloudImageMetadata{
   111  		Source: "custom",
   112  	}
   113  	msg := "save error"
   114  
   115  	s.state.saveMetadata = func(m cloudimagemetadata.Metadata) error {
   116  		s.calls = append(s.calls, saveMetadata)
   117  		if len(s.calls) == 1 {
   118  			// don't err on first call
   119  			return nil
   120  		}
   121  		return errors.New(msg)
   122  	}
   123  
   124  	errs, err := s.api.Save(params.MetadataSaveParams{Metadata: []params.CloudImageMetadata{m, m}})
   125  	c.Assert(err, jc.ErrorIsNil)
   126  	c.Assert(errs.Results, gc.HasLen, 2)
   127  	c.Assert(errs.Results[0].Error, gc.IsNil)
   128  	c.Assert(errs.Results[1].Error, gc.ErrorMatches, msg)
   129  	s.assertCalls(c, []string{saveMetadata, saveMetadata})
   130  }