#10: implement Cloudflare DNS automation engine (13 records & system aliases)
This commit is contained in:
1 parent
b08bce71bb
commit
10836ea98f
14 files changed
+1043
-2
No files matched your search
@@ -0,0 +1,115 @@
|
||||
package cloudflare
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
|
||||
"lambdamail/protocols/internal/domain/entity"
|
||||
)
|
||||
|
||||
func TestCloudflareAdapter_GetZoneID_List_Create_Update_Delete(t *testing.T) {
|
||||
mux := http.NewServeMux()
|
||||
|
||||
// GET /zones?name=example.test
|
||||
mux.HandleFunc("/zones", func(w http.ResponseWriter, r *http.Request) {
|
||||
name := r.URL.Query().Get("name")
|
||||
if name == "example.test" {
|
||||
w.WriteHeader(http.StatusOK)
|
||||
json.NewEncoder(w).Encode(map[string]interface{}{
|
||||
"success": true,
|
||||
"result": []map[string]interface{}{
|
||||
{"id": "zone_12345", "name": "example.test"},
|
||||
},
|
||||
})
|
||||
} else {
|
||||
w.WriteHeader(http.StatusOK)
|
||||
json.NewEncoder(w).Encode(map[string]interface{}{
|
||||
"success": false,
|
||||
"errors": []map[string]string{{"message": "Zone not found"}},
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
// GET /zones/zone_12345/dns_records & POST /zones/zone_12345/dns_records
|
||||
mux.HandleFunc("/zones/zone_12345/dns_records", func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method == http.MethodGet {
|
||||
w.WriteHeader(http.StatusOK)
|
||||
json.NewEncoder(w).Encode(map[string]interface{}{
|
||||
"success": true,
|
||||
"result": []map[string]interface{}{
|
||||
{
|
||||
"id": "rec_1",
|
||||
"type": "A",
|
||||
"name": "mail.example.test",
|
||||
"content": "192.0.2.1",
|
||||
"ttl": 1,
|
||||
"proxied": false,
|
||||
},
|
||||
},
|
||||
})
|
||||
} else if r.Method == http.MethodPost {
|
||||
w.WriteHeader(http.StatusOK)
|
||||
json.NewEncoder(w).Encode(map[string]interface{}{
|
||||
"success": true,
|
||||
"result": map[string]interface{}{
|
||||
"id": "rec_2",
|
||||
},
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
// PUT /zones/zone_12345/dns_records/rec_1
|
||||
mux.HandleFunc("/zones/zone_12345/dns_records/rec_1", func(w http.ResponseWriter, r *http.Request) {
|
||||
w.WriteHeader(http.StatusOK)
|
||||
json.NewEncoder(w).Encode(map[string]interface{}{
|
||||
"success": true,
|
||||
"result": map[string]interface{}{"id": "rec_1"},
|
||||
})
|
||||
})
|
||||
|
||||
ts := httptest.NewServer(mux)
|
||||
defer ts.Close()
|
||||
|
||||
adapter := NewCloudflareAdapter("test_token")
|
||||
adapter.baseURL = ts.URL
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
// 1. GetZoneID
|
||||
zoneID, err := adapter.GetZoneID(ctx, "example.test")
|
||||
if err != nil || zoneID != "zone_12345" {
|
||||
t.Fatalf("GetZoneID: err=%v, zoneID=%s", err, zoneID)
|
||||
}
|
||||
|
||||
// 2. ListRecords
|
||||
records, err := adapter.ListRecords(ctx, zoneID)
|
||||
if err != nil || len(records) != 1 || records[0].Name != "mail.example.test" {
|
||||
t.Fatalf("ListRecords: err=%v, records=%+v", err, records)
|
||||
}
|
||||
|
||||
// 3. CreateRecord
|
||||
err = adapter.CreateRecord(ctx, zoneID, entity.DnsRecord{
|
||||
Type: "TXT",
|
||||
Name: "example.test",
|
||||
Value: "v=spf1 mx -all",
|
||||
TTL: 1,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("CreateRecord: %v", err)
|
||||
}
|
||||
|
||||
// 4. UpdateRecord
|
||||
err = adapter.UpdateRecord(ctx, zoneID, entity.DnsRecord{
|
||||
ID: "rec_1",
|
||||
Type: "A",
|
||||
Name: "mail.example.test",
|
||||
Value: "192.0.2.2",
|
||||
TTL: 1,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("UpdateRecord: %v", err)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user