Some checks failed
Go / build-and-release (push) Has been cancelled
Introduce tests to validate functionality for new policy fields, including `max_expiry_duration`, `protected_required`, `identifier_regex`, and `follows_whitelist_admins`. Also, cover combinations of new and existing fields to ensure compatibility and precedence rules are correctly enforced. bump to v0.31.2
98 lines
3.1 KiB
Go
98 lines
3.1 KiB
Go
package database
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"git.mleku.dev/mleku/nostr/encoders/event"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
// TestKind3TagRoundTrip tests that kind 3 events with p tags survive
|
|
// JSON -> binary -> JSON round trip
|
|
func TestKind3TagRoundTrip(t *testing.T) {
|
|
// Sample kind 3 event JSON with p tags
|
|
kind3JSON := `{
|
|
"id": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
|
|
"pubkey": "fedcba0987654321fedcba0987654321fedcba0987654321fedcba0987654321",
|
|
"created_at": 1234567890,
|
|
"kind": 3,
|
|
"tags": [
|
|
["p", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"],
|
|
["p", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"],
|
|
["p", "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"]
|
|
],
|
|
"content": "",
|
|
"sig": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
|
}`
|
|
|
|
// 1. Unmarshal from JSON (simulates receiving from WebSocket)
|
|
ev1 := event.New()
|
|
err := json.Unmarshal([]byte(kind3JSON), ev1)
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, ev1.Tags)
|
|
assert.Equal(t, 3, ev1.Tags.Len(), "Should have 3 tags")
|
|
|
|
// Verify all tags have key "p"
|
|
pTagCount := 0
|
|
for _, tag := range *ev1.Tags {
|
|
if tag != nil && tag.Len() >= 2 {
|
|
key := tag.Key()
|
|
if len(key) == 1 && key[0] == 'p' {
|
|
pTagCount++
|
|
t.Logf("Found p tag with value length: %d bytes", len(tag.Value()))
|
|
}
|
|
}
|
|
}
|
|
assert.Equal(t, 3, pTagCount, "Should have 3 p tags after JSON unmarshal")
|
|
|
|
// 2. Marshal to binary (simulates database storage)
|
|
buf := new(bytes.Buffer)
|
|
ev1.MarshalBinary(buf)
|
|
binaryData := buf.Bytes()
|
|
t.Logf("Binary encoding size: %d bytes", len(binaryData))
|
|
|
|
// 3. Unmarshal from binary (simulates database retrieval)
|
|
ev2 := event.New()
|
|
err = ev2.UnmarshalBinary(bytes.NewBuffer(binaryData))
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, ev2.Tags)
|
|
assert.Equal(t, 3, ev2.Tags.Len(), "Should have 3 tags after binary round-trip")
|
|
|
|
// Verify all tags still have key "p"
|
|
pTagCount2 := 0
|
|
for _, tag := range *ev2.Tags {
|
|
if tag != nil && tag.Len() >= 2 {
|
|
key := tag.Key()
|
|
if len(key) == 1 && key[0] == 'p' {
|
|
pTagCount2++
|
|
t.Logf("Found p tag after round-trip with value length: %d bytes", len(tag.Value()))
|
|
}
|
|
}
|
|
}
|
|
assert.Equal(t, 3, pTagCount2, "Should have 3 p tags after binary round-trip")
|
|
|
|
// 4. Marshal back to JSON to verify tags are still there
|
|
jsonData2, err := json.Marshal(ev2)
|
|
assert.NoError(t, err)
|
|
t.Logf("JSON after round-trip: %s", string(jsonData2))
|
|
|
|
// Parse the JSON and count p tags
|
|
var jsonMap map[string]interface{}
|
|
err = json.Unmarshal(jsonData2, &jsonMap)
|
|
assert.NoError(t, err)
|
|
|
|
tags, ok := jsonMap["tags"].([]interface{})
|
|
assert.True(t, ok, "tags should be an array")
|
|
assert.Equal(t, 3, len(tags), "Should have 3 tags in final JSON")
|
|
|
|
for i, tag := range tags {
|
|
tagArray, ok := tag.([]interface{})
|
|
assert.True(t, ok, "tag should be an array")
|
|
assert.GreaterOrEqual(t, len(tagArray), 2, "tag should have at least 2 elements")
|
|
assert.Equal(t, "p", tagArray[0], "tag %d should have key 'p'", i)
|
|
t.Logf("Tag %d: %v", i, tagArray)
|
|
}
|
|
}
|