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) }