package handler import ( "bytes" "context" "encoding/json" "mime/multipart" "net/http" "net/http/httptest" "testing" "github.com/Tencent/WeKnora/internal/application/service" "github.com/Tencent/WeKnora/internal/middleware" "github.com/Tencent/WeKnora/internal/types" "github.com/gin-gonic/gin" "github.com/stretchr/testify/require" "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" ) func TestInstructionImportHTTPKeepsDescriptionAndReturnsReadableBody(t *testing.T) { db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{Logger: logger.Default.LogMode(logger.Silent)}) require.NoError(t, err) sqlDB, err := db.DB() require.NoError(t, err) t.Cleanup(func() { _ = sqlDB.Close() }) require.NoError(t, db.AutoMigrate(&types.TenantSkillCatalogEntity{})) h := NewSkillHandler(nil, nil) h.SetInstructionService(service.NewInstructionSkillService(db, nil)) gin.SetMode(gin.TestMode) r := gin.New() r.Use(middleware.ErrorHandler()) r.Use(func(c *gin.Context) { ctx := context.WithValue(c.Request.Context(), types.TenantIDContextKey, uint64(1)) ctx = context.WithValue(ctx, types.UserIDContextKey, "alice") ctx = context.WithValue(ctx, types.TenantRoleContextKey, types.TenantRoleContributor) c.Request = c.Request.WithContext(ctx) c.Next() }) r.POST("/skills/instructions/import", h.ImportInstructionSkill) r.GET("/skills/instructions/:id", h.GetInstructionSkill) r.GET("/skills/instructions", h.ListInstructionSkills) var body bytes.Buffer form := multipart.NewWriter(&body) file, err := form.CreateFormFile("file", "写作规则.md") require.NoError(t, err) _, err = file.Write([]byte("# 写作规则\n保持先后依赖,不重复正文。")) require.NoError(t, err) require.NoError(t, form.WriteField("description", "用于连续课程写作")) require.NoError(t, form.Close()) req := httptest.NewRequest(http.MethodPost, "/skills/instructions/import", &body) req.Header.Set("Content-Type", form.FormDataContentType()) w := httptest.NewRecorder() r.ServeHTTP(w, req) require.Equal(t, http.StatusCreated, w.Code, w.Body.String()) var imported struct { Data service.InstructionSkillView `json:"data"` } require.NoError(t, json.Unmarshal(w.Body.Bytes(), &imported)) require.NotEmpty(t, imported.Data.ID) require.Equal(t, "用于连续课程写作", imported.Data.Description) require.Contains(t, imported.Data.Instructions, "先后依赖") for _, endpoint := range []string{"/skills/instructions", "/skills/instructions/" + imported.Data.ID} { w = httptest.NewRecorder() r.ServeHTTP(w, httptest.NewRequest(http.MethodGet, endpoint, nil)) require.Equal(t, http.StatusOK, w.Code, w.Body.String()) require.Contains(t, w.Body.String(), "用于连续课程写作") } }