github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/common/imagecommon/imagemetadata_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package imagecommon_test 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/testing" 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/apiserver/common/imagecommon" 13 "github.com/juju/juju/apiserver/params" 14 "github.com/juju/juju/environs/config" 15 "github.com/juju/juju/state/cloudimagemetadata" 16 coretesting "github.com/juju/juju/testing" 17 ) 18 19 type imageMetadataSuite struct { 20 st *mockState 21 } 22 23 var _ = gc.Suite(&imageMetadataSuite{}) 24 25 func (s *imageMetadataSuite) SetUpTest(c *gc.C) { 26 mCfg := testConfig(c) 27 s.st = &mockState{ 28 Stub: &testing.Stub{}, 29 modelCfg: mCfg, 30 } 31 } 32 33 func (s *imageMetadataSuite) TestSaveEmpty(c *gc.C) { 34 errs, err := imagecommon.Save(s.st, params.MetadataSaveParams{}) 35 c.Assert(err, jc.ErrorIsNil) 36 c.Assert(errs, gc.HasLen, 0) 37 s.st.CheckCallNames(c, []string{}...) // Nothing was called 38 } 39 40 func (s *imageMetadataSuite) TestSaveModelCfgFailed(c *gc.C) { 41 m := params.CloudImageMetadata{ 42 Source: "custom", 43 } 44 ms := params.MetadataSaveParams{ 45 Metadata: []params.CloudImageMetadataList{{ 46 Metadata: []params.CloudImageMetadata{m}, 47 }}, 48 } 49 50 msg := "save error" 51 s.st.SetErrors( 52 errors.New(msg), // ModelConfig 53 ) 54 55 errs, err := imagecommon.Save(s.st, ms) 56 c.Assert(errors.Cause(err), gc.ErrorMatches, msg) 57 c.Assert(errs, gc.IsNil) 58 s.st.CheckCallNames(c, "ModelConfig") 59 } 60 61 func (s *imageMetadataSuite) TestSave(c *gc.C) { 62 m := params.CloudImageMetadata{ 63 Source: "custom", 64 } 65 ms := params.MetadataSaveParams{ 66 Metadata: []params.CloudImageMetadataList{{ 67 Metadata: []params.CloudImageMetadata{m}, 68 }, { 69 Metadata: []params.CloudImageMetadata{m, m}, 70 }}, 71 } 72 73 msg := "save error" 74 s.st.SetErrors( 75 nil, // ModelConfig 76 nil, // Save (1st call) 77 errors.New(msg), // Save (2nd call) 78 ) 79 80 errs, err := imagecommon.Save(s.st, ms) 81 c.Assert(err, jc.ErrorIsNil) 82 c.Assert(errs, gc.HasLen, 2) 83 c.Assert(errs[0].Error, gc.IsNil) 84 c.Assert(errs[1].Error, gc.ErrorMatches, msg) 85 86 // TODO (anastasiamac 2016-08-24) This is a check for a band-aid solution. 87 // Once correct value is read from simplestreams, this "adjustment" needs to go. 88 // Bug# 1616295 89 m.Stream = "released" 90 91 expectedMetadata1 := imagecommon.ParseMetadataListFromParams(params.CloudImageMetadataList{ 92 Metadata: []params.CloudImageMetadata{m}, 93 }, nil) 94 expectedMetadata2 := imagecommon.ParseMetadataListFromParams(params.CloudImageMetadataList{ 95 Metadata: []params.CloudImageMetadata{m, m}, 96 }, nil) 97 98 s.st.CheckCalls(c, []testing.StubCall{ 99 {"ModelConfig", nil}, 100 {"SaveMetadata", []interface{}{expectedMetadata1}}, 101 {"SaveMetadata", []interface{}{expectedMetadata2}}, 102 }) 103 } 104 105 type mockState struct { 106 *testing.Stub 107 modelCfg *config.Config 108 } 109 110 func (s *mockState) SaveMetadata(m []cloudimagemetadata.Metadata) error { 111 s.MethodCall(s, "SaveMetadata", m) 112 return s.NextErr() 113 } 114 115 func (s *mockState) ModelConfig() (*config.Config, error) { 116 s.MethodCall(s, "ModelConfig") 117 return s.modelCfg, s.NextErr() 118 } 119 120 func testConfig(c *gc.C) *config.Config { 121 cfg, err := config.New(config.UseDefaults, coretesting.FakeConfig().Merge(coretesting.Attrs{ 122 "type": "mock", 123 })) 124 c.Assert(err, jc.ErrorIsNil) 125 return cfg 126 }