forked from kevin/meshtastic_mqtt_server
88 lines
2.1 KiB
Go
88 lines
2.1 KiB
Go
package conversation
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"meshtastic_mqtt_server/internal/message"
|
|
)
|
|
|
|
func newTestStore(t *testing.T) *Store {
|
|
t.Helper()
|
|
return NewStore(t.TempDir())
|
|
}
|
|
|
|
func TestGetOrCreateForBotPeerIsolation(t *testing.T) {
|
|
s := newTestStore(t)
|
|
|
|
convA, err := s.GetOrCreateForBot(1, "bot1", "nodeA")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
convB, err := s.GetOrCreateForBot(1, "bot1", "nodeB")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if convA.ID == convB.ID {
|
|
t.Fatal("different peers must get different conversations")
|
|
}
|
|
if convA.PeerNodeID != "nodeA" || convB.PeerNodeID != "nodeB" {
|
|
t.Fatalf("peer ids not set: %q %q", convA.PeerNodeID, convB.PeerNodeID)
|
|
}
|
|
|
|
// 再次获取应命中同一会话(内容互不可见)。
|
|
convA2, err := s.GetOrCreateForBot(1, "bot1", "nodeA")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if convA2.ID != convA.ID {
|
|
t.Fatalf("peer A should reuse its conversation, got %s want %s", convA2.ID, convA.ID)
|
|
}
|
|
|
|
// 不同 bot 的会话互不影响。
|
|
convOtherBot, err := s.GetOrCreateForBot(2, "bot2", "nodeA")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if convOtherBot.ID == convA.ID {
|
|
t.Fatal("different bots must get different conversations")
|
|
}
|
|
}
|
|
|
|
func TestGetOrCreateForBotLegacyNoPeer(t *testing.T) {
|
|
s := newTestStore(t)
|
|
c1, err := s.GetOrCreateForBot(1, "bot1", "")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
c2, err := s.GetOrCreateForBot(1, "bot1", "")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if c1.ID != c2.ID {
|
|
t.Fatal("no-peer callers should share the most recent conversation")
|
|
}
|
|
}
|
|
|
|
func TestAddMessageHistoryCap(t *testing.T) {
|
|
s := newTestStore(t)
|
|
conv, err := s.GetOrCreateForBot(1, "bot1", "nodeA")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for i := 0; i < 120; i++ {
|
|
if err := s.AddMessage(conv.ID, message.ChatMessage{Role: "user", Content: "m"}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
conv, err = s.Get(conv.ID)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(conv.Messages) != maxConversationMessages {
|
|
t.Fatalf("history must be capped at %d, got %d", maxConversationMessages, len(conv.Messages))
|
|
}
|
|
if conv.Messages[0].Content != "m" || conv.Messages[len(conv.Messages)-1].Content != "m" {
|
|
t.Fatal("messages content intact")
|
|
}
|
|
}
|