This repository has been archived on 2026-08-17. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
terraform-provider-dynu/internal/provider/provider_test.go
T

96 lines
3.2 KiB
Go

package provider
import (
"context"
"os"
"path/filepath"
"strings"
"testing"
"github.com/dynu/terraform-provider-dynu/internal/dynuclient"
"github.com/hashicorp/terraform-plugin-framework/provider"
"github.com/hashicorp/terraform-plugin-framework/types"
)
func TestResolveAPIKey(t *testing.T) {
tests := []struct {
name string
config types.String
env string
want string
}{
{name: "config wins", config: types.StringValue("config-key"), env: "env-key", want: "config-key"},
{name: "env fallback", config: types.StringNull(), env: "env-key", want: "env-key"},
{name: "trim spaces", config: types.StringValue(" config-key "), env: " env-key ", want: "config-key"},
{name: "unknown uses env", config: types.StringUnknown(), env: "env-key", want: "env-key"},
{name: "empty when missing", config: types.StringNull(), env: "", want: ""},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
if got := resolveAPIKey(tc.config, tc.env); got != tc.want {
t.Fatalf("resolveAPIKey() = %q, want %q", got, tc.want)
}
})
}
}
func TestProviderSchema(t *testing.T) {
p := New("test")()
var resp provider.SchemaResponse
p.Schema(context.Background(), provider.SchemaRequest{}, &resp)
apiKeyAttr, ok := resp.Schema.Attributes["api_key"]
if !ok {
t.Fatal("expected api_key in provider schema")
}
if !apiKeyAttr.IsOptional() {
t.Fatal("expected api_key to be optional")
}
baseURLAttr, ok := resp.Schema.Attributes["base_url"]
if !ok {
t.Fatal("expected base_url in provider schema")
}
if !baseURLAttr.IsOptional() {
t.Fatal("expected base_url to be optional")
}
}
func TestDiagnosticSummary(t *testing.T) {
tests := []struct {
name string
err error
summary string
want string
}{
{name: "non api error", err: os.ErrNotExist, summary: "Unable to list Dynu domains", want: "Unable to list Dynu domains"},
{name: "auth error", err: &dynuclient.APIError{StatusCode: 401, Type: "Unauthorized", Message: "invalid"}, summary: "Unable to list Dynu domains", want: "Unable to list Dynu domains (authentication failed)"},
{name: "not found", err: &dynuclient.APIError{StatusCode: 404, Type: "Not Found", Message: "missing"}, summary: "Unable to resolve Dynu domain from hostname", want: "Unable to resolve Dynu domain from hostname (not found)"},
{name: "404 validation exception", err: &dynuclient.APIError{StatusCode: 404, Type: "Request Exception", Message: "Invalid."}, summary: "Unable to update Dynu DNS record", want: "Unable to update Dynu DNS record"},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
if got := diagnosticSummary(tc.summary, tc.err); got != tc.want {
t.Fatalf("diagnosticSummary() = %q, want %q", got, tc.want)
}
})
}
}
func TestReadOnlyExampleUsesValidProviderArguments(t *testing.T) {
contents, err := os.ReadFile(filepath.Join("..", "..", "examples", "read_only", "providers.tf"))
if err != nil {
t.Fatalf("read example providers.tf: %v", err)
}
config := string(contents)
if strings.Contains(config, "username") {
t.Fatal("example providers.tf must not use unsupported provider argument 'username'")
}
if !strings.Contains(config, "api_key") {
t.Fatal("example providers.tf must include api_key argument")
}
}