feat(documents): rebuild project document workbench
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/glebarez/sqlite"
|
||||
"github.com/stretchr/testify/require"
|
||||
@@ -37,8 +38,7 @@ func TestSearchHandlerReturnsCamelCaseIdentityResults(t *testing.T) {
|
||||
require.NoError(t, database.Create(&project).Error)
|
||||
task := models.SaTask{ProjectID: project.ID, CreatedBy: owner.ID, Title: "回调任务", Description: "检查签名", Status: "open"}
|
||||
require.NoError(t, database.Create(&task).Error)
|
||||
note := models.SaNote{ProjectID: project.ID, CreatedBy: owner.ID, Title: "接口说明", Markdown: "回调验签流程"}
|
||||
require.NoError(t, database.Create(¬e).Error)
|
||||
document := createSearchDocument(t, database, project.ID, owner.ID, "接口说明.md", "回调验签流程", "", time.Time{})
|
||||
router := searchHandlerTestRouter(owner.ID)
|
||||
req := httptest.NewRequest(http.MethodGet, "/api/v1/search?q=%E5%9B%9E%E8%B0%83", nil)
|
||||
req.Header.Set("Authorization", "Bearer test-token")
|
||||
@@ -65,8 +65,8 @@ func TestSearchHandlerReturnsCamelCaseIdentityResults(t *testing.T) {
|
||||
require.Equal(t, project.Identity, byType["project"]["projectId"])
|
||||
require.Equal(t, task.Identity, byType["task"]["id"])
|
||||
require.Equal(t, project.Identity, byType["task"]["projectId"])
|
||||
require.Equal(t, note.Identity, byType["note"]["id"])
|
||||
require.Equal(t, project.Identity, byType["note"]["projectId"])
|
||||
require.Equal(t, document.Identity, byType["document"]["id"])
|
||||
require.Equal(t, project.Identity, byType["document"]["projectId"])
|
||||
}
|
||||
|
||||
func TestSearchHandlerOnlyReturnsObjectsVisibleToCurrentUser(t *testing.T) {
|
||||
@@ -79,20 +79,17 @@ func TestSearchHandlerOnlyReturnsObjectsVisibleToCurrentUser(t *testing.T) {
|
||||
require.NoError(t, database.Create(&assigned).Error)
|
||||
privateTask := models.SaTask{ProjectID: project.ID, CreatedBy: owner.ID, Title: "检索词私有任务", Status: "open"}
|
||||
require.NoError(t, database.Create(&privateTask).Error)
|
||||
sharedNote := models.SaNote{ProjectID: project.ID, CreatedBy: owner.ID, Title: "检索词共享笔记", Markdown: "已显式分享"}
|
||||
require.NoError(t, database.Create(&sharedNote).Error)
|
||||
privateNote := models.SaNote{ProjectID: project.ID, CreatedBy: owner.ID, Title: "检索词私有笔记", Markdown: "不得泄漏"}
|
||||
require.NoError(t, database.Create(&privateNote).Error)
|
||||
sharedDocument := createSearchDocument(t, database, project.ID, owner.ID, "检索词共享文档.md", "已显式分享", "", time.Time{})
|
||||
privateDocument := createSearchDocument(t, database, project.ID, owner.ID, "检索词私有文档.md", "不得泄漏", "", time.Time{})
|
||||
otherProject := models.SaProject{OwnerID: owner.ID, Name: "其他项目", Identifier: "OTHER"}
|
||||
require.NoError(t, database.Create(&otherProject).Error)
|
||||
crossProjectNote := models.SaNote{ProjectID: otherProject.ID, CreatedBy: owner.ID, Title: "检索词跨项目笔记", Markdown: "伪造分享也不得泄漏"}
|
||||
require.NoError(t, database.Create(&crossProjectNote).Error)
|
||||
crossProjectDocument := createSearchDocument(t, database, otherProject.ID, owner.ID, "检索词跨项目文档.md", "伪造分享也不得泄漏", "", time.Time{})
|
||||
require.NoError(t, database.Create(&models.SaTaskShare{
|
||||
TaskID: assigned.ID, ObjectType: "note", ObjectID: sharedNote.ID,
|
||||
TaskID: assigned.ID, ObjectType: "document", ObjectID: sharedDocument.ID,
|
||||
}).Error)
|
||||
// 即使历史数据绕过服务层写入跨项目分享,搜索也必须在读取边界再次校验项目一致性。
|
||||
require.NoError(t, database.Create(&models.SaTaskShare{
|
||||
TaskID: assigned.ID, ObjectType: "note", ObjectID: crossProjectNote.ID,
|
||||
TaskID: assigned.ID, ObjectType: "document", ObjectID: crossProjectDocument.ID,
|
||||
}).Error)
|
||||
router := searchHandlerTestRouter(viewer.ID)
|
||||
req := httptest.NewRequest(http.MethodGet, "/api/v1/search?q=%E6%A3%80%E7%B4%A2%E8%AF%8D", nil)
|
||||
@@ -111,13 +108,13 @@ func TestSearchHandlerOnlyReturnsObjectsVisibleToCurrentUser(t *testing.T) {
|
||||
}
|
||||
require.NoError(t, json.Unmarshal(rec.Body.Bytes(), &payload))
|
||||
require.Len(t, payload.Items, 2)
|
||||
require.ElementsMatch(t, []string{assigned.Identity, sharedNote.Identity}, []string{payload.Items[0].ID, payload.Items[1].ID})
|
||||
require.ElementsMatch(t, []string{assigned.Identity, sharedDocument.Identity}, []string{payload.Items[0].ID, payload.Items[1].ID})
|
||||
for _, item := range payload.Items {
|
||||
require.Equal(t, project.Identity, item.ProjectID)
|
||||
require.Contains(t, []string{"task", "note"}, item.Type)
|
||||
require.Contains(t, []string{"task", "document"}, item.Type)
|
||||
require.NotEqual(t, privateTask.Identity, item.ID)
|
||||
require.NotEqual(t, privateNote.Identity, item.ID)
|
||||
require.NotEqual(t, crossProjectNote.Identity, item.ID)
|
||||
require.NotEqual(t, privateDocument.Identity, item.ID)
|
||||
require.NotEqual(t, crossProjectDocument.Identity, item.ID)
|
||||
require.NotEqual(t, project.Identity, item.ID)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user