148 lines
4.2 KiB
Go
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)
|
|
})
|
|
}
|