Add dynu_dns_record CRUD resource and write-capable client

This commit is contained in:
beatz174-bit
2026-04-23 13:52:55 +10:00
parent d6b52c1f44
commit 7d636b6371
9 changed files with 970 additions and 49 deletions
+69 -4
View File
@@ -2,10 +2,10 @@ package dynuclient_test
import (
"context"
"github.com/dynu/terraform-provider-dynu/internal/dynuclient"
"strings"
"testing"
"github.com/dynu/terraform-provider-dynu/internal/dynuclient"
"github.com/dynu/terraform-provider-dynu/internal/testutil/fakedynu"
)
@@ -23,7 +23,7 @@ func TestClientListDomainsSuccess(t *testing.T) {
}
}
func TestClientDoGetNon2xxStatus(t *testing.T) {
func TestClientDoRequestNon2xxStatus(t *testing.T) {
fake := fakedynu.NewServer()
defer fake.Close()
fake.SetRawResponse("/dns", 401, `{"message":"nope"}`)
@@ -35,7 +35,7 @@ func TestClientDoGetNon2xxStatus(t *testing.T) {
}
}
func TestClientDoGetAPIExceptionPayload(t *testing.T) {
func TestClientDoRequestAPIExceptionPayload(t *testing.T) {
fake := fakedynu.NewServer()
defer fake.Close()
fake.SetAPIError("/dns", fakedynu.APIError{HTTPStatus: 400, StatusCode: 400, Type: "Validation Exception", Message: "bad hostname"})
@@ -47,7 +47,7 @@ func TestClientDoGetAPIExceptionPayload(t *testing.T) {
}
}
func TestClientDoGetMalformedJSON(t *testing.T) {
func TestClientDoRequestMalformedJSON(t *testing.T) {
fake := fakedynu.NewServer()
defer fake.Close()
fake.SetRawResponse("/dns", 200, `{"statusCode":200,"domains":[`)
@@ -82,3 +82,68 @@ func TestClientGetRootDomainEscapesHostname(t *testing.T) {
t.Fatalf("expected hostname not found error, got %v", err)
}
}
func TestClientDNSRecordCRUD(t *testing.T) {
fake := fakedynu.NewServer()
defer fake.Close()
client := dynuclient.New("test-key", dynuclient.WithBaseURL(fake.BaseURL()), dynuclient.WithHTTPClient(fake.Client()))
state := true
created, err := client.CreateDNSRecord(context.Background(), 1001, dynuclient.CreateDNSRecordRequest{
NodeName: "api",
RecordType: "TXT",
Content: "created",
TTL: 120,
State: &state,
Group: "integration",
})
if err != nil {
t.Fatalf("CreateDNSRecord() error = %v", err)
}
if created.ID == 0 {
t.Fatal("expected created record id")
}
got, err := client.GetDNSRecord(context.Background(), 1001, created.ID)
if err != nil {
t.Fatalf("GetDNSRecord() error = %v", err)
}
if got.Content != "created" {
t.Fatalf("expected content created, got %q", got.Content)
}
updated, err := client.UpdateDNSRecord(context.Background(), 1001, created.ID, dynuclient.UpdateDNSRecordRequest{
NodeName: "api",
RecordType: "TXT",
Content: "updated",
TTL: 180,
State: &state,
})
if err != nil {
t.Fatalf("UpdateDNSRecord() error = %v", err)
}
if updated.Content != "updated" || updated.TTL != 180 {
t.Fatalf("unexpected update response: %#v", updated)
}
if err := client.DeleteDNSRecord(context.Background(), 1001, created.ID); err != nil {
t.Fatalf("DeleteDNSRecord() error = %v", err)
}
_, err = client.GetDNSRecord(context.Background(), 1001, created.ID)
if err == nil || !strings.Contains(err.Error(), "record not found") {
t.Fatalf("expected record not found after delete, got %v", err)
}
}
func TestClientDNSRecordWriteAPIError(t *testing.T) {
fake := fakedynu.NewServer()
defer fake.Close()
fake.SetAPIError("/dns/1001/record", fakedynu.APIError{HTTPStatus: 400, StatusCode: 400, Type: "Validation Exception", Message: "recordType invalid"})
client := dynuclient.New("test-key", dynuclient.WithBaseURL(fake.BaseURL()), dynuclient.WithHTTPClient(fake.Client()))
_, err := client.CreateDNSRecord(context.Background(), 1001, dynuclient.CreateDNSRecordRequest{RecordType: "", Content: "x"})
if err == nil || !strings.Contains(err.Error(), "Validation Exception") {
t.Fatalf("expected validation API error, got %v", err)
}
}