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  }