github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/facades/client/imagemetadatamanager/package_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package imagemetadatamanager_test
     5  
     6  import (
     7  	stdtesting "testing"
     8  
     9  	"github.com/juju/names/v5"
    10  	gitjujutesting "github.com/juju/testing"
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/apiserver/common"
    15  	"github.com/juju/juju/apiserver/facades/client/imagemetadatamanager"
    16  	"github.com/juju/juju/apiserver/testing"
    17  	"github.com/juju/juju/environs"
    18  	"github.com/juju/juju/environs/config"
    19  	imagetesting "github.com/juju/juju/environs/imagemetadata/testing"
    20  	"github.com/juju/juju/environs/simplestreams"
    21  	"github.com/juju/juju/provider/dummy"
    22  	"github.com/juju/juju/state/cloudimagemetadata"
    23  	coretesting "github.com/juju/juju/testing"
    24  )
    25  
    26  func TestAll(t *stdtesting.T) {
    27  	gc.TestingT(t)
    28  }
    29  
    30  type baseImageMetadataSuite struct {
    31  	coretesting.BaseSuite
    32  
    33  	resources  *common.Resources
    34  	authorizer testing.FakeAuthorizer
    35  
    36  	api   *imagemetadatamanager.API
    37  	state *mockState
    38  }
    39  
    40  func (s *baseImageMetadataSuite) SetUpSuite(c *gc.C) {
    41  	s.BaseSuite.SetUpSuite(c)
    42  	imagetesting.PatchOfficialDataSources(&s.CleanupSuite, "test:")
    43  }
    44  
    45  func (s *baseImageMetadataSuite) SetUpTest(c *gc.C) {
    46  	s.BaseSuite.SetUpTest(c)
    47  	s.resources = common.NewResources()
    48  	s.authorizer = testing.FakeAuthorizer{Tag: names.NewUserTag("testuser"), Controller: true, AdminTag: names.NewUserTag("testuser")}
    49  
    50  	s.state = s.constructState(testConfig(c))
    51  
    52  	var err error
    53  	s.api, err = imagemetadatamanager.CreateAPI(s.state, func() (environs.Environ, error) {
    54  		return &mockEnviron{}, nil
    55  	}, s.resources, s.authorizer)
    56  	c.Assert(err, jc.ErrorIsNil)
    57  }
    58  
    59  func (s *baseImageMetadataSuite) assertCalls(c *gc.C, expectedCalls ...string) {
    60  	s.state.Stub.CheckCallNames(c, expectedCalls...)
    61  }
    62  
    63  const (
    64  	findMetadata   = "findMetadata"
    65  	saveMetadata   = "saveMetadata"
    66  	deleteMetadata = "deleteMetadata"
    67  	modelConfig    = "modelConfig"
    68  	controllerTag  = "controllerTag"
    69  	model          = "model"
    70  )
    71  
    72  func (s *baseImageMetadataSuite) constructState(cfg *config.Config) *mockState {
    73  	return &mockState{
    74  		Stub: &gitjujutesting.Stub{},
    75  		findMetadata: func(f cloudimagemetadata.MetadataFilter) (map[string][]cloudimagemetadata.Metadata, error) {
    76  			return nil, nil
    77  		},
    78  		saveMetadata: func(m []cloudimagemetadata.Metadata) error {
    79  			return nil
    80  		},
    81  		deleteMetadata: func(imageId string) error {
    82  			return nil
    83  		},
    84  		modelConfig: func() (*config.Config, error) {
    85  			return cfg, nil
    86  		},
    87  		controllerTag: func() names.ControllerTag {
    88  			return names.NewControllerTag("deadbeef-2f18-4fd2-967d-db9663db7bea")
    89  		},
    90  	}
    91  }
    92  
    93  type mockState struct {
    94  	*gitjujutesting.Stub
    95  
    96  	findMetadata   func(f cloudimagemetadata.MetadataFilter) (map[string][]cloudimagemetadata.Metadata, error)
    97  	saveMetadata   func(m []cloudimagemetadata.Metadata) error
    98  	deleteMetadata func(imageId string) error
    99  	modelConfig    func() (*config.Config, error)
   100  	controllerTag  func() names.ControllerTag
   101  }
   102  
   103  func (st *mockState) FindMetadata(f cloudimagemetadata.MetadataFilter) (map[string][]cloudimagemetadata.Metadata, error) {
   104  	st.Stub.MethodCall(st, findMetadata, f)
   105  	return st.findMetadata(f)
   106  }
   107  
   108  func (st *mockState) SaveMetadata(m []cloudimagemetadata.Metadata) error {
   109  	st.Stub.MethodCall(st, saveMetadata, m)
   110  	return st.saveMetadata(m)
   111  }
   112  
   113  func (st *mockState) DeleteMetadata(imageId string) error {
   114  	st.Stub.MethodCall(st, deleteMetadata, imageId)
   115  	return st.deleteMetadata(imageId)
   116  }
   117  
   118  func (st *mockState) ModelConfig() (*config.Config, error) {
   119  	st.Stub.MethodCall(st, modelConfig)
   120  	return st.modelConfig()
   121  }
   122  
   123  func (st *mockState) ControllerTag() names.ControllerTag {
   124  	st.Stub.MethodCall(st, controllerTag)
   125  	return st.controllerTag()
   126  }
   127  
   128  func (st *mockState) Model() (imagemetadatamanager.Model, error) {
   129  	st.Stub.MethodCall(st, model)
   130  	return &mockModel{}, nil
   131  }
   132  
   133  type mockModel struct{}
   134  
   135  func (*mockModel) CloudRegion() string {
   136  	return "some-region"
   137  }
   138  
   139  func testConfig(c *gc.C) *config.Config {
   140  	cfg, err := config.New(config.UseDefaults, coretesting.FakeConfig().Merge(coretesting.Attrs{
   141  		"type": "mock",
   142  	}))
   143  	c.Assert(err, jc.ErrorIsNil)
   144  	return cfg
   145  }
   146  
   147  // mockEnviron is an environment without networking support.
   148  type mockEnviron struct {
   149  	environs.Environ
   150  }
   151  
   152  func (e mockEnviron) Config() *config.Config {
   153  	cfg, err := config.New(config.NoDefaults, mockConfig())
   154  	if err != nil {
   155  		panic("invalid configuration for testing")
   156  	}
   157  	return cfg
   158  }
   159  
   160  // Region is specified in the HasRegion interface.
   161  func (e *mockEnviron) Region() (simplestreams.CloudSpec, error) {
   162  	return simplestreams.CloudSpec{
   163  		Region:   "dummy_region",
   164  		Endpoint: "https://anywhere",
   165  	}, nil
   166  }
   167  
   168  // mockConfig returns a configuration for the usage of the
   169  // mock provider below.
   170  func mockConfig() coretesting.Attrs {
   171  	return dummy.SampleConfig().Merge(coretesting.Attrs{
   172  		"type": "mock",
   173  	})
   174  }