1 package database
2 3 import (
4 "testing"
5 6 "next.orly.dev/pkg/nostr/encoders/filter"
7 "next.orly.dev/pkg/nostr/encoders/kind"
8 "next.orly.dev/pkg/nostr/encoders/tag"
9 "next.orly.dev/pkg/nostr/encoders/timestamp"
10 "next.orly.dev/pkg/utils"
11 )
12 13 func TestGetSerialsByRange(t *testing.T) {
14 // Use shared database (skips in short mode)
15 db, _ := GetSharedDB(t)
16 savedEvents := GetSharedEvents(t)
17 18 if len(savedEvents) < 10 {
19 t.Fatalf("Need at least 10 saved events, got %d", len(savedEvents))
20 }
21 22 // Test GetSerialsByRange with a time range filter
23 // Use the timestamp from the middle event as a reference
24 middleIndex := len(savedEvents) / 2
25 middleEvent := savedEvents[middleIndex]
26 27 // Create a timestamp range that includes events before and after the middle event
28 sinceTime := new(timestamp.T)
29 sinceTime.V = middleEvent.CreatedAt - 3600 // 1 hour before middle event
30 31 untilTime := new(timestamp.T)
32 untilTime.V = middleEvent.CreatedAt + 3600 // 1 hour after middle event
33 34 // Create a filter with the time range
35 timeFilter := &filter.F{
36 Since: sinceTime,
37 Until: untilTime,
38 }
39 40 // Get the indexes from the filter
41 ranges, err := GetIndexesFromFilter(timeFilter)
42 if err != nil {
43 t.Fatalf("Failed to get indexes from filter: %v", err)
44 }
45 46 // Verify we got at least one range
47 if len(ranges) == 0 {
48 t.Fatal("Expected at least one range from filter, but got none")
49 }
50 51 // Test GetSerialsByRange with the first range
52 serials, err := db.GetSerialsByRange(ranges[0])
53 if err != nil {
54 t.Fatalf("Failed to get serials by range: %v", err)
55 }
56 57 // Verify we got results
58 if len(serials) == 0 {
59 t.Fatal("Expected serials for events in time range, but got none")
60 }
61 62 // Verify the serials correspond to events within the time range
63 for i, serial := range serials {
64 // Fetch the event using the serial
65 ev, err := db.FetchEventBySerial(serial)
66 if err != nil {
67 t.Fatalf("Failed to fetch event for serial %d: %v", i, err)
68 }
69 70 if ev.CreatedAt < sinceTime.V || ev.CreatedAt > untilTime.V {
71 t.Fatalf(
72 "Event %d is outside the time range. Got %d, expected between %d and %d",
73 i, ev.CreatedAt, sinceTime.V, untilTime.V,
74 )
75 }
76 }
77 78 // Test GetSerialsByRange with a kind filter
79 testKind := kind.New(1) // Kind 1 is typically text notes
80 kindFilter := &filter.F{
81 Kinds: kind.NewS(testKind),
82 }
83 84 // Get the indexes from the filter
85 ranges, err = GetIndexesFromFilter(kindFilter)
86 if err != nil {
87 t.Fatalf("Failed to get indexes from filter: %v", err)
88 }
89 90 // Verify we got at least one range
91 if len(ranges) == 0 {
92 t.Fatal("Expected at least one range from filter, but got none")
93 }
94 95 // Test GetSerialsByRange with the first range
96 serials, err = db.GetSerialsByRange(ranges[0])
97 if err != nil {
98 t.Fatalf("Failed to get serials by range: %v", err)
99 }
100 101 // Verify we got results
102 if len(serials) == 0 {
103 t.Fatal("Expected serials for events with kind 1, but got none")
104 }
105 106 // Verify the serials correspond to events with the correct kind
107 for i, serial := range serials {
108 // Fetch the event using the serial
109 ev, err := db.FetchEventBySerial(serial)
110 if err != nil {
111 t.Fatalf("Failed to fetch event for serial %d: %v", i, err)
112 }
113 114 if ev.Kind != testKind.K {
115 t.Fatalf(
116 "Event %d has incorrect kind. Got %d, expected %d",
117 i, ev.Kind, testKind.K,
118 )
119 }
120 }
121 122 // Test GetSerialsByRange with an author filter
123 authorFilter := &filter.F{
124 Authors: tag.NewFromBytesSlice(savedEvents[1].Pubkey),
125 }
126 127 // Get the indexes from the filter
128 ranges, err = GetIndexesFromFilter(authorFilter)
129 if err != nil {
130 t.Fatalf("Failed to get indexes from filter: %v", err)
131 }
132 133 // Verify we got at least one range
134 if len(ranges) == 0 {
135 t.Fatal("Expected at least one range from filter, but got none")
136 }
137 138 // Test GetSerialsByRange with the first range
139 serials, err = db.GetSerialsByRange(ranges[0])
140 if err != nil {
141 t.Fatalf("Failed to get serials by range: %v", err)
142 }
143 144 // Verify we got results
145 if len(serials) == 0 {
146 t.Fatal("Expected serials for events from author, but got none")
147 }
148 149 // Verify the serials correspond to events with the correct author
150 for i, serial := range serials {
151 // Fetch the event using the serial
152 ev, err := db.FetchEventBySerial(serial)
153 if err != nil {
154 t.Fatalf("Failed to fetch event for serial %d: %v", i, err)
155 }
156 157 if !utils.FastEqual(ev.Pubkey, savedEvents[1].Pubkey) {
158 t.Fatalf(
159 "Event %d has incorrect author. Got %x, expected %x",
160 i, ev.Pubkey, savedEvents[1].Pubkey,
161 )
162 }
163 }
164 }
165