eventstore tests.
This commit is contained in:
@@ -5,12 +5,12 @@ import (
|
||||
"cmp"
|
||||
"fmt"
|
||||
"iter"
|
||||
"slices"
|
||||
"sync"
|
||||
|
||||
"fiatjaf.com/nostr"
|
||||
"fiatjaf.com/nostr/eventstore"
|
||||
"fiatjaf.com/nostr/eventstore/internal"
|
||||
"golang.org/x/exp/slices"
|
||||
)
|
||||
|
||||
var _ eventstore.Store = (*SliceStore)(nil)
|
||||
@@ -80,6 +80,13 @@ func (b *SliceStore) CountEvents(filter nostr.Filter) (uint32, error) {
|
||||
}
|
||||
|
||||
func (b *SliceStore) SaveEvent(evt nostr.Event) error {
|
||||
b.Lock()
|
||||
defer b.Unlock()
|
||||
|
||||
return b.save(evt)
|
||||
}
|
||||
|
||||
func (b *SliceStore) save(evt nostr.Event) error {
|
||||
idx, found := slices.BinarySearchFunc(b.internal, evt, eventComparator)
|
||||
if found {
|
||||
return eventstore.ErrDupEvent
|
||||
@@ -93,8 +100,22 @@ func (b *SliceStore) SaveEvent(evt nostr.Event) error {
|
||||
}
|
||||
|
||||
func (b *SliceStore) DeleteEvent(id nostr.ID) error {
|
||||
idx, found := slices.BinarySearchFunc(b.internal, id, eventIDComparator)
|
||||
if !found {
|
||||
b.Lock()
|
||||
defer b.Unlock()
|
||||
|
||||
return b.delete(id)
|
||||
}
|
||||
|
||||
func (b *SliceStore) delete(id nostr.ID) error {
|
||||
var idx int = -1
|
||||
for i, event := range b.internal {
|
||||
if event.ID == id {
|
||||
idx = i
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if idx == -1 {
|
||||
// we don't have this event
|
||||
return nil
|
||||
}
|
||||
@@ -117,7 +138,7 @@ func (b *SliceStore) ReplaceEvent(evt nostr.Event) error {
|
||||
shouldStore := true
|
||||
for previous := range b.QueryEvents(filter) {
|
||||
if internal.IsOlder(previous, evt) {
|
||||
if err := b.DeleteEvent(previous.ID); err != nil {
|
||||
if err := b.delete(previous.ID); err != nil {
|
||||
return fmt.Errorf("failed to delete event for replacing: %w", err)
|
||||
}
|
||||
} else {
|
||||
@@ -126,7 +147,7 @@ func (b *SliceStore) ReplaceEvent(evt nostr.Event) error {
|
||||
}
|
||||
|
||||
if shouldStore {
|
||||
if err := b.SaveEvent(evt); err != nil && err != eventstore.ErrDupEvent {
|
||||
if err := b.save(evt); err != nil && err != eventstore.ErrDupEvent {
|
||||
return fmt.Errorf("failed to save: %w", err)
|
||||
}
|
||||
}
|
||||
@@ -135,17 +156,13 @@ func (b *SliceStore) ReplaceEvent(evt nostr.Event) error {
|
||||
}
|
||||
|
||||
func eventTimestampComparator(e nostr.Event, t nostr.Timestamp) int {
|
||||
return int(t) - int(e.CreatedAt)
|
||||
}
|
||||
|
||||
func eventIDComparator(e nostr.Event, i nostr.ID) int {
|
||||
return bytes.Compare(i[:], e.ID[:])
|
||||
return cmp.Compare(t, e.CreatedAt)
|
||||
}
|
||||
|
||||
func eventComparator(a nostr.Event, b nostr.Event) int {
|
||||
c := cmp.Compare(b.CreatedAt, a.CreatedAt)
|
||||
if c != 0 {
|
||||
return c
|
||||
v := cmp.Compare(b.CreatedAt, a.CreatedAt)
|
||||
if v == 0 {
|
||||
v = bytes.Compare(b.ID[:], a.ID[:])
|
||||
}
|
||||
return bytes.Compare(b.ID[:], a.ID[:])
|
||||
return v
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"testing"
|
||||
|
||||
"fiatjaf.com/nostr"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestBasicStuff(t *testing.T) {
|
||||
@@ -20,17 +21,17 @@ func TestBasicStuff(t *testing.T) {
|
||||
if i%3 == 0 {
|
||||
kind = 12
|
||||
}
|
||||
ss.SaveEvent(nostr.Event{CreatedAt: nostr.Timestamp(v), Kind: uint16(kind)})
|
||||
evt := nostr.Event{CreatedAt: nostr.Timestamp(v), Kind: uint16(kind)}
|
||||
evt.Sign(nostr.Generate())
|
||||
ss.SaveEvent(evt)
|
||||
}
|
||||
|
||||
list := make([]nostr.Event, 0, 20)
|
||||
for event := range ss.QueryEvents(nostr.Filter{}) {
|
||||
list = append(list, event)
|
||||
}
|
||||
require.Len(t, list, 20)
|
||||
|
||||
if len(list) != 20 {
|
||||
t.Fatalf("failed to load 20 events")
|
||||
}
|
||||
if list[0].CreatedAt != 10018 || list[1].CreatedAt != 10016 || list[18].CreatedAt != 3 || list[19].CreatedAt != 1 {
|
||||
t.Fatalf("order is incorrect")
|
||||
}
|
||||
@@ -49,7 +50,5 @@ func TestBasicStuff(t *testing.T) {
|
||||
for event := range ss.QueryEvents(nostr.Filter{Since: &since}) {
|
||||
list = append(list, event)
|
||||
}
|
||||
if len(list) != 5 {
|
||||
t.Fatalf("should have gotten 5, not %d", len(list))
|
||||
}
|
||||
require.Len(t, list, 5)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user