event_test.mx raw

   1  package event
   2  
   3  import (
   4  	"bytes"
   5  	"crypto/sha256"
   6  	"testing"
   7  
   8  	"smesh.lol/pkg/nostr/signer/p8k"
   9  	"smesh.lol/pkg/nostr/tag"
  10  	"smesh.lol/pkg/nostr/timestamp"
  11  )
  12  
  13  func TestSignVerifyEvent(t *testing.T) {
  14  	signer := p8k.MustNew()
  15  	if err := signer.Generate(); err != nil {
  16  		t.Fatal(err)
  17  	}
  18  
  19  	ev := &E{
  20  		CreatedAt: timestamp.Now().V,
  21  		Kind:      1,
  22  		Tags:      tag.NewS(tag.NewFromBytesSlice([]byte("p"), []byte("deadbeef"))),
  23  		Content:   []byte("hello nostr from moxie"),
  24  	}
  25  	if err := ev.Sign(signer); err != nil {
  26  		t.Fatal(err)
  27  	}
  28  
  29  	// ID should be SHA256 of canonical form.
  30  	canonical := ev.ToCanonical(nil)
  31  	h := sha256.Sum256(canonical)
  32  	if !bytes.Equal(h[:], ev.ID) {
  33  		t.Fatal("event ID mismatch")
  34  	}
  35  
  36  	// Verify signature.
  37  	valid, err := ev.Verify()
  38  	if err != nil {
  39  		t.Fatal(err)
  40  	}
  41  	if !valid {
  42  		t.Fatal("signature verification failed")
  43  	}
  44  }
  45  
  46  func TestMarshalUnmarshalRoundTrip(t *testing.T) {
  47  	signer := p8k.MustNew()
  48  	if err := signer.Generate(); err != nil {
  49  		t.Fatal(err)
  50  	}
  51  
  52  	ev := &E{
  53  		CreatedAt: 1234567890,
  54  		Kind:      1,
  55  		Tags:      tag.NewS(tag.NewFromBytesSlice([]byte("t"), []byte("test"))),
  56  		Content:   []byte("test message with \"quotes\" and \\backslash"),
  57  	}
  58  	if err := ev.Sign(signer); err != nil {
  59  		t.Fatal(err)
  60  	}
  61  
  62  	// Marshal to JSON.
  63  	b := ev.Marshal(nil)
  64  
  65  	// Unmarshal back.
  66  	ev2 := New()
  67  	if _, err := ev2.Unmarshal(b); err != nil {
  68  		t.Fatalf("unmarshal failed: %v", err)
  69  	}
  70  
  71  	if !bytes.Equal(ev.ID, ev2.ID) {
  72  		t.Fatal("ID mismatch after round-trip")
  73  	}
  74  	if !bytes.Equal(ev.Pubkey, ev2.Pubkey) {
  75  		t.Fatal("Pubkey mismatch")
  76  	}
  77  	if ev.CreatedAt != ev2.CreatedAt {
  78  		t.Fatal("CreatedAt mismatch")
  79  	}
  80  	if ev.Kind != ev2.Kind {
  81  		t.Fatal("Kind mismatch")
  82  	}
  83  	if !bytes.Equal(ev.Content, ev2.Content) {
  84  		t.Fatalf("Content mismatch: %q vs %q", ev.Content, ev2.Content)
  85  	}
  86  	if !bytes.Equal(ev.Sig, ev2.Sig) {
  87  		t.Fatal("Sig mismatch")
  88  	}
  89  
  90  	// Verify the deserialized event.
  91  	valid, err := ev2.Verify()
  92  	if err != nil {
  93  		t.Fatal(err)
  94  	}
  95  	if !valid {
  96  		t.Fatal("deserialized event verification failed")
  97  	}
  98  }
  99  
 100  func TestBinaryRoundTrip(t *testing.T) {
 101  	signer := p8k.MustNew()
 102  	if err := signer.Generate(); err != nil {
 103  		t.Fatal(err)
 104  	}
 105  
 106  	ev := &E{
 107  		CreatedAt: 1700000000,
 108  		Kind:      30023,
 109  		Tags: tag.NewS(
 110  			tag.NewFromBytesSlice([]byte("d"), []byte("test-article")),
 111  			tag.NewFromBytesSlice([]byte("title"), []byte("Test Article")),
 112  		),
 113  		Content: []byte("long form content here"),
 114  	}
 115  	if err := ev.Sign(signer); err != nil {
 116  		t.Fatal(err)
 117  	}
 118  
 119  	// Marshal to binary.
 120  	binData := ev.MarshalBinaryToBytes(nil)
 121  
 122  	// Unmarshal from binary.
 123  	ev2 := New()
 124  	if err := ev2.UnmarshalBinary(bytes.NewReader(binData)); err != nil {
 125  		t.Fatalf("binary unmarshal failed: %v", err)
 126  	}
 127  
 128  	if !bytes.Equal(ev.ID, ev2.ID) {
 129  		t.Fatal("ID mismatch in binary round-trip")
 130  	}
 131  	if !bytes.Equal(ev.Sig, ev2.Sig) {
 132  		t.Fatal("Sig mismatch in binary round-trip")
 133  	}
 134  	if !bytes.Equal(ev.Content, ev2.Content) {
 135  		t.Fatal("Content mismatch in binary round-trip")
 136  	}
 137  }
 138