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)"