2026-06-21 18:04:42 +02:00
|
|
|
package store
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"path/filepath"
|
|
|
|
|
"testing"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"github.com/waste-go/internal/proto"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestRoundTrip(t *testing.T) {
|
|
|
|
|
st, err := Open(filepath.Join(t.TempDir(), "test.db"))
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("Open: %v", err)
|
|
|
|
|
}
|
|
|
|
|
defer st.Close()
|
|
|
|
|
|
|
|
|
|
msg := &proto.ChatMessage{
|
2026-06-22 11:38:01 +02:00
|
|
|
Mid: "aabbccdd00112233",
|
|
|
|
|
From: proto.PeerID("deadbeef"),
|
|
|
|
|
Room: "general",
|
|
|
|
|
Text: "hello world",
|
|
|
|
|
Ts: time.Now().UTC().Truncate(time.Second).UnixMilli(),
|
2026-06-21 18:04:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := st.SaveMessage(msg); err != nil {
|
|
|
|
|
t.Fatalf("SaveMessage: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Duplicate mid must be silently ignored.
|
|
|
|
|
if err := st.SaveMessage(msg); err != nil {
|
|
|
|
|
t.Fatalf("duplicate SaveMessage: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
msgs, err := st.RecentMessages("general", 10)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("RecentMessages: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if len(msgs) != 1 {
|
|
|
|
|
t.Fatalf("got %d messages, want 1", len(msgs))
|
|
|
|
|
}
|
|
|
|
|
got := msgs[0]
|
2026-06-22 11:38:01 +02:00
|
|
|
if got.Mid != msg.Mid || got.Text != msg.Text || got.Room != msg.Room {
|
2026-06-21 18:04:42 +02:00
|
|
|
t.Fatalf("message mismatch: %+v", got)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestSavePeerAndKnownPeers(t *testing.T) {
|
|
|
|
|
st, err := Open(filepath.Join(t.TempDir(), "test.db"))
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("Open: %v", err)
|
|
|
|
|
}
|
|
|
|
|
defer st.Close()
|
|
|
|
|
|
|
|
|
|
if err := st.SavePeer("aabbccdd", "alice"); err != nil {
|
|
|
|
|
t.Fatalf("SavePeer: %v", err)
|
|
|
|
|
}
|
|
|
|
|
// Upsert with updated alias.
|
|
|
|
|
if err := st.SavePeer("aabbccdd", "alice-updated"); err != nil {
|
|
|
|
|
t.Fatalf("SavePeer upsert: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
peers, err := st.KnownPeers()
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("KnownPeers: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if peers["aabbccdd"] != "alice-updated" {
|
|
|
|
|
t.Fatalf("alias = %q, want %q", peers["aabbccdd"], "alice-updated")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestRecentMessagesOrdering(t *testing.T) {
|
|
|
|
|
st, err := Open(filepath.Join(t.TempDir(), "test.db"))
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("Open: %v", err)
|
|
|
|
|
}
|
|
|
|
|
defer st.Close()
|
|
|
|
|
|
|
|
|
|
base := time.Now().UTC().Truncate(time.Second)
|
|
|
|
|
for i := range 5 {
|
|
|
|
|
st.SaveMessage(&proto.ChatMessage{
|
2026-06-22 11:38:01 +02:00
|
|
|
Mid: string(rune('a'+i)) + "000000000000000",
|
|
|
|
|
From: "deadbeef",
|
|
|
|
|
Room: "general",
|
|
|
|
|
Text: string(rune('a' + i)),
|
|
|
|
|
Ts: base.Add(time.Duration(i) * time.Second).UnixMilli(),
|
2026-06-21 18:04:42 +02:00
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
msgs, err := st.RecentMessages("general", 10)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("RecentMessages: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if len(msgs) != 5 {
|
|
|
|
|
t.Fatalf("got %d messages, want 5", len(msgs))
|
|
|
|
|
}
|
|
|
|
|
// Must be oldest-first.
|
|
|
|
|
for i := 1; i < len(msgs); i++ {
|
2026-06-22 11:38:01 +02:00
|
|
|
if msgs[i].Ts < msgs[i-1].Ts {
|
2026-06-21 18:04:42 +02:00
|
|
|
t.Fatalf("messages not in ascending order at index %d", i)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|