packages feed

nostr-1.3.0.0: test/Test/Nostr/EventSpec.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE LambdaCase #-}

module Test.Nostr.EventSpec (spec) where

import Test.Hspec
import Nostr.Event
import Data.Aeson (encode, decode)
import qualified Data.Text as T
import qualified Data.ByteString.Lazy as BSL
import qualified Data.Text.Encoding as TE

spec :: Spec
spec = do
  describe "Nostr.Event" $ do
    
    describe "Smart Constructors (Hex Validation)" $ do
      it "validates valid 64-char hex strings for EventId" $ do
        let validHex = T.replicate 64 "a"
        mkEventId validHex `shouldBe` Right (EventId validHex)
      
      it "rejects invalid lengths for EventId" $ do
        let invalidHex = T.replicate 63 "a"
        mkEventId invalidHex `shouldSatisfy` (\case Left _ -> True; _ -> False)
        
      it "rejects invalid chars for EventId" $ do
        let invalidHex = T.replicate 63 "a" <> "g"
        mkEventId invalidHex `shouldSatisfy` (\case Left _ -> True; _ -> False)

      it "validates valid 128-char hex strings for Signature" $ do
        let validHex = T.replicate 128 "b"
        mkSignature validHex `shouldBe` Right (Signature validHex)

    describe "JSON Serialization" $ do
      it "serializes EventId to JSON string" $ do
        let hex = T.replicate 64 "c"
        let eid = EventId hex
        encode eid `shouldBe` ("\"" <> BSL.fromStrict (TE.encodeUtf8 hex) <> "\"")
        
      it "deserializes EventId from JSON string" $ do
        let hex = T.replicate 64 "d"
        decode ("\"" <> BSL.fromStrict (TE.encodeUtf8 hex) <> "\"") `shouldBe` Just (EventId hex)

    describe "serializeForSigning" $ do
      it "returns correct NIP-01 format" $ do
        let pk = PubKey (T.replicate 64 "e")
        let unsigned = createUnsignedEvent pk 1672531200 1 [] "hello world"
        let serialized = serializeForSigning unsigned
        let expectedJson = "[0,\"" <> T.replicate 64 "e" <> "\",1672531200,1,[],\"hello world\"]"
        encode serialized `shouldBe` BSL.fromStrict (TE.encodeUtf8 expectedJson)

    describe "validateEvent" $ do
      it "rejects unsigned placeholders" $ do
        let pk = PubKey (T.replicate 64 "e")
        let unsigned = createUnsignedEvent pk 1672531200 1 [] "hello world"
        validateEvent unsigned `shouldBe` Left "Event has placeholder ID (not computed yet)"