mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-05-12 07:39:40 +08:00
- 金仓外置驱动链路增加表名与变更字段归一化,修复 ApplyChanges 场景下双引号转义异常导致的 SQL 语法错误 - 新增金仓公共标识符工具并复用到 kingbase_impl 与 optional_driver_agent_impl,统一处理多重转义、schema.table 拆分与引用规范 - 金仓代理连接后自动探测并设置 search_path,降低查询时必须手写 schema 前缀的概率 - MongoDB 连接参数改为显式 host/hosts 优先,避免被 URI 中 localhost 覆盖;代理链路保留目标地址不再改写为本地地址 - 连接测试增加前后端超时收敛与日志增强,避免长时间转圈;连接错误文案在未启用 TLS 时移除误导性的“SSL”前缀 - 统一日志级别为 INFO/WARN/ERROR,默认日志目录收敛到 ~/.GoNavi/Logs,并补充驱动构建脚本 build-driver-agents.sh
85 lines
2.6 KiB
Go
85 lines
2.6 KiB
Go
package app
|
||
|
||
import (
|
||
"errors"
|
||
"os"
|
||
"path/filepath"
|
||
"strings"
|
||
"testing"
|
||
|
||
"GoNavi-Wails/internal/connection"
|
||
)
|
||
|
||
func TestWrapConnectError_MongoNoSSL_RemovesMisleadingSSLLabel(t *testing.T) {
|
||
config := connection.ConnectionConfig{
|
||
Type: "mongodb",
|
||
UseSSL: false,
|
||
}
|
||
sourceErr := errors.New("MongoDB 连接失败:SSL 主库凭据验证失败: mock error")
|
||
|
||
wrapped := wrapConnectError(config, sourceErr)
|
||
text := wrapped.Error()
|
||
if strings.Contains(text, "SSL 主库凭据") {
|
||
t.Fatalf("expected ssl label to be removed when TLS disabled, got: %s", text)
|
||
}
|
||
if !strings.Contains(text, "主库凭据验证失败") {
|
||
t.Fatalf("expected auth label to remain, got: %s", text)
|
||
}
|
||
}
|
||
|
||
func TestWrapConnectError_MongoURIForcesTLS_KeepsSSLLabel(t *testing.T) {
|
||
config := connection.ConnectionConfig{
|
||
Type: "mongodb",
|
||
UseSSL: false,
|
||
URI: "mongodb://user:pass@127.0.0.1:27017/admin?tls=true",
|
||
}
|
||
sourceErr := errors.New("MongoDB 连接失败:SSL 主库凭据验证失败: mock error")
|
||
|
||
wrapped := wrapConnectError(config, sourceErr)
|
||
text := wrapped.Error()
|
||
if !strings.Contains(text, "SSL 主库凭据") {
|
||
t.Fatalf("expected ssl label to remain when URI enables TLS, got: %s", text)
|
||
}
|
||
}
|
||
|
||
func TestWrapConnectError_MongoSRVDefaultTLS_KeepsSSLLabel(t *testing.T) {
|
||
config := connection.ConnectionConfig{
|
||
Type: "mongodb",
|
||
UseSSL: false,
|
||
URI: "mongodb+srv://user:pass@cluster0.example.com/admin",
|
||
}
|
||
sourceErr := errors.New("MongoDB 连接失败:SSL 主库凭据验证失败: mock error")
|
||
|
||
wrapped := wrapConnectError(config, sourceErr)
|
||
text := wrapped.Error()
|
||
if !strings.Contains(text, "SSL 主库凭据") {
|
||
t.Fatalf("expected ssl label to remain for mongodb+srv default TLS, got: %s", text)
|
||
}
|
||
}
|
||
|
||
func TestWithLogHintError_OmitEmptyLogPath(t *testing.T) {
|
||
dir := t.TempDir()
|
||
logPath := filepath.Join(dir, "gonavi.log")
|
||
if err := os.WriteFile(logPath, nil, 0o644); err != nil {
|
||
t.Fatalf("write empty log failed: %v", err)
|
||
}
|
||
err := withLogHint{err: errors.New("连接失败"), logPath: logPath}
|
||
text := err.Error()
|
||
if strings.Contains(text, "详细日志:") {
|
||
t.Fatalf("expected no log hint for empty file, got: %s", text)
|
||
}
|
||
}
|
||
|
||
func TestWithLogHintError_IncludeNonEmptyLogPath(t *testing.T) {
|
||
dir := t.TempDir()
|
||
logPath := filepath.Join(dir, "gonavi.log")
|
||
if err := os.WriteFile(logPath, []byte("log entry\n"), 0o644); err != nil {
|
||
t.Fatalf("write log failed: %v", err)
|
||
}
|
||
err := withLogHint{err: errors.New("连接失败"), logPath: logPath}
|
||
text := err.Error()
|
||
if !strings.Contains(text, "详细日志:"+logPath) {
|
||
t.Fatalf("expected log hint with path, got: %s", text)
|
||
}
|
||
}
|