Files
MyGoNavi/internal/sync/migration_capability_guard_test.go
Syngnat c91a1555a4 feat(sync): 完善跨数据源迁移与增量同步内核
- 增加迁移能力矩阵、对象字段映射与安全预检守卫
- 支持批大小、行错误隔离、水位增量和变更事件重放
- 复用 CDC 目标会话并补齐分页、投影与增量同步测试
2026-08-08 19:06:12 +08:00

92 lines
3.2 KiB
Go

package sync
import (
"GoNavi-Wails/internal/connection"
"GoNavi-Wails/internal/db"
"errors"
"strings"
"testing"
)
func TestAnalyzeBlocksUnsupportedMigrationBeforeDatabaseInitialization(t *testing.T) {
oldFactory := newSyncDatabase
factoryCalls := 0
newSyncDatabase = func(string) (db.Database, error) {
factoryCalls++
return nil, errors.New("database factory should not be called")
}
defer func() { newSyncDatabase = oldFactory }()
result := NewSyncEngine(Reporter{}).Analyze(SyncConfig{
SourceConfig: connection.ConnectionConfig{Type: "kafka"},
TargetConfig: connection.ConnectionConfig{Type: "qdrant"},
Tables: []string{"events"},
})
if result.Success || factoryCalls != 0 {
t.Fatalf("expected capability guard before database initialization, result=%+v calls=%d", result, factoryCalls)
}
if !strings.Contains(result.Message, "kafka") || !strings.Contains(result.Message, "qdrant") {
t.Fatalf("expected rejected pair in error message, got %q", result.Message)
}
}
func TestRunSyncBlocksUnsupportedMigrationBeforeDatabaseInitialization(t *testing.T) {
oldFactory := newSyncDatabase
factoryCalls := 0
newSyncDatabase = func(string) (db.Database, error) {
factoryCalls++
return nil, errors.New("database factory should not be called")
}
defer func() { newSyncDatabase = oldFactory }()
result := NewSyncEngine(Reporter{}).RunSync(SyncConfig{
SourceConfig: connection.ConnectionConfig{Type: "kafka"},
TargetConfig: connection.ConnectionConfig{Type: "qdrant"},
Tables: []string{"events"},
})
if result.Success || factoryCalls != 0 {
t.Fatalf("expected capability guard before database initialization, result=%+v calls=%d", result, factoryCalls)
}
if !strings.Contains(result.Message, "kafka") || !strings.Contains(result.Message, "qdrant") {
t.Fatalf("expected rejected pair in error message, got %q", result.Message)
}
}
func TestPreviewBlocksPlannedMigrationBeforeDatabaseInitialization(t *testing.T) {
oldFactory := newSyncDatabase
factoryCalls := 0
newSyncDatabase = func(string) (db.Database, error) {
factoryCalls++
return nil, errors.New("database factory should not be called")
}
defer func() { newSyncDatabase = oldFactory }()
_, err := NewSyncEngine(Reporter{}).Preview(SyncConfig{
SourceConfig: connection.ConnectionConfig{Type: "mongodb"},
TargetConfig: connection.ConnectionConfig{Type: "oracle"},
Tables: []string{"documents"},
}, "documents", 20)
if err == nil || factoryCalls != 0 {
t.Fatalf("expected capability guard before database initialization, err=%v calls=%d", err, factoryCalls)
}
if !strings.Contains(err.Error(), "mongodb") || !strings.Contains(err.Error(), "oracle") {
t.Fatalf("expected planned pair in error message, got %q", err.Error())
}
}
func TestValidateMigrationCapabilityLeavesSourceQueryPathToItsOwnValidator(t *testing.T) {
err := ValidateMigrationCapability(SyncConfig{
SourceConfig: connection.ConnectionConfig{Type: "mongodb"},
TargetConfig: connection.ConnectionConfig{Type: "oracle"},
SourceQuery: `{"find":"documents","filter":{}}`,
Tables: []string{"documents"},
})
if err != nil {
t.Fatalf("source-query sync must not be rejected by the table-pair guard: %v", err)
}
}