package event import ( "bytes" "crypto/sha256" "testing" "smesh.lol/pkg/nostr/signer/p8k" "smesh.lol/pkg/nostr/tag" "smesh.lol/pkg/nostr/timestamp" ) func TestSignVerifyEvent(t *testing.T) { signer := p8k.MustNew() if err := signer.Generate(); err != nil { t.Fatal(err) } ev := &E{ CreatedAt: timestamp.Now().V, Kind: 1, Tags: tag.NewS(tag.NewFromBytesSlice([]byte("p"), []byte("deadbeef"))), Content: []byte("hello nostr from moxie"), } if err := ev.Sign(signer); err != nil { t.Fatal(err) } // ID should be SHA256 of canonical form. canonical := ev.ToCanonical(nil) h := sha256.Sum256(canonical) if !bytes.Equal(h[:], ev.ID) { t.Fatal("event ID mismatch") } // Verify signature. valid, err := ev.Verify() if err != nil { t.Fatal(err) } if !valid { t.Fatal("signature verification failed") } } func TestMarshalUnmarshalRoundTrip(t *testing.T) { signer := p8k.MustNew() if err := signer.Generate(); err != nil { t.Fatal(err) } ev := &E{ CreatedAt: 1234567890, Kind: 1, Tags: tag.NewS(tag.NewFromBytesSlice([]byte("t"), []byte("test"))), Content: []byte("test message with \"quotes\" and \\backslash"), } if err := ev.Sign(signer); err != nil { t.Fatal(err) } // Marshal to JSON. b := ev.Marshal(nil) // Unmarshal back. ev2 := New() if _, err := ev2.Unmarshal(b); err != nil { t.Fatalf("unmarshal failed: %v", err) } if !bytes.Equal(ev.ID, ev2.ID) { t.Fatal("ID mismatch after round-trip") } if !bytes.Equal(ev.Pubkey, ev2.Pubkey) { t.Fatal("Pubkey mismatch") } if ev.CreatedAt != ev2.CreatedAt { t.Fatal("CreatedAt mismatch") } if ev.Kind != ev2.Kind { t.Fatal("Kind mismatch") } if !bytes.Equal(ev.Content, ev2.Content) { t.Fatalf("Content mismatch: %q vs %q", ev.Content, ev2.Content) } if !bytes.Equal(ev.Sig, ev2.Sig) { t.Fatal("Sig mismatch") } // Verify the deserialized event. valid, err := ev2.Verify() if err != nil { t.Fatal(err) } if !valid { t.Fatal("deserialized event verification failed") } } func TestBinaryRoundTrip(t *testing.T) { signer := p8k.MustNew() if err := signer.Generate(); err != nil { t.Fatal(err) } ev := &E{ CreatedAt: 1700000000, Kind: 30023, Tags: tag.NewS( tag.NewFromBytesSlice([]byte("d"), []byte("test-article")), tag.NewFromBytesSlice([]byte("title"), []byte("Test Article")), ), Content: []byte("long form content here"), } if err := ev.Sign(signer); err != nil { t.Fatal(err) } // Marshal to binary. binData := ev.MarshalBinaryToBytes(nil) // Unmarshal from binary. ev2 := New() if err := ev2.UnmarshalBinary(bytes.NewReader(binData)); err != nil { t.Fatalf("binary unmarshal failed: %v", err) } if !bytes.Equal(ev.ID, ev2.ID) { t.Fatal("ID mismatch in binary round-trip") } if !bytes.Equal(ev.Sig, ev2.Sig) { t.Fatal("Sig mismatch in binary round-trip") } if !bytes.Equal(ev.Content, ev2.Content) { t.Fatal("Content mismatch in binary round-trip") } }