lego/providers/dns/cloudru/internal/client_test.go
2023-07-27 11:09:39 +00:00

159 lines
3.5 KiB
Go

package internal
import (
"fmt"
"io"
"net/http"
"net/http/httptest"
"net/url"
"os"
"path/filepath"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func setupTest(t *testing.T, pattern string, handler http.HandlerFunc) *Client {
t.Helper()
mux := http.NewServeMux()
server := httptest.NewServer(mux)
t.Cleanup(server.Close)
mux.HandleFunc(pattern, handler)
client := NewClient("user", "secret")
client.HTTPClient = server.Client()
client.APIEndpoint, _ = url.Parse(server.URL)
client.token = &Token{
AccessToken: "secret",
ExpiresIn: 60,
TokenType: "Bearer",
Deadline: time.Now().Add(1 * time.Minute),
}
return client
}
func writeFixtureHandler(method, filename string) http.HandlerFunc {
return func(rw http.ResponseWriter, req *http.Request) {
if req.Method != method {
http.Error(rw, fmt.Sprintf("unsupported method %s", req.Method), http.StatusBadRequest)
return
}
file, err := os.Open(filepath.Join("fixtures", filename))
if err != nil {
http.Error(rw, err.Error(), http.StatusInternalServerError)
return
}
defer func() { _ = file.Close() }()
_, _ = io.Copy(rw, file)
}
}
func TestClient_GetZones(t *testing.T) {
client := setupTest(t, "/zones", writeFixtureHandler(http.MethodGet, "zones.json"))
ctx := mockContext()
zones, err := client.GetZones(ctx, "xxx")
require.NoError(t, err)
expected := []Zone{
{
ID: "59556fcd-95ff-451f-b49b-9732f21f944a",
ParentID: "2d7b6194-2b83-4f71-86fd-a1e727e347b2",
Name: "example.com",
Valid: true,
Delegated: true,
CreatedAt: time.Date(2023, 7, 23, 8, 12, 41, 0, time.UTC),
UpdatedAt: time.Date(2023, 7, 24, 5, 50, 28, 0, time.UTC),
},
}
assert.Equal(t, expected, zones)
}
func TestClient_GetRecords(t *testing.T) {
client := setupTest(t, "/zones/zzz/records", writeFixtureHandler(http.MethodGet, "records.json"))
ctx := mockContext()
records, err := client.GetRecords(ctx, "zzz")
require.NoError(t, err)
expected := []Record{
{
ZoneID: "59556fcd-95ff-451f-b49b-9732f21f944a",
Name: "example.com.",
Type: "SOA",
Values: []string{
"cdns-ns01.sbercloud.ru. mail.sbercloud.ru 1 120 3600 604800 3600",
},
TTL: "3600",
Enables: true,
},
{
ZoneID: "59556fcd-95ff-451f-b49b-9732f21f944a",
Name: "example.com.",
Type: "NS",
Values: []string{
"cdns-ns01.sbercloud.ru.",
"cdns-ns02.sbercloud.ru.",
},
TTL: "3600",
Enables: true,
},
{
ZoneID: "59556fcd-95ff-451f-b49b-9732f21f944a",
Name: "www.example.com.",
Type: "A",
Values: []string{
"8.8.8.8",
},
TTL: "3600",
Enables: true,
},
}
assert.Equal(t, expected, records)
}
func TestClient_CreateRecord(t *testing.T) {
client := setupTest(t, "/zones/zzz/records", writeFixtureHandler(http.MethodPost, "record.json"))
ctx := mockContext()
recordReq := Record{
Name: "www.example.com.",
Type: "TXT",
Values: []string{"text"},
TTL: "3600",
}
record, err := client.CreateRecord(ctx, "zzz", recordReq)
require.NoError(t, err)
expected := &Record{
ZoneID: "59556fcd-95ff-451f-b49b-9732f21f944a",
Name: "www.example.com.",
Type: "TXT",
Values: []string{
"txt",
},
TTL: "3600",
Enables: true,
}
assert.Equal(t, expected, record)
}
func TestClient_DeleteRecord(t *testing.T) {
client := setupTest(t, "/zones/zzz/records/example.com/TXT", writeFixtureHandler(http.MethodDelete, "record.json"))
ctx := mockContext()
err := client.DeleteRecord(ctx, "zzz", "example.com", "TXT")
require.NoError(t, err)
}