Acceptance Tests
You can implement testing with the acceptance test framework shipped with SDKv2.
Writing and running tests is similar to SDKv2 providers, with the following exceptions:
TestCase
: Specify the provider withProtoV6ProviderFactories
orProtoV5ProviderFactories
, depending on the intended provider server setup.Schema
: A root levelid
attribute is required for resources and data sources.
Specify Providers
Use one of the resource.TestCase
type ProtoV6ProviderFactories
field for protocol version 6 or ProtoV5ProviderFactories
field for protocol version 5. It is only necessary to test with the single protocol version matching the intended provider server.
Protocol Version 6
Use the providerserver.NewProtocol6WithError
helper function to implement the provider server in the ProtoV6ProviderFactories
field.
resource.Test(t, resource.TestCase{
ProtoV6ProviderFactories: map[string]func() (tfprotov6.ProviderServer, error) {
// newProvider is an example function that returns a provider.Provider
"examplecloud": providerserver.NewProtocol6WithError(newProvider()),
},
Steps: []resource.TestStep{/* ... */},
})
Protocol Version 5
Use the providerserver.NewProtocol5WithError
helper function to implement the provider server in the ProtoV5ProviderFactories
field.
resource.Test(t, resource.TestCase{
ProtoV5ProviderFactories: map[string]func() (tfprotov5.ProviderServer, error) {
// newProvider is an example function that returns a provider.Provider
"examplecloud": providerserver.NewProtocol5WithError(newProvider()),
},
Steps: []resource.TestStep{/* ... */},
})
Implement id Attribute
In SDKv2, resources and data sources automatically included an implicit, root level id
attribute. In the framework, the id
attribute is not implicitly added.
When testing resources and data sources without the id
attribute, the acceptance testing framework will return errors such as:
testing_new_config.go:111: no "id" found in attributes
testing_new.go:53: no "id" found in attributes
To avoid this, add a root level id
attribute to resource and data source schemas. Ensure the attribute value is appropriately written to state. Conventionally, id
is a computed attribute that contains the identifier for the resource.
For example, in the GetSchema
method implementation of a datasource.DataSource
or resource.Resource
:
func (r *ThingResource) GetSchema(ctx context.Context) (tfsdk.Schema, diag.Diagnostics) {
return tfsdk.Schema{
// ... potentially other schema configuration ...
Attributes: map[string]tfsdk.Attribute{
// ... potentially other schema attributes ...
"id": {
Type: types.StringType,
Computed: true,
},
},
}, nil
}