event_test.mx raw

   1  package event
   2  
   3  import (
   4  	"bytes"
   5  	"crypto/sha256"
   6  	"testing"
   7  
   8  	"git.smesh.lol/nostr/pkg/signer/p8k"
   9  	"git.smesh.lol/nostr/pkg/tag"
  10  	"git.smesh.lol/nostr/pkg/timestamp"
  11  )
  12  
  13  func TestSignVerifyEvent(t *testing.T) {
  14  	kg := p8k.MustNew()
  15  	if gerr := kg.Generate(); gerr != nil {
  16  		t.Fatal(gerr)
  17  	}
  18  
  19  	evA := &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 serr := evA.Sign(kg); serr != nil {
  26  		t.Fatal(serr)
  27  	}
  28  
  29  	// ID should be SHA256 of canonical form.
  30  	canonA := evA.ToCanonical(nil)
  31  	hA := sha256.Sum256(canonA)
  32  	if !bytes.Equal(hA[:], evA.ID) {
  33  		t.Fatal("event ID mismatch")
  34  	}
  35  
  36  	// Verify signature.
  37  	validA, verrA := evA.Verify()
  38  	if verrA != nil {
  39  		t.Fatal(verrA)
  40  	}
  41  	if !validA {
  42  		t.Fatal("signature verification failed")
  43  	}
  44  }
  45  
  46  func TestMarshalUnmarshalRoundTrip(t *testing.T) {
  47  	kg2 := p8k.MustNew()
  48  	if gerr2 := kg2.Generate(); gerr2 != nil {
  49  		t.Fatal(gerr2)
  50  	}
  51  
  52  	evB := &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 serrB := evB.Sign(kg2); serrB != nil {
  59  		t.Fatal(serrB)
  60  	}
  61  
  62  	// Marshal to JSON.
  63  	rawB := evB.Marshal(nil)
  64  
  65  	// Unmarshal back.
  66  	evB2 := New()
  67  	if _, uerrB := evB2.Unmarshal(rawB); uerrB != nil {
  68  		t.Fatalf("unmarshal failed: %s", uerrB)
  69  	}
  70  
  71  	if !bytes.Equal(evB.ID, evB2.ID) {
  72  		t.Fatal("ID mismatch after round-trip")
  73  	}
  74  	if !bytes.Equal(evB.Pubkey, evB2.Pubkey) {
  75  		t.Fatal("Pubkey mismatch")
  76  	}
  77  	if evB.CreatedAt != evB2.CreatedAt {
  78  		t.Fatal("CreatedAt mismatch")
  79  	}
  80  	if evB.Kind != evB2.Kind {
  81  		t.Fatal("Kind mismatch")
  82  	}
  83  	if !bytes.Equal(evB.Content, evB2.Content) {
  84  		t.Fatalf("Content mismatch: %s vs %s", evB.Content, evB2.Content)
  85  	}
  86  	if !bytes.Equal(evB.Sig, evB2.Sig) {
  87  		t.Fatal("Sig mismatch")
  88  	}
  89  
  90  	// Verify the deserialized event.
  91  	validB, verrB := evB2.Verify()
  92  	if verrB != nil {
  93  		t.Fatal(verrB)
  94  	}
  95  	if !validB {
  96  		t.Fatal("deserialized event verification failed")
  97  	}
  98  }
  99  
 100  func TestBinaryRoundTrip(t *testing.T) {
 101  	kg3 := p8k.MustNew()
 102  	if gerr3 := kg3.Generate(); gerr3 != nil {
 103  		t.Fatal(gerr3)
 104  	}
 105  
 106  	evC := &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 serrC := evC.Sign(kg3); serrC != nil {
 116  		t.Fatal(serrC)
 117  	}
 118  
 119  	// Marshal to binary.
 120  	binC := evC.MarshalBinaryToBytes(nil)
 121  
 122  	// Unmarshal from binary.
 123  	evC2 := New()
 124  	if uerrC := evC2.UnmarshalBinary(bytes.NewReader(binC)); uerrC != nil {
 125  		t.Fatalf("binary unmarshal failed: %s", uerrC)
 126  	}
 127  
 128  	if !bytes.Equal(evC.ID, evC2.ID) {
 129  		t.Fatal("ID mismatch in binary round-trip")
 130  	}
 131  	if !bytes.Equal(evC.Sig, evC2.Sig) {
 132  		t.Fatal("Sig mismatch in binary round-trip")
 133  	}
 134  	if !bytes.Equal(evC.Content, evC2.Content) {
 135  		t.Fatal("Content mismatch in binary round-trip")
 136  	}
 137  }
 138