Files
go-sip/internal/store/ai_mq_test.go
T

70 lines
1.9 KiB
Go

package store
import (
"path/filepath"
"testing"
"time"
"git.ipao.vip/rogee/go-sip/contracts"
"git.ipao.vip/rogee/go-sip/internal/contract"
"git.ipao.vip/rogee/go-sip/internal/tenant"
)
func TestAIConfigurationMQRequestAndSnapshotSurviveRestart(t *testing.T) {
path := filepath.Join(t.TempDir(), "state.db")
s, err := Open(path)
if err != nil {
t.Fatal(err)
}
defer func() { s.Close() }()
if err := s.BindDispatcherID(identityA); err != nil {
t.Fatal(err)
}
now := time.Date(2026, 9, 21, 0, 0, 1, 0, time.UTC)
s.now = func() time.Time { return now }
base := "upstream/" + contract.MQSourceCommit + "/examples/"
request, err := contracts.Files.ReadFile(base + "ai-config-request.json")
if err != nil {
t.Fatal(err)
}
if err := s.QueueAIConfigRequest(request); err != nil {
t.Fatal(err)
}
if err := s.QueueAIConfigRequest(request); err != nil {
t.Fatal(err)
}
var count int
if err := s.DB().QueryRow(`SELECT COUNT(*) FROM outbox`).Scan(&count); err != nil || count != 1 {
t.Fatalf("request count=%d err=%v", count, err)
}
raw := validAIReply(t, now)
route, err := tenant.NewDispatcherRoute(identityA, "tenant-a")
if err != nil {
t.Fatal(err)
}
if err := s.StoreAIConfigResponse(raw, route.InboundKey); err != nil {
t.Fatal(err)
}
if err := s.Close(); err != nil {
t.Fatal(err)
}
s, err = Open(path)
if err != nil {
t.Fatal(err)
}
s.now = func() time.Time { return now.Add(time.Hour) }
if err := s.StoreAIConfigResponse(raw, route.InboundKey); err != nil {
t.Fatalf("known reply revalidated as new expired response: %v", err)
}
snapshot, err := s.LoadAIConfig("tenant-a", "tenant-a", "version-a")
if err != nil {
t.Fatal(err)
}
if snapshot.AgentVersionID != "version-a" || snapshot.TenantKey != "tenant-a" {
t.Fatal("recovered snapshot lost tenant/version")
}
if _, err := s.LoadAIConfig("another-tenant", "tenant-a", "version-a"); err == nil {
t.Fatal("cross-tenant snapshot access")
}
}