160 lines
3.5 KiB
Go
160 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)
|
||
|
}
|