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 }