lego/providers/dns/stackpath/internal/client_test.go
2023-05-05 09:49:38 +02:00

131 lines
3 KiB
Go

package internal
import (
"context"
"net/http"
"net/http/httptest"
"net/url"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func setupTest(t *testing.T) (*Client, *http.ServeMux) {
t.Helper()
mux := http.NewServeMux()
server := httptest.NewServer(mux)
t.Cleanup(server.Close)
client := NewClient(context.Background(), "STACK_ID", "CLIENT_ID", "CLIENT_SECRET")
client.httpClient = server.Client()
client.baseURL, _ = url.Parse(server.URL + "/")
return client, mux
}
func TestClient_GetZoneRecords(t *testing.T) {
client, mux := setupTest(t)
mux.HandleFunc("/STACK_ID/zones/A/records", func(w http.ResponseWriter, _ *http.Request) {
content := `
{
"records": [
{"id":"1","name":"foo1","type":"TXT","ttl":120,"data":"txtTXTtxt"},
{"id":"2","name":"foo2","type":"TXT","ttl":121,"data":"TXTtxtTXT"}
]
}`
_, err := w.Write([]byte(content))
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
})
records, err := client.GetZoneRecords(context.Background(), "foo1", &Zone{ID: "A", Domain: "test"})
require.NoError(t, err)
expected := []Record{
{ID: "1", Name: "foo1", Type: "TXT", TTL: 120, Data: "txtTXTtxt"},
{ID: "2", Name: "foo2", Type: "TXT", TTL: 121, Data: "TXTtxtTXT"},
}
assert.Equal(t, expected, records)
}
func TestClient_GetZoneRecords_apiError(t *testing.T) {
client, mux := setupTest(t)
mux.HandleFunc("/STACK_ID/zones/A/records", func(w http.ResponseWriter, _ *http.Request) {
content := `
{
"code": 401,
"error": "an unauthorized request is attempted."
}`
w.WriteHeader(http.StatusUnauthorized)
_, err := w.Write([]byte(content))
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
})
_, err := client.GetZoneRecords(context.Background(), "foo1", &Zone{ID: "A", Domain: "test"})
expected := &ErrorResponse{Code: 401, Message: "an unauthorized request is attempted."}
assert.Equal(t, expected, err)
}
func TestClient_GetZones(t *testing.T) {
client, mux := setupTest(t)
mux.HandleFunc("/STACK_ID/zones", func(w http.ResponseWriter, _ *http.Request) {
content := `
{
"pageInfo": {
"totalCount": "5",
"hasPreviousPage": false,
"hasNextPage": false,
"startCursor": "1",
"endCursor": "1"
},
"zones": [
{
"stackId": "my_stack",
"accountId": "my_account",
"id": "A",
"domain": "foo.com",
"version": "1",
"labels": {
"property1": "val1",
"property2": "val2"
},
"created": "2018-10-07T02:31:49Z",
"updated": "2018-10-07T02:31:49Z",
"nameservers": [
"1.1.1.1"
],
"verified": "2018-10-07T02:31:49Z",
"status": "ACTIVE",
"disabled": false
}
]
}`
_, err := w.Write([]byte(content))
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
})
zone, err := client.GetZones(context.Background(), "sub.foo.com")
require.NoError(t, err)
expected := &Zone{ID: "A", Domain: "foo.com"}
assert.Equal(t, expected, zone)
}