71 lines
2.7 KiB
Go
71 lines
2.7 KiB
Go
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(), "用于连续课程写作")
|
||
|
|
}
|
||
|
|
}
|