mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-08-15 11:14:31 +08:00
- 接入任务持久化、生命周期、调度运行与检查点管理 - 提供 ID 作用域元数据、能力解析、预检和生产审批接口 - 串联水位与 MongoDB CDC 执行、错误行隔离及安全重放
67 lines
2.1 KiB
Go
67 lines
2.1 KiB
Go
package app
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"GoNavi-Wails/internal/connection"
|
|
syncbackend "GoNavi-Wails/internal/sync"
|
|
)
|
|
|
|
func TestDataSyncMetadataMethodsRequireSavedConnectionIDs(t *testing.T) {
|
|
application := NewAppWithSecretStore(newFakeAppSecretStore())
|
|
application.configDir = t.TempDir()
|
|
|
|
for name, result := range map[string]connection.QueryResult{
|
|
"databases": application.DataSyncDatabaseList(""),
|
|
"objects": application.DataSyncObjectList("", "", ""),
|
|
"fields": application.DataSyncFieldList("", "", "", "orders"),
|
|
"capability": application.DataSyncCapabilityResolve("", "", "", "target", "", ""),
|
|
} {
|
|
if result.Success {
|
|
t.Fatalf("%s metadata request unexpectedly succeeded", name)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestDataSyncCapabilityResolveUsesSavedConnectionsWithoutReturningSecrets(t *testing.T) {
|
|
application := NewAppWithSecretStore(newFakeAppSecretStore())
|
|
application.configDir = t.TempDir()
|
|
for _, input := range []connection.SavedConnectionInput{
|
|
{
|
|
ID: "source",
|
|
Name: "Source",
|
|
Config: connection.ConnectionConfig{
|
|
ID: "source", Type: "postgres", Host: "source.internal", Password: "source-secret",
|
|
},
|
|
},
|
|
{
|
|
ID: "target",
|
|
Name: "Target",
|
|
Config: connection.ConnectionConfig{
|
|
ID: "target", Type: "mysql", Host: "target.internal", Password: "target-secret",
|
|
},
|
|
},
|
|
} {
|
|
if _, err := application.SaveConnection(input); err != nil {
|
|
t.Fatalf("save connection %s: %v", input.ID, err)
|
|
}
|
|
}
|
|
|
|
result := application.DataSyncCapabilityResolve("source", "sales", "public", "target", "warehouse", "")
|
|
if !result.Success {
|
|
t.Fatalf("capability resolution failed: %s", result.Message)
|
|
}
|
|
capability, ok := result.Data.(syncbackend.MigrationCapability)
|
|
if !ok {
|
|
t.Fatalf("capability response type = %T", result.Data)
|
|
}
|
|
if capability.SourceType != "postgres" || capability.TargetType != "mysql" {
|
|
t.Fatalf("unexpected capability route: %#v", capability)
|
|
}
|
|
encoded := string(mustJSON(result.Data))
|
|
if strings.Contains(encoded, "source-secret") || strings.Contains(encoded, "target-secret") {
|
|
t.Fatal("capability response leaked a saved connection secret")
|
|
}
|
|
}
|