terraform-provider-gitea/vendor/github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource/testcase_validate.go

88 lines
2.4 KiB
Go
Raw Normal View History

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
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
}