From d59692781dca6aa7f02b46c073ee921b73c6c5db Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Fri, 2 May 2025 19:45:15 -0300 Subject: [PATCH] test for json marshaling of ids and pubkeys. --- keys.go | 4 +-- types.go | 4 +-- types_test.go | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 types_test.go diff --git a/keys.go b/keys.go index ffde50d..1329d9a 100644 --- a/keys.go +++ b/keys.go @@ -55,7 +55,7 @@ func GetPublicKey(sk [32]byte) PubKey { return [32]byte(pk.SerializeCompressed()[1:]) } -var ZeroPK = [32]byte{} +var ZeroPK = PubKey{} type PubKey [32]byte @@ -73,7 +73,7 @@ func (pk *PubKey) UnmarshalJSON(buf []byte) error { if len(buf) != 66 { return fmt.Errorf("must be a hex string of 64 characters") } - _, err := hex.Decode(pk[:], buf[1:]) + _, err := hex.Decode(pk[:], buf[1:65]) return err } diff --git a/types.go b/types.go index 23b82cd..62985c6 100644 --- a/types.go +++ b/types.go @@ -12,7 +12,7 @@ type RelayEvent struct { Relay *Relay } -var ZeroID = [32]byte{} +var ZeroID = ID{} // ID represents an event id type ID [32]byte @@ -32,7 +32,7 @@ func (id *ID) UnmarshalJSON(buf []byte) error { if len(buf) != 66 { return fmt.Errorf("must be a hex string of 64 characters") } - _, err := hex.Decode(id[:], buf[1:]) + _, err := hex.Decode(id[:], buf[1:65]) return err } diff --git a/types_test.go b/types_test.go new file mode 100644 index 0000000..39b3e1a --- /dev/null +++ b/types_test.go @@ -0,0 +1,94 @@ +package nostr + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestIDJSONEncoding(t *testing.T) { + id := MustIDFromHex("abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789") + + // test marshaling + b, err := json.Marshal(id) + require.NoError(t, err) + require.Equal(t, `"abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"`, string(b)) + + // test unmarshaling + var id2 ID + err = json.Unmarshal(b, &id2) + require.NoError(t, err) + require.Equal(t, id, id2) + + // test unmarshaling invalid json + err = json.Unmarshal([]byte(`"not64chars"`), &id2) + require.Error(t, err) + + // test unmarshaling invalid hex + err = json.Unmarshal([]byte(`"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"`), &id2) + require.Error(t, err) +} + +func TestPubKeyJSONEncoding(t *testing.T) { + pk := MustPubKeyFromHex("abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789") + + // test marshaling + b, err := json.Marshal(pk) + require.NoError(t, err) + require.Equal(t, `"abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"`, string(b)) + + // test unmarshaling + var pk2 PubKey + err = json.Unmarshal(b, &pk2) + require.NoError(t, err) + require.Equal(t, pk, pk2) + + // test unmarshaling invalid json + err = json.Unmarshal([]byte(`"not64chars"`), &pk2) + require.Error(t, err) + + // test unmarshaling invalid hex + err = json.Unmarshal([]byte(`"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"`), &pk2) + require.Error(t, err) +} + +type TestStruct struct { + ID ID `json:"id"` + PubKey PubKey `json:"pubkey"` + Name string `json:"name"` +} + +func TestStructWithIDAndPubKey(t *testing.T) { + ts := TestStruct{ + ID: MustIDFromHex("abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"), + PubKey: MustPubKeyFromHex("123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0"), + Name: "test", + } + + // test marshaling + b, err := json.Marshal(ts) + require.NoError(t, err) + require.Equal(t, `{"id":"abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789","pubkey":"123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0","name":"test"}`, string(b)) + + // test unmarshaling + var ts2 TestStruct + err = json.Unmarshal(b, &ts2) + require.NoError(t, err) + require.Equal(t, ts, ts2) + + // test unmarshaling with missing fields + var ts3 TestStruct + err = json.Unmarshal([]byte(`{"name":"test"}`), &ts3) + require.NoError(t, err) + require.Equal(t, "test", ts3.Name) + require.Equal(t, ZeroID, ts3.ID) + require.Equal(t, ZeroPK, ts3.PubKey) + + // test unmarshaling with invalid ID + err = json.Unmarshal([]byte(`{"id":"invalid","pubkey":"123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0","name":"test"}`), &ts2) + require.Error(t, err) + + // test unmarshaling with invalid PubKey + err = json.Unmarshal([]byte(`{"id":"abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789","pubkey":"invalid","name":"test"}`), &ts2) + require.Error(t, err) +}