package main import ( "bytes" "encoding/json" "io" "net/http" "testing" "git.x2erp.com/qdy/go-base/model/request/configreq" ) const ( testTenantID = "test-tenant-001" testName = "测试租户" tenantBaseURL = "http://localhost:8080" ) // TestTenantCRUD 测试租户的增删改查 func TestTenantCRUD(t *testing.T) { // 1. 创建租户 t.Run("CreateTenant", testCreateTenant) // 2. 查询单个租户 t.Run("GetTenant", testGetTenant) // 3. 查询租户列表 t.Run("ListTenants", testListTenants) // 4. 更新租户 t.Run("UpdateTenant", testUpdateTenant) // 5. 查询更新后的租户 t.Run("GetUpdatedTenant", testGetUpdatedTenant) // 6. 删除租户 t.Run("DeleteTenant", testDeleteTenant) // 7. 验证租户已删除 t.Run("VerifyTenantDeleted", testVerifyTenantDeleted) } func testCreateTenant(t *testing.T) { httpClient := &http.Client{} url := tenantBaseURL + "/api/create/config/tenant" reqBody := configreq.TenantRequest{ TenantID: testTenantID, Name: testName, } jsonData, err := json.Marshal(reqBody) if err != nil { t.Fatalf("JSON序列化失败: %v", err) } req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData)) if err != nil { t.Fatalf("创建请求失败: %v", err) } // 使用Basic认证 req.SetBasicAuth("admin", "123") req.Header.Set("Content-Type", "application/json") resp, err := httpClient.Do(req) if err != nil { t.Fatalf("请求失败: %v", err) } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { t.Fatalf("读取响应失败: %v", err) } var result map[string]interface{} if err := json.Unmarshal(body, &result); err != nil { t.Fatalf("JSON解析失败: %v", err) } if success, ok := result["success"].(bool); !ok || !success { t.Errorf("创建租户失败: %v", result) } t.Logf("创建租户成功: %s", string(body)) } func testGetTenant(t *testing.T) { httpClient := &http.Client{} url := tenantBaseURL + "/api/query/config/tenant/" + testTenantID req, err := http.NewRequest("POST", url, nil) if err != nil { t.Fatalf("创建请求失败: %v", err) } req.SetBasicAuth("admin", "123") req.Header.Set("Content-Type", "application/json") resp, err := httpClient.Do(req) if err != nil { t.Fatalf("请求失败: %v", err) } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { t.Fatalf("读取响应失败: %v", err) } var result map[string]interface{} if err := json.Unmarshal(body, &result); err != nil { t.Fatalf("JSON解析失败: %v", err) } if success, ok := result["success"].(bool); !ok || !success { t.Errorf("查询租户失败: %v", result) } // 验证租户信息 if data, ok := result["data"].(map[string]interface{}); ok { if tenantID, ok := data["TenantID"].(string); !ok || tenantID != testTenantID { t.Errorf("租户ID不匹配, 期望: %s, 实际: %v", testTenantID, tenantID) } if name, ok := data["Name"].(string); !ok || name != testName { t.Errorf("租户名称不匹配, 期望: %s, 实际: %v", testName, name) } } t.Logf("查询租户成功: %s", string(body)) } func testListTenants(t *testing.T) { httpClient := &http.Client{} url := tenantBaseURL + "/api/query/config/tenants" req, err := http.NewRequest("POST", url, nil) if err != nil { t.Fatalf("创建请求失败: %v", err) } req.SetBasicAuth("admin", "123") req.Header.Set("Content-Type", "application/json") resp, err := httpClient.Do(req) if err != nil { t.Fatalf("请求失败: %v", err) } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { t.Fatalf("读取响应失败: %v", err) } var result map[string]interface{} if err := json.Unmarshal(body, &result); err != nil { t.Fatalf("JSON解析失败: %v", err) } if success, ok := result["success"].(bool); !ok || !success { t.Errorf("查询租户列表失败: %v", result) } t.Logf("查询租户列表成功: %s", string(body)) } func testUpdateTenant(t *testing.T) { httpClient := &http.Client{} url := tenantBaseURL + "/api/update/config/tenant/" + testTenantID updatedReq := configreq.TenantRequest{ TenantID: testTenantID, Name: "更新后的租户名称", } jsonData, err := json.Marshal(updatedReq) if err != nil { t.Fatalf("JSON序列化失败: %v", err) } req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData)) if err != nil { t.Fatalf("创建请求失败: %v", err) } req.SetBasicAuth("admin", "123") req.Header.Set("Content-Type", "application/json") resp, err := httpClient.Do(req) if err != nil { t.Fatalf("请求失败: %v", err) } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { t.Fatalf("读取响应失败: %v", err) } var result map[string]interface{} if err := json.Unmarshal(body, &result); err != nil { t.Fatalf("JSON解析失败: %v", err) } if success, ok := result["success"].(bool); !ok || !success { t.Errorf("更新租户失败: %v", result) } t.Logf("更新租户成功: %s", string(body)) } func testGetUpdatedTenant(t *testing.T) { httpClient := &http.Client{} url := tenantBaseURL + "/api/query/config/tenant/" + testTenantID req, err := http.NewRequest("POST", url, nil) if err != nil { t.Fatalf("创建请求失败: %v", err) } req.SetBasicAuth("admin", "123") req.Header.Set("Content-Type", "application/json") resp, err := httpClient.Do(req) if err != nil { t.Fatalf("请求失败: %v", err) } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { t.Fatalf("读取响应失败: %v", err) } var result map[string]interface{} if err := json.Unmarshal(body, &result); err != nil { t.Fatalf("JSON解析失败: %v", err) } if success, ok := result["success"].(bool); !ok || !success { t.Errorf("查询更新后的租户失败: %v", result) } // 验证租户信息已更新 if data, ok := result["data"].(map[string]interface{}); ok { if name, ok := data["Name"].(string); !ok || name != "更新后的租户名称" { t.Errorf("租户名称未更新, 期望: %s, 实际: %v", "更新后的租户名称", name) } } t.Logf("查询更新后的租户成功: %s", string(body)) } func testDeleteTenant(t *testing.T) { httpClient := &http.Client{} url := tenantBaseURL + "/api/delete/config/tenant/" + testTenantID req, err := http.NewRequest("POST", url, nil) if err != nil { t.Fatalf("创建请求失败: %v", err) } req.SetBasicAuth("admin", "123") req.Header.Set("Content-Type", "application/json") resp, err := httpClient.Do(req) if err != nil { t.Fatalf("请求失败: %v", err) } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { t.Fatalf("读取响应失败: %v", err) } var result map[string]interface{} if err := json.Unmarshal(body, &result); err != nil { t.Fatalf("JSON解析失败: %v", err) } if success, ok := result["success"].(bool); !ok || !success { t.Errorf("删除租户失败: %v", result) } t.Logf("删除租户成功: %s", string(body)) } func testVerifyTenantDeleted(t *testing.T) { httpClient := &http.Client{} url := tenantBaseURL + "/api/query/config/tenant/" + testTenantID req, err := http.NewRequest("POST", url, nil) if err != nil { t.Fatalf("创建请求失败: %v", err) } req.SetBasicAuth("admin", "123") req.Header.Set("Content-Type", "application/json") resp, err := httpClient.Do(req) if err != nil { t.Fatalf("请求失败: %v", err) } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { t.Fatalf("读取响应失败: %v", err) } var result map[string]interface{} if err := json.Unmarshal(body, &result); err != nil { t.Fatalf("JSON解析失败: %v", err) } // 租户已删除,应该返回失败 if success, ok := result["success"].(bool); ok && success { t.Errorf("租户应该已删除但查询成功: %v", result) } t.Logf("验证租户已删除成功: %s", string(body)) }