86 lines
2.4 KiB
Go
86 lines
2.4 KiB
Go
package resource
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/hashicorp/terraform-plugin-sdk/v2/internal/logging"
|
|
)
|
|
|
|
// hasProviders returns true if the TestCase has set any of the
|
|
// ExternalProviders, ProtoV5ProviderFactories, ProtoV6ProviderFactories,
|
|
// ProviderFactories, or Providers fields.
|
|
func (c TestCase) hasProviders(_ context.Context) bool {
|
|
if len(c.ExternalProviders) > 0 {
|
|
return true
|
|
}
|
|
|
|
if len(c.ProtoV5ProviderFactories) > 0 {
|
|
return true
|
|
}
|
|
|
|
if len(c.ProtoV6ProviderFactories) > 0 {
|
|
return true
|
|
}
|
|
|
|
if len(c.ProviderFactories) > 0 {
|
|
return true
|
|
}
|
|
|
|
if len(c.Providers) > 0 {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// validate ensures the TestCase is valid based on the following criteria:
|
|
//
|
|
// - No overlapping ExternalProviders and Providers entries
|
|
// - No overlapping ExternalProviders and ProviderFactories entries
|
|
// - TestStep validations performed by the (TestStep).validate() method.
|
|
//
|
|
func (c TestCase) validate(ctx context.Context) error {
|
|
logging.HelperResourceTrace(ctx, "Validating TestCase")
|
|
|
|
if len(c.Steps) == 0 {
|
|
err := fmt.Errorf("TestCase missing Steps")
|
|
logging.HelperResourceError(ctx, "TestCase validation error", map[string]interface{}{logging.KeyError: err})
|
|
return err
|
|
}
|
|
|
|
for name := range c.ExternalProviders {
|
|
if _, ok := c.Providers[name]; ok {
|
|
err := fmt.Errorf("TestCase provider %q set in both ExternalProviders and Providers", name)
|
|
logging.HelperResourceError(ctx, "TestCase validation error", map[string]interface{}{logging.KeyError: err})
|
|
return err
|
|
}
|
|
|
|
if _, ok := c.ProviderFactories[name]; ok {
|
|
err := fmt.Errorf("TestCase provider %q set in both ExternalProviders and ProviderFactories", name)
|
|
logging.HelperResourceError(ctx, "TestCase validation error", map[string]interface{}{logging.KeyError: err})
|
|
return err
|
|
}
|
|
}
|
|
|
|
testCaseHasProviders := c.hasProviders(ctx)
|
|
|
|
for stepIndex, step := range c.Steps {
|
|
stepNumber := stepIndex + 1 // Use 1-based index for humans
|
|
stepValidateReq := testStepValidateRequest{
|
|
StepNumber: stepNumber,
|
|
TestCaseHasProviders: testCaseHasProviders,
|
|
}
|
|
|
|
err := step.validate(ctx, stepValidateReq)
|
|
|
|
if err != nil {
|
|
err := fmt.Errorf("TestStep %d/%d validation error: %w", stepNumber, len(c.Steps), err)
|
|
logging.HelperResourceError(ctx, "TestCase validation error", map[string]interface{}{logging.KeyError: err})
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|