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{ Mid: "aabbccdd00112233", From: proto.PeerID("deadbeef"), Room: "general", Body: "hello world", SentAt: time.Now().UTC().Truncate(time.Second), } 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] if got.Mid != msg.Mid || got.Body != msg.Body || got.Room != msg.Room { 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{ Mid: string(rune('a'+i)) + "000000000000000", From: "deadbeef", Room: "general", Body: string(rune('a' + i)), SentAt: base.Add(time.Duration(i) * time.Second), }) } 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++ { if msgs[i].SentAt.Before(msgs[i-1].SentAt) { t.Fatalf("messages not in ascending order at index %d", i) } } }