Files
knowledge-governance/cmd/libraryctl/discover_test.go
T
姚章浩 4d6ecda310
build / build (push) Successful in 1m13s
feat(libraryctl): 源对象存储端点可按宿主机地址覆盖
容器 env 里的 MINIO_ENDPOINT 往往是服务名(langfuse-minio:9000),封存跑在宿主机上
解析不到,真实封存报 read library resource 并整体失败。
新增 -source-s3-endpoint:只换访问入口,桶与对象键不变;缺 scheme 直接拒绝;
status 会打印实际使用的 endpoint。

试过:make verify 15 项全绿;新增覆盖用例(生效 + 拒绝无 scheme)。
2026-10-29 06:09:56 +08:00

94 lines
3.7 KiB
Go

package main
import (
"strings"
"testing"
)
// 目标实例可以是 OSS,也可以是 S3 兼容的 MinIO(本机专用验收实例就是 minio)。
// 只认 oss 时,任何 minio 目标都会在发现阶段直接失败,等于这条验收链只能在生产存储上跑。
func TestObjectStoreFromSourceEnvAcceptsMinIO(t *testing.T) {
app := map[string]string{
"STORAGE_TYPE": "minio",
"MINIO_ENDPOINT": "langfuse-minio:9000",
"MINIO_USE_SSL": "false",
"MINIO_ACCESS_KEY_ID": "key",
"MINIO_SECRET_ACCESS_KEY": "secret",
"MINIO_BUCKET_NAME": "kgmaint-1028a",
"MINIO_PATH_PREFIX": "kgmaint/",
}
config, detail, err := objectStoreFromSourceEnv(app, "", 1<<20)
if err != nil {
t.Fatalf("minio: %v", err)
}
if config.Provider != "minio" || config.Endpoint != "http://langfuse-minio:9000" || config.Secure {
t.Fatalf("config: %+v", config)
}
if config.Bucket != "kgmaint-1028a" || config.AccessKeyID != "key" || config.SecretAccessKey != "secret" {
t.Fatalf("credentials mapping: %+v", config)
}
if detail == "" || config.MaxObjectBytes != 1<<20 {
t.Fatalf("detail=%q max=%d", detail, config.MaxObjectBytes)
}
}
// 容器里的 minio 服务名在宿主机上解析不到:真跑时资源导出会失败(read library resource)。
// 覆盖只换访问入口(同一个桶),不换来源;没有 scheme 的覆盖直接拒绝。
func TestObjectStoreFromSourceEnvOverridesEndpointForHostSideCapture(t *testing.T) {
app := map[string]string{
"STORAGE_TYPE": "minio", "MINIO_ENDPOINT": "langfuse-minio:9000", "MINIO_USE_SSL": "false",
"MINIO_ACCESS_KEY_ID": "key", "MINIO_SECRET_ACCESS_KEY": "secret",
"MINIO_BUCKET_NAME": "kgmaint-1028a", "MINIO_PATH_PREFIX": "kgmaint/",
}
config, detail, err := objectStoreFromSourceEnv(app, "http://127.0.0.1:19100", 1<<20)
if err != nil {
t.Fatalf("override: %v", err)
}
if config.Endpoint != "http://127.0.0.1:19100" || config.Bucket != "kgmaint-1028a" {
t.Fatalf("覆盖后配置不对:%+v", config)
}
if !strings.Contains(detail, "endpoint=http://127.0.0.1:19100") {
t.Fatalf("状态里没有如实写出用的端点:%q", detail)
}
if _, _, err := objectStoreFromSourceEnv(app, "127.0.0.1:19100", 1<<20); err == nil {
t.Fatal("没有 scheme 的端点覆盖被接受了")
}
}
func TestObjectStoreFromSourceEnvAcceptsMinIOOverTLS(t *testing.T) {
app := map[string]string{
"STORAGE_TYPE": "minio", "MINIO_ENDPOINT": "minio.internal:9000", "MINIO_USE_SSL": "true",
"MINIO_ACCESS_KEY": "k2", "MINIO_SECRET_KEY": "s2", "MINIO_BUCKET_NAME": "bucket",
}
config, _, err := objectStoreFromSourceEnv(app, "", 1)
if err != nil {
t.Fatalf("minio tls: %v", err)
}
if !config.Secure || config.Endpoint != "https://minio.internal:9000" || config.AccessKeyID != "k2" {
t.Fatalf("config: %+v", config)
}
}
func TestObjectStoreFromSourceEnvKeepsOSS(t *testing.T) {
app := map[string]string{
"STORAGE_TYPE": "oss", "OSS_ENDPOINT": "oss-cn-shenzhen.aliyuncs.com", "OSS_REGION": "cn-shenzhen",
"OSS_ACCESS_KEY": "ak", "OSS_SECRET_KEY": "sk", "OSS_BUCKET_NAME": "prod",
}
config, _, err := objectStoreFromSourceEnv(app, "", 1)
if err != nil {
t.Fatalf("oss: %v", err)
}
if config.Provider != "oss" || config.Endpoint != "https://oss-cn-shenzhen.aliyuncs.com" || !config.Secure {
t.Fatalf("config: %+v", config)
}
}
func TestObjectStoreFromSourceEnvRejectsUnknownStorage(t *testing.T) {
if _, _, err := objectStoreFromSourceEnv(map[string]string{"STORAGE_TYPE": "cos"}, "", 1); err == nil {
t.Fatal("expected error for unsupported storage type")
}
if _, _, err := objectStoreFromSourceEnv(map[string]string{"STORAGE_TYPE": "minio"}, "", 1); err == nil {
t.Fatal("expected error when minio endpoint is missing")
}
}