package main import ( "bytes" "encoding/json" "io" "net/http" "testing" "git.x2erp.com/qdy/go-base/model/request/configreq" ) const ( skillTestSkillID = "test-skill-001" skillTestProjectID = "test-project-skill-001" skillTestDescription = "测试Skill描述" skillTestContent = `{"type": "code_generation", "language": "go"}` skillUpdatedContent = `{"type": "code_review", "language": "python"}` skillBaseURL = "http://localhost:8080" ) // TestProjectSkillCRUD 测试项目Skill的增删改查 func TestProjectSkillCRUD(t *testing.T) { // 1. 创建项目Skill t.Run("CreateProjectSkill", testCreateProjectSkill) // 2. 查询单个项目Skill t.Run("GetProjectSkill", testGetProjectSkill) // 3. 查询项目Skill列表 t.Run("ListProjectSkills", testListProjectSkills) // 4. 更新项目Skill t.Run("UpdateProjectSkill", testUpdateProjectSkill) // 5. 查询更新后的项目Skill t.Run("GetUpdatedProjectSkill", testGetUpdatedProjectSkill) // 6. 删除项目Skill t.Run("DeleteProjectSkill", testDeleteProjectSkill) // 7. 验证项目Skill已删除 t.Run("VerifyProjectSkillDeleted", testVerifyProjectSkillDeleted) } func testCreateProjectSkill(t *testing.T) { httpClient := &http.Client{} url := skillBaseURL + "/api/create/config/project/skill" reqBody := configreq.ProjectSkillRequest{ SkillID: skillTestSkillID, ProjectID: skillTestProjectID, Description: skillTestDescription, Content: skillTestContent, } 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("创建项目Skill失败: %v", result) } t.Logf("创建项目Skill成功: %s", string(body)) } func testGetProjectSkill(t *testing.T) { httpClient := &http.Client{} url := skillBaseURL + "/api/query/config/project/skill/" + skillTestSkillID 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("查询项目Skill失败: %v", result) } t.Logf("查询项目Skill成功: %s", string(body)) } func testListProjectSkills(t *testing.T) { httpClient := &http.Client{} url := skillBaseURL + "/api/query/config/project/skills" 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("查询项目Skill列表失败: %v", result) } t.Logf("查询项目Skill列表成功: %s", string(body)) } func testUpdateProjectSkill(t *testing.T) { httpClient := &http.Client{} url := skillBaseURL + "/api/update/config/project/skill/" + skillTestSkillID reqBody := configreq.ProjectSkillRequest{ SkillID: skillTestSkillID, ProjectID: skillTestProjectID, Description: "更新后的Skill描述", Content: skillUpdatedContent, } 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) } 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("更新项目Skill失败: %v", result) } t.Logf("更新项目Skill成功: %s", string(body)) } func testGetUpdatedProjectSkill(t *testing.T) { httpClient := &http.Client{} url := skillBaseURL + "/api/query/config/project/skill/" + skillTestSkillID 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("查询更新后项目Skill失败: %v", result) } t.Logf("查询更新后项目Skill成功: %s", string(body)) } func testDeleteProjectSkill(t *testing.T) { httpClient := &http.Client{} url := skillBaseURL + "/api/delete/config/project/skill/" + skillTestSkillID 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("删除项目Skill失败: %v", result) } t.Logf("删除项目Skill成功: %s", string(body)) } func testVerifyProjectSkillDeleted(t *testing.T) { httpClient := &http.Client{} url := skillBaseURL + "/api/query/config/project/skill/" + skillTestSkillID 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 { // 如果成功,检查数据是否为空 if data, ok := result["data"].(map[string]interface{}); ok && data != nil { t.Errorf("项目Skill应该已删除但仍有数据: %v", result) } } t.Logf("验证项目Skill已删除: %s", string(body)) }