github.com/opentofu/opentofu@v1.7.1/internal/tofu/resource_provider_mock_test.go (about)

     1  // Copyright (c) The OpenTofu Authors
     2  // SPDX-License-Identifier: MPL-2.0
     3  // Copyright (c) 2023 HashiCorp, Inc.
     4  // SPDX-License-Identifier: MPL-2.0
     5  
     6  package tofu
     7  
     8  import (
     9  	"github.com/opentofu/opentofu/internal/configs/configschema"
    10  	"github.com/opentofu/opentofu/internal/providers"
    11  	"github.com/zclconf/go-cty/cty"
    12  )
    13  
    14  // mockProviderWithConfigSchema is a test helper to concisely create a mock
    15  // provider with the given schema for its own configuration.
    16  func mockProviderWithConfigSchema(schema *configschema.Block) *MockProvider {
    17  	return &MockProvider{
    18  		GetProviderSchemaResponse: &providers.GetProviderSchemaResponse{
    19  			Provider: providers.Schema{Block: schema},
    20  		},
    21  	}
    22  }
    23  
    24  // mockProviderWithResourceTypeSchema is a test helper to concisely create a mock
    25  // provider with a schema containing a single resource type.
    26  func mockProviderWithResourceTypeSchema(name string, schema *configschema.Block) *MockProvider {
    27  	return &MockProvider{
    28  		GetProviderSchemaResponse: &providers.GetProviderSchemaResponse{
    29  			Provider: providers.Schema{
    30  				Block: &configschema.Block{
    31  					Attributes: map[string]*configschema.Attribute{
    32  						"string": {
    33  							Type:     cty.String,
    34  							Optional: true,
    35  						},
    36  						"list": {
    37  							Type:     cty.List(cty.String),
    38  							Optional: true,
    39  						},
    40  						"root": {
    41  							Type:     cty.Map(cty.String),
    42  							Optional: true,
    43  						},
    44  					},
    45  				},
    46  			},
    47  			ResourceTypes: map[string]providers.Schema{
    48  				name: providers.Schema{Block: schema},
    49  			},
    50  		},
    51  	}
    52  }
    53  
    54  // simpleMockProvider returns a MockProvider that is pre-configured
    55  // with schema for its own config, for a resource type called "test_object" and
    56  // for a data source also called "test_object".
    57  //
    58  // All three schemas have the same content as returned by function
    59  // simpleTestSchema.
    60  //
    61  // For most reasonable uses the returned provider must be registered in a
    62  // componentFactory under the name "test". Use simpleMockComponentFactory
    63  // to obtain a pre-configured componentFactory containing the result of
    64  // this function along with simpleMockProvisioner, both registered as "test".
    65  //
    66  // The returned provider has no other behaviors by default, but the caller may
    67  // modify it in order to stub any other required functionality, or modify
    68  // the default schema stored in the field GetSchemaReturn. Each new call to
    69  // simpleTestProvider produces entirely new instances of all of the nested
    70  // objects so that callers can mutate without affecting mock objects.
    71  func simpleMockProvider() *MockProvider {
    72  	return &MockProvider{
    73  		GetProviderSchemaResponse: &providers.GetProviderSchemaResponse{
    74  			Provider: providers.Schema{Block: simpleTestSchema()},
    75  			ResourceTypes: map[string]providers.Schema{
    76  				"test_object": providers.Schema{Block: simpleTestSchema()},
    77  			},
    78  			DataSources: map[string]providers.Schema{
    79  				"test_object": providers.Schema{Block: simpleTestSchema()},
    80  			},
    81  		},
    82  	}
    83  }
    84  
    85  // ProviderSchema is a helper to convert from the internal GetProviderSchemaResponse to
    86  // a ProviderSchema.
    87  func (p *MockProvider) ProviderSchema() *ProviderSchema {
    88  	resp := p.getProviderSchema()
    89  
    90  	schema := &ProviderSchema{
    91  		Provider:                   resp.Provider.Block,
    92  		ProviderMeta:               resp.ProviderMeta.Block,
    93  		ResourceTypes:              map[string]*configschema.Block{},
    94  		DataSources:                map[string]*configschema.Block{},
    95  		ResourceTypeSchemaVersions: map[string]uint64{},
    96  	}
    97  
    98  	for resType, s := range resp.ResourceTypes {
    99  		schema.ResourceTypes[resType] = s.Block
   100  		schema.ResourceTypeSchemaVersions[resType] = uint64(s.Version)
   101  	}
   102  
   103  	for dataSource, s := range resp.DataSources {
   104  		schema.DataSources[dataSource] = s.Block
   105  	}
   106  
   107  	return schema
   108  }
   109  
   110  // the type was refactored out with all the functionality handled within the
   111  // provider package, but we keep this here for a shim in existing tests.
   112  type ProviderSchema struct {
   113  	Provider                   *configschema.Block
   114  	ProviderMeta               *configschema.Block
   115  	ResourceTypes              map[string]*configschema.Block
   116  	ResourceTypeSchemaVersions map[string]uint64
   117  	DataSources                map[string]*configschema.Block
   118  }
   119  
   120  // getProviderSchemaResponseFromProviderSchema is a test helper to convert a
   121  // ProviderSchema to a GetProviderSchemaResponse for use when building a mock provider.
   122  func getProviderSchemaResponseFromProviderSchema(providerSchema *ProviderSchema) *providers.GetProviderSchemaResponse {
   123  	resp := &providers.GetProviderSchemaResponse{
   124  		Provider:      providers.Schema{Block: providerSchema.Provider},
   125  		ProviderMeta:  providers.Schema{Block: providerSchema.ProviderMeta},
   126  		ResourceTypes: map[string]providers.Schema{},
   127  		DataSources:   map[string]providers.Schema{},
   128  	}
   129  
   130  	for name, schema := range providerSchema.ResourceTypes {
   131  		resp.ResourceTypes[name] = providers.Schema{
   132  			Block:   schema,
   133  			Version: int64(providerSchema.ResourceTypeSchemaVersions[name]),
   134  		}
   135  	}
   136  
   137  	for name, schema := range providerSchema.DataSources {
   138  		resp.DataSources[name] = providers.Schema{Block: schema}
   139  	}
   140  
   141  	return resp
   142  }