forked from TrueCloudLab/lego
174 lines
4.6 KiB
Go
174 lines
4.6 KiB
Go
|
package internal
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"net/http"
|
||
|
"net/http/httptest"
|
||
|
"net/url"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
"testing"
|
||
|
|
||
|
"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("secret")
|
||
|
client.HTTPClient = server.Client()
|
||
|
client.baseURL, _ = url.Parse(server.URL)
|
||
|
|
||
|
return client
|
||
|
}
|
||
|
|
||
|
func testHandler(method string, statusCode int, filename string) http.HandlerFunc {
|
||
|
return func(rw http.ResponseWriter, req *http.Request) {
|
||
|
if req.Method != method {
|
||
|
http.Error(rw, fmt.Sprintf(`{"message":"unsupported method: %s"}`, req.Method), http.StatusMethodNotAllowed)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
auth := req.Header.Get(authorizationHeader)
|
||
|
if auth != "Bearer secret" {
|
||
|
http.Error(rw, fmt.Sprintf("invalid API Token: %s", auth), http.StatusUnauthorized)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
rw.WriteHeader(statusCode)
|
||
|
|
||
|
if statusCode == http.StatusNoContent {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
file, err := os.Open(filepath.Join("fixtures", filename))
|
||
|
if err != nil {
|
||
|
http.Error(rw, fmt.Sprintf(`{"message":"%v"}`, err), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
defer func() { _ = file.Close() }()
|
||
|
|
||
|
_, err = io.Copy(rw, file)
|
||
|
if err != nil {
|
||
|
http.Error(rw, fmt.Sprintf(`{"message":"%v"}`, err), http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestClient_ListDomains(t *testing.T) {
|
||
|
client := setupTest(t, "/domains", testHandler(http.MethodGet, http.StatusOK, "domain-list-domains.json"))
|
||
|
|
||
|
domains, err := client.ListDomains(context.Background())
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
require.Len(t, domains, 1)
|
||
|
|
||
|
expected := []Domain{{
|
||
|
Domain: "string",
|
||
|
DomainID: "3fa85f64-5717-4562-b3fc-2c963f66afa6",
|
||
|
ProjectID: "3fa85f64-5717-4562-b3fc-2c963f66afa6",
|
||
|
}}
|
||
|
|
||
|
assert.Equal(t, expected, domains)
|
||
|
}
|
||
|
|
||
|
func TestClient_ListDomains_error(t *testing.T) {
|
||
|
client := setupTest(t, "/domains", testHandler(http.MethodGet, http.StatusBadRequest, "error-client.json"))
|
||
|
|
||
|
_, err := client.ListDomains(context.Background())
|
||
|
require.EqualError(t, err, "[status code 400] ValidationError: Validation failed [format: should be string (.address.street, email)]")
|
||
|
}
|
||
|
|
||
|
func TestClient_ListDNSZones(t *testing.T) {
|
||
|
client := setupTest(t, "/projects/my-project-id/dns-zones", testHandler(http.MethodGet, http.StatusOK, "dns-list-dns-zones.json"))
|
||
|
|
||
|
zones, err := client.ListDNSZones(context.Background(), "my-project-id")
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
require.Len(t, zones, 1)
|
||
|
|
||
|
expected := []DNSZone{{
|
||
|
ID: "3fa85f64-5717-4562-b3fc-2c963f66afa6",
|
||
|
Domain: "string",
|
||
|
RecordSet: &RecordSet{
|
||
|
TXT: &TXTRecord{},
|
||
|
},
|
||
|
}}
|
||
|
|
||
|
assert.Equal(t, expected, zones)
|
||
|
}
|
||
|
|
||
|
func TestClient_GetDNSZone(t *testing.T) {
|
||
|
client := setupTest(t, "/dns-zones/my-zone-id", testHandler(http.MethodGet, http.StatusOK, "dns-get-dns-zone.json"))
|
||
|
|
||
|
zone, err := client.GetDNSZone(context.Background(), "my-zone-id")
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
expected := &DNSZone{
|
||
|
ID: "3fa85f64-5717-4562-b3fc-2c963f66afa6",
|
||
|
Domain: "string",
|
||
|
RecordSet: &RecordSet{
|
||
|
TXT: &TXTRecord{},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
assert.Equal(t, expected, zone)
|
||
|
}
|
||
|
|
||
|
func TestClient_CreateDNSZone(t *testing.T) {
|
||
|
client := setupTest(t, "/dns-zones", testHandler(http.MethodPost, http.StatusCreated, "dns-create-dns-zone.json"))
|
||
|
|
||
|
request := CreateDNSZoneRequest{
|
||
|
Name: "test",
|
||
|
ParentZoneID: "my-parent-zone-id",
|
||
|
}
|
||
|
|
||
|
zone, err := client.CreateDNSZone(context.Background(), request)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
expected := &DNSZone{
|
||
|
ID: "3fa85f64-5717-4562-b3fc-2c963f66afa6",
|
||
|
}
|
||
|
|
||
|
assert.Equal(t, expected, zone)
|
||
|
}
|
||
|
|
||
|
func TestClient_UpdateTXTRecord(t *testing.T) {
|
||
|
client := setupTest(t, "/dns-zones/my-zone-id/record-sets/txt", testHandler(http.MethodPut, http.StatusNoContent, ""))
|
||
|
|
||
|
record := TXTRecord{
|
||
|
Settings: Settings{
|
||
|
TTL: TTL{Auto: true},
|
||
|
},
|
||
|
Entries: []string{"txt"},
|
||
|
}
|
||
|
|
||
|
err := client.UpdateTXTRecord(context.Background(), "my-zone-id", record)
|
||
|
require.NoError(t, err)
|
||
|
}
|
||
|
|
||
|
func TestClient_DeleteDNSZone(t *testing.T) {
|
||
|
client := setupTest(t, "/dns-zones/my-zone-id", testHandler(http.MethodDelete, http.StatusOK, ""))
|
||
|
|
||
|
err := client.DeleteDNSZone(context.Background(), "my-zone-id")
|
||
|
require.NoError(t, err)
|
||
|
}
|
||
|
|
||
|
func TestClient_DeleteDNSZone_error(t *testing.T) {
|
||
|
client := setupTest(t, "/dns-zones/my-zone-id", testHandler(http.MethodDelete, http.StatusInternalServerError, "error.json"))
|
||
|
|
||
|
err := client.DeleteDNSZone(context.Background(), "my-zone-id")
|
||
|
assert.EqualError(t, err, "[status code 500] InternalServerError: Something went wrong")
|
||
|
}
|