Files
realy/bunker/session_test.go
2025-06-26 18:29:28 +01:00

148 lines
4.2 KiB
Go

package bunker
import (
"encoding/json"
"errors"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"realy.lol/encryption"
"realy.lol/event"
"realy.lol/hex"
"realy.lol/kind"
)
func TestSessionParseRequest(t *testing.T) {
// Create a test session
pubkey, _ := hex.Dec("3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d")
sharedKey := []byte("shared_key_for_testing_32bytes!!")
conversationKey := []byte("conversation_key_for_testing_32!")
session := &Session{
Pubkey: pubkey,
SharedKey: sharedKey,
ConversationKey: conversationKey,
}
// Create a test request
testReq := &Request{
ID: "test_id",
Method: "test_method",
Params: [][]byte{[]byte("param1")},
}
// Test with conversation key encryption
t.Run("with conversation key", func(t *testing.T) {
reqBytes, err := json.Marshal(testReq)
require.NoError(t, err)
encrypted, err := encryption.Encrypt(reqBytes, conversationKey)
require.NoError(t, err)
ev := &event.T{
Content: encrypted,
}
parsedReq, err := session.ParseRequest(ev)
require.NoError(t, err)
assert.Equal(t, testReq.ID, parsedReq.ID)
assert.Equal(t, testReq.Method, parsedReq.Method)
assert.Equal(t, 1, len(parsedReq.Params))
assert.Equal(t, "param1", string(parsedReq.Params[0]))
})
// Test with NIP-04 encryption
t.Run("with NIP-04 encryption", func(t *testing.T) {
reqBytes, err := json.Marshal(testReq)
require.NoError(t, err)
encrypted, err := encryption.EncryptNip4(reqBytes, sharedKey)
require.NoError(t, err)
ev := &event.T{
Content: encrypted,
}
parsedReq, err := session.ParseRequest(ev)
require.NoError(t, err)
assert.Equal(t, testReq.ID, parsedReq.ID)
assert.Equal(t, testReq.Method, parsedReq.Method)
assert.Equal(t, 1, len(parsedReq.Params))
assert.Equal(t, "param1", string(parsedReq.Params[0]))
})
// Test with invalid content
t.Run("with invalid content", func(t *testing.T) {
ev := &event.T{
Content: []byte("invalid_content"),
}
_, err := session.ParseRequest(ev)
assert.Error(t, err)
})
}
func TestSessionMakeResponse(t *testing.T) {
// Create a test session
pubkey, _ := hex.Dec("3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d")
sharedKey := []byte("shared_key_for_testing_32bytes!!")
conversationKey := []byte("conversation_key_for_testing_32!")
session := &Session{
Pubkey: pubkey,
SharedKey: sharedKey,
ConversationKey: conversationKey,
}
// Test successful response
t.Run("successful response", func(t *testing.T) {
resp, ev, err := session.MakeResponse("test_id", "requester_pubkey", "success_result", nil)
require.NoError(t, err)
assert.Equal(t, "test_id", resp.ID)
assert.Equal(t, "success_result", resp.Result)
assert.Empty(t, resp.Error)
// Check event properties
assert.Equal(t, kind.NostrConnect, ev.Kind)
// Check tags
tagStrings := ev.TagStrings()
assert.True(t, len(tagStrings) > 0, "Should have at least one tag")
assert.Equal(t, "p", tagStrings[0][0], "First tag should be 'p'")
assert.Equal(t, "requester_pubkey", tagStrings[0][1], "First tag value should be requester_pubkey")
// Decrypt and verify content
decrypted, err := encryption.Decrypt(ev.Content, conversationKey)
require.NoError(t, err)
var parsedResp Response
err = json.Unmarshal(decrypted, &parsedResp)
require.NoError(t, err)
assert.Equal(t, "test_id", parsedResp.ID)
assert.Equal(t, "success_result", parsedResp.Result)
})
// Test error response
t.Run("error response", func(t *testing.T) {
testErr := errors.New("test error")
resp, ev, err := session.MakeResponse("test_id", "requester_pubkey", "", testErr)
require.NoError(t, err)
assert.Equal(t, "test_id", resp.ID)
// This is where we expect the bug: Result is set instead of Error
assert.Equal(t, "test error", resp.Result)
assert.Empty(t, resp.Error)
// Decrypt and verify content
decrypted, err := encryption.Decrypt(ev.Content, conversationKey)
require.NoError(t, err)
var parsedResp Response
err = json.Unmarshal(decrypted, &parsedResp)
require.NoError(t, err)
assert.Equal(t, "test_id", parsedResp.ID)
assert.Equal(t, "test error", parsedResp.Result)
})
}