nws/netstr/conn_test.go
asmogo a77add0859
replaced nip04 with nip44 (#43)
* replaced nip04 with nip44

* Refactor key decoding logic to use common function

* Refactor key decoding logic to use common function

* fix nostr connection read test
2024-11-08 14:21:43 +01:00

139 lines
3.5 KiB
Go

package netstr
import (
"context"
"fmt"
"github.com/asmogo/nws/protocol"
"github.com/ekzyis/nip44"
"github.com/nbd-wtf/go-nostr"
"runtime"
"testing"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
)
func TestNostrConnection_Read(t *testing.T) {
tests := []struct {
name string
event nostr.IncomingEvent
nc func() *NostrConnection
wantN int
wantErr bool
}{
{
name: "Read invalid relay",
event: nostr.IncomingEvent{Relay: nil},
nc: func() *NostrConnection {
ctx, cancelFunc := context.WithCancel(context.Background())
return &NostrConnection{
uuid: uuid.New(),
ctx: ctx,
cancel: cancelFunc,
subscriptionChan: make(chan nostr.IncomingEvent, 1),
privateKey: "788de536151854213cc28dff9c3042e7897f0a1d59b391ddbbc1619d7e716e78",
}
},
wantN: 0,
wantErr: false,
},
{
name: "Read",
event: nostr.IncomingEvent{
Relay: &nostr.Relay{URL: "wss://relay.example.com"},
Event: &nostr.Event{
ID: "eventID",
PubKey: "8f97a664471f0b6d599a1e4a781c9a25f39902d96fb462c08df48697bb851611",
Content: `AuaBj8mXZ9n9IfdonNra0lpaed6Alc+H0xjUdyN9h6mCSuy7ZrEjWUZQj4HWNd4P1RCme1pda0z8hyItT4nVzESByRiQT5+hf+ij0aJw9+DW/ggJIWGbpm4wp7bk4loYKdERr+nzorqEjWNzpxsJXhXJ0nKtIxu61To5XY4SjuMqpUuOtznuHiPJJhKNWSSRPV92L/iVoOnjKJhfR5jOWBK3vA==`}},
nc: func() *NostrConnection {
ctx, cancelFunc := context.WithCancel(context.Background())
return &NostrConnection{
uuid: uuid.New(),
ctx: ctx,
cancel: cancelFunc,
subscriptionChan: make(chan nostr.IncomingEvent, 1),
privateKey: "788de536151854213cc28dff9c3042e7897f0a1d59b391ddbbc1619d7e716e78",
}
},
wantN: 5, // hello world
wantErr: false,
},
// Add more cases here to cover more corner situations
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
nc := tt.nc()
defer nc.Close()
b := make([]byte, 1024)
if tt.event.Event != nil {
private, public, err := protocol.GetEncryptionKeys(nc.privateKey, tt.event.PubKey)
if err != nil {
panic(err)
}
sharedKey, err := nip44.GenerateConversationKey(private, public)
if err != nil {
panic(err)
}
fmt.Println(nip44.Encrypt(sharedKey, tt.event.Content, &nip44.EncryptOptions{}))
}
nc.subscriptionChan <- tt.event
gotN, err := nc.Read(b)
if (err != nil) != tt.wantErr {
t.Errorf("Read() error = %v, wantErr %v", err, tt.wantErr)
return
}
if gotN != tt.wantN {
t.Errorf("Read() gotN = %v, want %v", gotN, tt.wantN)
}
})
}
func() {
// Prevent goroutine leak
for range make([]struct{}, 1000) {
runtime.Gosched()
}
}()
}
func TestNewConnection(t *testing.T) {
testCases := []struct {
name string
opts []NostrConnOption
expectedID string
}{
{
name: "NoOptions",
},
{
name: "WithPrivateKey",
opts: []NostrConnOption{WithPrivateKey("privateKey")},
},
{
name: "WithSub",
opts: []NostrConnOption{WithSub(true)},
},
{
name: "WithDst",
opts: []NostrConnOption{WithDst("destination")},
},
{
name: "WithUUID",
opts: []NostrConnOption{WithUUID(uuid.New())},
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
ctx := context.Background()
connection := NewConnection(ctx, tc.opts...)
assert.NotNil(t, connection)
assert.NotNil(t, connection.pool)
assert.NotNil(t, connection.ctx)
assert.NotNil(t, connection.cancel)
assert.NotNil(t, connection.subscriptionChan)
})
}
}