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 }