Enable Binding-scoped agent push/pull, empty-table schema ensure, SyncPage inspect/drop-table, default module import, and agent-bound publish docs from the 宇恒联调意见. Co-authored-by: Cursor <cursoragent@cursor.com>
78 lines
2.0 KiB
Go
78 lines
2.0 KiB
Go
package dbsync
|
|
|
|
import (
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestEnsureBindingUpsert(t *testing.T) {
|
|
dir := t.TempDir()
|
|
st, err := NewFileStore(filepath.Join(dir, "dbsync"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
b, err := st.EnsureBinding(Binding{
|
|
TenantID: 1,
|
|
LocalDatabaseID: "local-a",
|
|
OnlineDBID: "online-1",
|
|
ChannelID: "ch1",
|
|
DatabaseName: "本地演示库",
|
|
DisplayName: "AI建站智能体API",
|
|
})
|
|
if err != nil || b.ID == "" || b.DisplayName != "AI建站智能体API" {
|
|
t.Fatalf("ensure: %+v err=%v", b, err)
|
|
}
|
|
b2, err := st.EnsureBinding(Binding{
|
|
TenantID: 1,
|
|
LocalDatabaseID: "local-a",
|
|
OnlineDBID: "online-2",
|
|
DisplayName: "线上库B",
|
|
})
|
|
if err != nil || b2.OnlineDBID != "online-2" || b2.ID != b.ID || b2.DisplayName != "线上库B" {
|
|
t.Fatalf("upsert: %+v err=%v", b2, err)
|
|
}
|
|
list, err := st.ListBindings(1, "local-a")
|
|
if err != nil || len(list) != 1 {
|
|
t.Fatalf("list=%d err=%v", len(list), err)
|
|
}
|
|
}
|
|
|
|
func TestUserBindingScope(t *testing.T) {
|
|
dir := t.TempDir()
|
|
st, err := NewFileStore(filepath.Join(dir, "dbsync"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
_, err = st.EnsureBinding(Binding{
|
|
TenantID: 1, UserID: 10,
|
|
LocalDatabaseID: "loc-a", OnlineDBID: "on-a", ChannelID: "ch1",
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
_, err = st.EnsureBinding(Binding{
|
|
TenantID: 1, UserID: 20,
|
|
LocalDatabaseID: "loc-b", OnlineDBID: "on-b", ChannelID: "ch1",
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
mine, err := st.ListBindingsFiltered(1, 10, "")
|
|
if err != nil || len(mine) != 1 || mine[0].OnlineDBID != "on-a" {
|
|
t.Fatalf("filtered: %+v err=%v", mine, err)
|
|
}
|
|
if !st.UserOwnsOnlineDB(1, 10, "ch1", "on-a") {
|
|
t.Fatal("should own on-a")
|
|
}
|
|
if st.UserOwnsOnlineDB(1, 10, "ch1", "on-b") {
|
|
t.Fatal("must not own other's online_db_id")
|
|
}
|
|
if !st.UserCanAccessChannel(1, 10, "ch1") {
|
|
t.Fatal("should access ch1")
|
|
}
|
|
if st.UserCanAccessChannel(1, 10, "ch-other") {
|
|
t.Fatal("must not access unbound channel")
|
|
}
|
|
}
|
|
|