get-serials-by-range_test.go raw

   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