Files
WddSuperAgent/agent-wdd/cloudflare/CloudflareAPI_test.go

311 lines
7.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package cloudflare
import (
"agent-wdd/utils"
"fmt"
"testing"
)
// 测试前的设置函数获取API token并检查环境设置
func setupTest(t *testing.T) *CloudflareClient {
// 从环境变量获取API令牌
apiToken := "T7LxBemfe8SNGWkT9uz2XIc1e22ifAbBv_POJvDP"
// 创建Cloudflare客户端实例
return GetInstance(apiToken)
}
// TestClientCreation 测试客户端创建
func TestClientCreation(t *testing.T) {
client := setupTest(t)
if client == nil {
t.Fatal("客户端创建失败")
}
}
// TestListZones 测试获取域名列表
func TestListZones(t *testing.T) {
client := setupTest(t)
// 列出所有域名
zones, err := client.ListZones(nil)
if err != nil {
t.Fatalf("获取域名列表失败: %v", err)
}
t.Logf("找到 %d 个域名", len(zones))
for _, zone := range zones {
t.Logf("域名: %s (ID: %s, 状态: %s)", zone.Name, zone.ID, zone.Status)
utils.BeautifulPrint(zone)
}
}
// TestGetZone 测试获取单个域名详情
func TestGetZone(t *testing.T) {
client := setupTest(t)
// 列出所有域名
zones, err := client.ListZones(nil)
if err != nil {
t.Fatalf("获取域名列表失败: %v", err)
}
// 如果没有域名,则跳过测试
if len(zones) == 0 {
t.Skip("没有找到域名,跳过测试")
}
// 使用第一个域名进行测试
zoneID := zones[0].ID
zoneName := zones[0].Name
// 获取特定域名的详细信息
zone, err := client.GetZone(zoneID)
if err != nil {
t.Fatalf("获取域名详情失败: %v", err)
}
t.Logf("域名 %s 的详情:", zoneName)
t.Logf(" - ID: %s", zone.ID)
t.Logf(" - 状态: %s", zone.Status)
t.Logf(" - 名称服务器: %v", zone.NameServers)
t.Logf(" - 创建时间: %s", zone.CreatedOn)
utils.BeautifulPrint(zone)
}
// TestListDNSRecords 测试获取DNS记录列表
func TestListDNSRecords(t *testing.T) {
client := setupTest(t)
// 列出所有域名
zones, err := client.ListZones(nil)
if err != nil {
t.Fatalf("获取域名列表失败: %v", err)
}
// 如果没有域名,则跳过测试
if len(zones) == 0 {
t.Skip("没有找到域名,跳过测试")
}
// 使用第一个域名进行测试
zoneID := zones[0].ID
zoneName := zones[0].Name
// 列出域名下的所有DNS记录
records, err := client.ListDNSRecords(zoneID, nil)
if err != nil {
t.Fatalf("获取DNS记录列表失败: %v", err)
}
t.Logf("在域名 %s 中找到 %d 条DNS记录", zoneName, len(records))
for i, record := range records {
if i < 5 { // 只打印前5条记录避免输出过多
t.Logf(" - 记录 %d: %s (类型: %s, 内容: %s)", i+1, record.Name, record.Type, record.Content)
}
}
}
// TestCreateUpdateDeleteDNSRecord 测试DNS记录的创建、更新和删除
func TestCreateUpdateDeleteDNSRecord(t *testing.T) {
client := setupTest(t)
// 列出所有域名
zones, err := client.ListZones(nil)
if err != nil {
t.Fatalf("获取域名列表失败: %v", err)
}
// 如果没有域名,则跳过测试
if len(zones) == 0 {
t.Skip("没有找到域名,跳过测试")
}
// 使用第一个域名进行测试
zoneID := zones[0].ID
zoneName := zones[0].Name
// 创建新的DNS记录
testRecordName := fmt.Sprintf("test-api.%s", zoneName)
newRecord := DNSRecord{
Type: "A",
Name: testRecordName,
Content: "192.0.2.1", // 示例IP地址
TTL: 3600, // 1小时
Proxied: false, // 不使用Cloudflare代理
Comment: "自动化测试记录",
}
// 检查记录是否已存在
existingRecord, err := client.FindDNSRecord(zoneID, newRecord.Name, newRecord.Type)
if err != nil {
t.Fatalf("检查已存在记录失败: %v", err)
}
var recordID string
// 测试创建或更新记录
if existingRecord != nil {
// 记录已存在,更新它
t.Logf("记录 %s 已存在,正在更新", newRecord.Name)
updatedRecord, err := client.UpdateDNSRecord(zoneID, existingRecord.ID, newRecord)
if err != nil {
t.Fatalf("更新DNS记录失败: %v", err)
}
t.Logf("成功更新DNS记录: %s", updatedRecord.Name)
recordID = updatedRecord.ID
} else {
// 创建新记录
createdRecord, err := client.CreateDNSRecord(zoneID, newRecord)
if err != nil {
t.Fatalf("创建DNS记录失败: %v", err)
}
t.Logf("成功创建DNS记录: %s", createdRecord.Name)
recordID = createdRecord.ID
}
// 测试获取特定DNS记录详情
record, err := client.GetDNSRecord(zoneID, recordID)
if err != nil {
t.Fatalf("获取DNS记录详情失败: %v", err)
}
t.Logf("DNS记录详情:")
t.Logf(" - ID: %s", record.ID)
t.Logf(" - 名称: %s", record.Name)
t.Logf(" - 类型: %s", record.Type)
t.Logf(" - 内容: %s", record.Content)
t.Logf(" - TTL: %d", record.TTL)
t.Logf(" - 已代理: %t", record.Proxied)
// 测试删除DNS记录
success, err := client.DeleteDNSRecord(zoneID, recordID)
if err != nil {
t.Fatalf("删除DNS记录失败: %v", err)
}
if success {
t.Logf("成功删除DNS记录: %s", record.Name)
} else {
t.Errorf("删除DNS记录失败: %s", record.Name)
}
}
// TestGetZoneIDByName 测试通过域名获取域名ID
func TestGetZoneIDByName(t *testing.T) {
client := setupTest(t)
// 列出所有域名
zones, err := client.ListZones(nil)
if err != nil {
t.Fatalf("获取域名列表失败: %v", err)
}
// 如果没有域名,则跳过测试
if len(zones) == 0 {
t.Skip("没有找到域名,跳过测试")
}
// 使用第一个域名进行测试
zoneName := zones[0].Name
expectedID := zones[0].ID
// 测试辅助函数
id, err := getZoneIDByName(client, zoneName)
if err != nil {
t.Fatalf("通过名称获取域名ID失败: %v", err)
}
if id != expectedID {
t.Errorf("获取的域名ID不匹配: 期望 %s, 实际 %s", expectedID, id)
} else {
t.Logf("成功通过名称获取域名ID: %s", id)
}
}
// TestCreateOrUpdateDNSRecord 测试创建或更新DNS记录辅助函数
func TestCreateOrUpdateDNSRecord(t *testing.T) {
client := setupTest(t)
// 列出所有域名
zones, err := client.ListZones(nil)
if err != nil {
t.Fatalf("获取域名列表失败: %v", err)
}
// 如果没有域名,则跳过测试
if len(zones) == 0 {
t.Skip("没有找到域名,跳过测试")
}
// 使用第一个域名进行测试
zoneID := zones[0].ID
zoneName := zones[0].Name
// 创建测试记录
testRecordName := fmt.Sprintf("test-helper.%s", zoneName)
record := DNSRecord{
Type: "A",
Name: testRecordName,
Content: "192.0.2.2", // 示例IP地址
TTL: 1800, // 30分钟
Proxied: false,
Comment: "测试辅助函数创建的记录",
}
// 测试辅助函数
updatedRecord, err := createOrUpdateDNSRecord(client, zoneID, record)
if err != nil {
t.Fatalf("创建或更新DNS记录失败: %v", err)
}
t.Logf("通过辅助函数成功创建或更新DNS记录: %s", updatedRecord.Name)
// 清理: 删除测试记录
if updatedRecord != nil && updatedRecord.ID != "" {
success, err := client.DeleteDNSRecord(zoneID, updatedRecord.ID)
if err != nil {
t.Logf("清理时删除DNS记录失败: %v", err)
}
if success {
t.Logf("清理: 成功删除测试DNS记录")
}
}
}
// 以下是从Example.go转移过来的辅助函数为了在测试中使用
// getZoneIDByName 通过域名获取对应的Zone ID
func getZoneIDByName(client *CloudflareClient, name string) (string, error) {
zones, err := client.ListZones(&ZoneFilter{Name: name})
if err != nil {
return "", err
}
if len(zones) == 0 {
return "", fmt.Errorf("no zone found with name: %s", name)
}
return zones[0].ID, nil
}
// createOrUpdateDNSRecord 创建或更新DNS记录
func createOrUpdateDNSRecord(client *CloudflareClient, zoneID string, record DNSRecord) (*DNSRecord, error) {
// 查找是否已存在相同名称和类型的记录
existingRecord, err := client.FindDNSRecord(zoneID, record.Name, record.Type)
if err != nil {
return nil, err
}
if existingRecord != nil {
// 更新现有记录
return client.UpdateDNSRecord(zoneID, existingRecord.ID, record)
}
// 创建新记录
return client.CreateDNSRecord(zoneID, record)
}