module Hypermedia.Datastar.SSESpec where import Data.Text qualified as T import Test.Hspec import Data.ByteString.Builder qualified as BSB import Data.ByteString.Lazy.Char8 qualified as LBS import Data.IORef import Data.List (isInfixOf) import Hypermedia.Datastar import Hypermedia.Datastar.Logger (nullLogger) import Hypermedia.Datastar.PatchElements import Hypermedia.Datastar.PatchSignals import Hypermedia.Datastar.Types import Hypermedia.Datastar.WAI (renderEvent) import Network.Wai.Internal (Response (..)) render :: DatastarEvent -> String render = LBS.unpack . BSB.toLazyByteString . renderEvent -- | Consume a streaming WAI response and return the full body as a string. consumeStreamingResponse :: Response -> IO String consumeStreamingResponse (ResponseStream _status _headers body) = do chunksRef <- newIORef [] body (\chunk -> modifyIORef' chunksRef (chunk :)) (pure ()) chunks <- readIORef chunksRef pure $ LBS.unpack $ BSB.toLazyByteString $ mconcat $ reverse chunks consumeStreamingResponse _ = error "Expected a streaming response" spec :: Spec spec = do describe "Hypermedia.Datastar.SSE.renderEvent" $ do it "renders a simple event" $ do let event = DatastarEvent { eventType = EventPatchElements , eventId = Nothing , retry = defaultRetryDuration , dataLines = ["elements