feat(documents): rebuild project document workbench
This commit is contained in:
@@ -12,20 +12,20 @@ import (
|
||||
"senlinai-agent/backend/internal/models"
|
||||
)
|
||||
|
||||
func TestSearchFindsNoteBody(t *testing.T) {
|
||||
func TestSearchFindsDocumentBody(t *testing.T) {
|
||||
database, err := gorm.Open(sqlite.Open(fmt.Sprintf("file:%s?mode=memory&cache=shared", t.Name())), &gorm.Config{})
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, models.AutoMigrate(database))
|
||||
models.DBService = database
|
||||
require.NoError(t, database.Create(&models.SaProject{ID: 1, OwnerID: 7, Name: "支付项目"}).Error)
|
||||
require.NoError(t, database.Create(&models.SaNote{ProjectID: 1, CreatedBy: 7, Title: "接口方案", Markdown: "二维码支付回调设计"}).Error)
|
||||
createSearchDocument(t, database, 1, 7, "接口方案.md", "二维码支付回调设计", "", time.Time{})
|
||||
|
||||
service := NewService()
|
||||
results, err := service.Search(7, "回调")
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Len(t, results, 1)
|
||||
require.Equal(t, "note", results[0].Type)
|
||||
require.Equal(t, "document", results[0].Type)
|
||||
}
|
||||
|
||||
func TestSearchAppliesStableFairGlobalLimitAcrossResultTypes(t *testing.T) {
|
||||
@@ -52,13 +52,18 @@ func TestSearchAppliesStableFairGlobalLimitAcrossResultTypes(t *testing.T) {
|
||||
Status: "open",
|
||||
UpdatedAt: baseTime.Add(time.Duration(index) * time.Minute),
|
||||
}).Error)
|
||||
require.NoError(t, database.Create(&models.SaNote{
|
||||
Identity: fmt.Sprintf("00000000-0000-7003-8000-%012d", index),
|
||||
ProjectID: project.ID,
|
||||
CreatedBy: 7,
|
||||
Title: fmt.Sprintf("稳定排序笔记 %02d", index),
|
||||
UpdatedAt: baseTime.Add(time.Duration(index) * time.Minute),
|
||||
}).Error)
|
||||
document := models.SaDocument{
|
||||
Identity: fmt.Sprintf("00000000-0000-7003-8000-%012d", index),
|
||||
ProjectID: project.ID,
|
||||
CreatedBy: 7,
|
||||
Kind: models.DocumentKindFile,
|
||||
Name: fmt.Sprintf("稳定排序文档 %02d.md", index),
|
||||
NormalizedName: fmt.Sprintf("稳定排序文档 %02d.md", index),
|
||||
Extension: ".md",
|
||||
Revision: 1,
|
||||
UpdatedAt: baseTime.Add(time.Duration(index) * time.Minute),
|
||||
}
|
||||
require.NoError(t, database.Create(&document).Error)
|
||||
}
|
||||
|
||||
service := NewService(database)
|
||||
@@ -70,9 +75,9 @@ func TestSearchAppliesStableFairGlobalLimitAcrossResultTypes(t *testing.T) {
|
||||
for _, result := range results {
|
||||
counts[result.Type]++
|
||||
}
|
||||
require.Equal(t, map[string]int{"project": 17, "task": 17, "note": 16}, counts)
|
||||
require.Equal(t, map[string]int{"project": 17, "task": 17, "document": 16}, counts)
|
||||
require.Equal(t,
|
||||
[]string{"project", "task", "note", "project", "task", "note", "project", "task", "note"},
|
||||
[]string{"project", "task", "document", "project", "task", "document", "project", "task", "document"},
|
||||
resultTypes(results[:9]),
|
||||
)
|
||||
require.Equal(t, "00000000-0000-7001-8000-000000000059", results[0].ID)
|
||||
@@ -91,12 +96,7 @@ func TestSearchBoundsChineseSnippetsByRune(t *testing.T) {
|
||||
models.DBService = database
|
||||
project := models.SaProject{OwnerID: 7, Name: "摘要项目", Identifier: "SNIPPET"}
|
||||
require.NoError(t, database.Create(&project).Error)
|
||||
require.NoError(t, database.Create(&models.SaNote{
|
||||
ProjectID: project.ID,
|
||||
CreatedBy: 7,
|
||||
Title: "中文摘要",
|
||||
Markdown: strings.Repeat("森", 300) + "尾",
|
||||
}).Error)
|
||||
createSearchDocument(t, database, project.ID, 7, "中文摘要.md", strings.Repeat("森", 300)+"尾", "", time.Time{})
|
||||
|
||||
results, err := NewService(database).Search(7, "森")
|
||||
require.NoError(t, err)
|
||||
@@ -113,15 +113,14 @@ func resultTypes(results []SearchResultDTO) []string {
|
||||
return types
|
||||
}
|
||||
|
||||
func TestSearchOnlyReturnsNavigableProjectTaskAndNoteResults(t *testing.T) {
|
||||
func TestSearchOnlyReturnsNavigableProjectTaskAndDocumentResults(t *testing.T) {
|
||||
database, err := gorm.Open(sqlite.Open(fmt.Sprintf("file:%s?mode=memory&cache=shared", t.Name())), &gorm.Config{})
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, models.AutoMigrate(database))
|
||||
models.DBService = database
|
||||
require.NoError(t, database.Create(&models.SaProject{ID: 1, OwnerID: 7, Name: "webhook 支付项目"}).Error)
|
||||
require.NoError(t, database.Create(&models.SaTask{ProjectID: 1, CreatedBy: 7, Title: "回调任务", Description: "检查 webhook"}).Error)
|
||||
require.NoError(t, database.Create(&models.SaNote{ProjectID: 1, CreatedBy: 7, Title: "回调笔记", Markdown: "webhook 流程"}).Error)
|
||||
require.NoError(t, database.Create(&models.SaSource{ProjectID: 1, CreatedBy: 7, Kind: "link", Title: "支付文档", URL: "https://example.com/pay", ContentText: "webhook 签名"}).Error)
|
||||
createSearchDocument(t, database, 1, 7, "回调文档.md", "webhook 流程", "", time.Time{})
|
||||
require.NoError(t, database.Create(&models.SaInboxItem{ProjectID: 1, CreatedBy: 7, SourceType: "text", Title: "收集项", Body: "webhook 待整理"}).Error)
|
||||
require.NoError(t, database.Create(&models.SaAISession{ProjectID: 1, CreatedBy: 7, Title: "AI 分析", Context: "webhook 问答"}).Error)
|
||||
|
||||
@@ -133,10 +132,23 @@ func TestSearchOnlyReturnsNavigableProjectTaskAndNoteResults(t *testing.T) {
|
||||
for _, result := range results {
|
||||
types[result.Type] = true
|
||||
}
|
||||
require.Equal(t, map[string]bool{"project": true, "task": true, "note": true}, types)
|
||||
require.Equal(t, map[string]bool{"project": true, "task": true, "document": true}, types)
|
||||
require.Len(t, results, 3)
|
||||
}
|
||||
|
||||
func createSearchDocument(t *testing.T, database *gorm.DB, projectID, userID uint, name, markdown, identity string, updatedAt time.Time) models.SaDocument {
|
||||
t.Helper()
|
||||
document := models.SaDocument{
|
||||
Identity: identity, ProjectID: projectID, CreatedBy: userID, Kind: models.DocumentKindFile,
|
||||
Name: name, NormalizedName: strings.ToLower(name), Extension: ".md",
|
||||
MimeType: "text/markdown", Size: int64(len([]byte(markdown))), Revision: 1,
|
||||
UpdatedAt: updatedAt,
|
||||
}
|
||||
require.NoError(t, database.Create(&document).Error)
|
||||
require.NoError(t, database.Create(&models.SaDocumentContent{DocumentID: document.ID, Markdown: markdown}).Error)
|
||||
return document
|
||||
}
|
||||
|
||||
func TestSearchTreatsLikeWildcardsAsLiteralKeywords(t *testing.T) {
|
||||
database, err := gorm.Open(sqlite.Open(fmt.Sprintf("file:%s?mode=memory&cache=shared", t.Name())), &gorm.Config{})
|
||||
require.NoError(t, err)
|
||||
|
||||
Reference in New Issue
Block a user