mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-06-29 15:31:05 +08:00
### What problem does this PR solve? As title ``` /api/v1/datasets/<dataset_id>/documents/<document_id>/metadata/config PUT ``` ### Type of change - [x] New Feature (non-breaking change which adds functionality) Co-authored-by: Yingfeng <yingfeng.zhang@gmail.com>
159 lines
4.7 KiB
Go
159 lines
4.7 KiB
Go
//
|
|
// Copyright 2026 The InfiniFlow Authors. All Rights Reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
|
|
package service
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"ragflow/internal/common"
|
|
"ragflow/internal/dao"
|
|
"ragflow/internal/entity"
|
|
)
|
|
|
|
func testDatasetServiceForDocumentMetadataConfig(t *testing.T) *DatasetService {
|
|
t.Helper()
|
|
return &DatasetService{
|
|
kbDAO: dao.NewKnowledgebaseDAO(),
|
|
documentDAO: dao.NewDocumentDAO(),
|
|
}
|
|
}
|
|
|
|
func insertDatasetMetadataConfigKB(t *testing.T, datasetID, tenantID string) {
|
|
t.Helper()
|
|
kb := &entity.Knowledgebase{
|
|
ID: datasetID,
|
|
TenantID: tenantID,
|
|
Name: "test-kb",
|
|
EmbdID: "embedding@OpenAI",
|
|
CreatedBy: tenantID,
|
|
Permission: string(entity.TenantPermissionMe),
|
|
ParserID: "naive",
|
|
ParserConfig: entity.JSONMap{},
|
|
Status: sptr("1"),
|
|
}
|
|
if err := dao.DB.Create(kb).Error; err != nil {
|
|
t.Fatalf("insert test kb: %v", err)
|
|
}
|
|
}
|
|
|
|
func insertDatasetMetadataConfigDoc(t *testing.T, docID, datasetID string, parserConfig entity.JSONMap) {
|
|
t.Helper()
|
|
doc := &entity.Document{
|
|
ID: docID,
|
|
KbID: datasetID,
|
|
ParserID: "naive",
|
|
ParserConfig: parserConfig,
|
|
SourceType: "local",
|
|
Type: "pdf",
|
|
CreatedBy: "user-1",
|
|
Suffix: ".pdf",
|
|
Status: sptr("1"),
|
|
}
|
|
if err := dao.DB.Create(doc).Error; err != nil {
|
|
t.Fatalf("insert test doc: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestDatasetServiceUpdateDocumentMetadataConfig(t *testing.T) {
|
|
db := setupServiceTestDB(t)
|
|
pushServiceDB(t, db)
|
|
insertDatasetMetadataConfigKB(t, "kb-1", "user-1")
|
|
insertDatasetMetadataConfigDoc(t, "doc-1", "kb-1", entity.JSONMap{"pages": []interface{}{1, 2}})
|
|
|
|
metadata := map[string]interface{}{"author": "Alice", "year": float64(2026)}
|
|
doc, code, err := testDatasetServiceForDocumentMetadataConfig(t).UpdateDocumentMetadataConfig(
|
|
"user-1",
|
|
"kb-1",
|
|
"doc-1",
|
|
map[string]interface{}{"metadata": metadata},
|
|
)
|
|
if err != nil {
|
|
t.Fatalf("UpdateDocumentMetadataConfig failed: %v", err)
|
|
}
|
|
if code != common.CodeSuccess {
|
|
t.Fatalf("expected success code, got %d", code)
|
|
}
|
|
if doc == nil {
|
|
t.Fatal("expected updated document")
|
|
}
|
|
if doc.ParserConfig["pages"] == nil {
|
|
t.Fatalf("existing parser_config fields should be preserved: %#v", doc.ParserConfig)
|
|
}
|
|
|
|
updatedMetadata, ok := doc.ParserConfig["metadata"].(map[string]interface{})
|
|
if !ok {
|
|
t.Fatalf("expected metadata map, got %#v", doc.ParserConfig["metadata"])
|
|
}
|
|
if updatedMetadata["author"] != "Alice" || updatedMetadata["year"] != float64(2026) {
|
|
t.Fatalf("unexpected metadata: %#v", updatedMetadata)
|
|
}
|
|
|
|
persisted, err := dao.NewDocumentDAO().GetByID("doc-1")
|
|
if err != nil {
|
|
t.Fatalf("failed to fetch persisted document: %v", err)
|
|
}
|
|
if persisted.ParserConfig["metadata"] == nil {
|
|
t.Fatalf("metadata was not persisted: %#v", persisted.ParserConfig)
|
|
}
|
|
}
|
|
|
|
func TestDatasetServiceUpdateDocumentMetadataConfigRequiresMetadata(t *testing.T) {
|
|
db := setupServiceTestDB(t)
|
|
pushServiceDB(t, db)
|
|
insertDatasetMetadataConfigKB(t, "kb-1", "user-1")
|
|
insertDatasetMetadataConfigDoc(t, "doc-1", "kb-1", entity.JSONMap{})
|
|
|
|
_, code, err := testDatasetServiceForDocumentMetadataConfig(t).UpdateDocumentMetadataConfig(
|
|
"user-1",
|
|
"kb-1",
|
|
"doc-1",
|
|
map[string]interface{}{},
|
|
)
|
|
if err == nil {
|
|
t.Fatal("expected metadata required error")
|
|
}
|
|
if code != common.CodeArgumentError {
|
|
t.Fatalf("expected argument error code, got %d", code)
|
|
}
|
|
if err.Error() != "metadata is required" {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestDatasetServiceUpdateDocumentMetadataConfigRejectsNonOwner(t *testing.T) {
|
|
db := setupServiceTestDB(t)
|
|
pushServiceDB(t, db)
|
|
insertDatasetMetadataConfigKB(t, "kb-1", "owner-1")
|
|
insertDatasetMetadataConfigDoc(t, "doc-1", "kb-1", entity.JSONMap{})
|
|
|
|
_, code, err := testDatasetServiceForDocumentMetadataConfig(t).UpdateDocumentMetadataConfig(
|
|
"user-1",
|
|
"kb-1",
|
|
"doc-1",
|
|
map[string]interface{}{"metadata": map[string]interface{}{"author": "Alice"}},
|
|
)
|
|
if err == nil {
|
|
t.Fatal("expected ownership error")
|
|
}
|
|
if code != common.CodeDataError {
|
|
t.Fatalf("expected data error code, got %d", code)
|
|
}
|
|
if err.Error() != "You don't own the dataset." {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
}
|