Files
MyGoNavi/internal/app/methods_sync_metadata_test.go
Syngnat 11dbb1f9dd feat(sync): 接入同步任务编排与安全执行 API
- 接入任务持久化、生命周期、调度运行与检查点管理
- 提供 ID 作用域元数据、能力解析、预检和生产审批接口
- 串联水位与 MongoDB CDC 执行、错误行隔离及安全重放
2026-08-08 19:13:25 +08:00

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")
}
}