go-nostr/sdk/wot_test.go
2025-04-04 13:47:39 -03:00

135 lines
3.8 KiB
Go

package sdk
import (
"sync"
"testing"
"time"
"github.com/nbd-wtf/go-nostr"
"github.com/stretchr/testify/require"
)
func TestLoadWoT(t *testing.T) {
sys := NewSystem()
ctx := t.Context()
// test with fiatjaf's pubkey
wotch, err := sys.loadWoT(ctx, "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d")
require.NoError(t, err)
wot := make([]string, 0, 100000)
wotch2 := make(chan string)
var filter WotXorFilter
done := make(chan struct{})
go func() {
// test that we can get a filter from the WoT
filter = makeWoTFilter(wotch2)
close(done)
}()
for pk := range wotch {
wot = append(wot, pk)
wotch2 <- pk
}
close(wotch2)
// we should get a decent number of pubkeys in the WoT
require.Greater(t, len(wot), 10000, "should have more than 10000 pubkeys in WoT")
// test that the filter contains some known pubkeys from the WoT
<-done
for _, pk := range wot {
require.True(t, filter.Contains(pk), "filter should contain all WoT pubkeys")
}
}
func TestLoadWoTManyPeople(t *testing.T) {
sys := NewSystem()
ctx := t.Context()
wg := sync.WaitGroup{}
wg.Add(3 + 2 + 2)
diffs := make([]nostr.Timestamp, 5)
var rabble1 WotXorFilter
var rabble2 WotXorFilter
var rabble3 WotXorFilter
var alex1 WotXorFilter
var alex2 WotXorFilter
// these are the same pubkey
go func() {
rabble, err := sys.LoadWoTFilter(ctx, "76c71aae3a491f1d9eec47cba17e229cda4113a0bbb6e6ae1776d7643e29cafa")
require.NoError(t, err)
diffs[0] = nostr.Now()
rabble1 = rabble
wg.Done()
}()
time.Sleep(time.Millisecond * 20)
go func() {
rabble, err := sys.LoadWoTFilter(ctx, "76c71aae3a491f1d9eec47cba17e229cda4113a0bbb6e6ae1776d7643e29cafa")
require.NoError(t, err)
diffs[1] = nostr.Now()
rabble2 = rabble
wg.Done()
}()
time.Sleep(time.Millisecond * 20)
go func() {
rabble, err := sys.LoadWoTFilter(ctx, "76c71aae3a491f1d9eec47cba17e229cda4113a0bbb6e6ae1776d7643e29cafa")
require.NoError(t, err)
diffs[2] = nostr.Now()
rabble3 = rabble
wg.Done()
}()
// these should map to the same pos
time.Sleep(time.Millisecond * 20)
go func() {
alex, err := sys.LoadWoTFilter(ctx, "9ce71f1506ccf4b99f234af49bd6202be883a80f95a155c6e9a1c36fd7e780c7")
require.NoError(t, err)
diffs[3] = nostr.Now()
alex1 = alex
wg.Done()
}()
time.Sleep(time.Millisecond * 20)
go func() {
alex, err := sys.LoadWoTFilter(ctx, "9ce71f1506ccf4b99f234af49bd6202be883a80f95a155c6e9a1c36fd7e780c7")
require.NoError(t, err)
diffs[4] = nostr.Now()
alex2 = alex
wg.Done()
}()
// these are independent
go func() {
hodlbod, err := sys.LoadWoTFilter(ctx, "97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322")
require.NoError(t, err)
require.True(t, hodlbod.Contains("ee11a5dff40c19a555f41fe42b48f00e618c91225622ae37b6c2bb67b76c4e49"))
require.True(t, hodlbod.Contains("76c71aae3a491f1d9eec47cba17e229cda4113a0bbb6e6ae1776d7643e29cafa"))
require.True(t, hodlbod.Contains("3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d"))
wg.Done()
}()
go func() {
mikedilger, err := sys.LoadWoTFilter(ctx, "ee11a5dff40c19a555f41fe42b48f00e618c91225622ae37b6c2bb67b76c4e49")
require.NoError(t, err)
require.True(t, mikedilger.Contains("97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322"))
require.True(t, mikedilger.Contains("3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d"))
wg.Done()
}()
wg.Wait()
require.Equal(t, rabble1, rabble2)
require.Equal(t, rabble2, rabble3)
require.Equal(t, alex1, alex2)
require.Less(t, int(diffs[1]-diffs[0]), 1, "second duplicated call should resolve immediately")
require.Less(t, int(diffs[2]-diffs[1]), 1, "third duplicated call should resolve immediately")
require.Greater(t, int(diffs[3]-diffs[2]), 10, "the next call should take a long time")
require.Less(t, int(diffs[4]-diffs[3]), 1, "and then a duplicated call should resolve immediately")
}