packages feed

postgres-websockets-0.11.2.4: test/BroadcastSpec.hs

module BroadcastSpec (spec) where

import APrelude
import Control.Concurrent.STM.TQueue
import PostgresWebsockets.Broadcast
import Test.Hspec

spec :: Spec
spec = do
  describe "newMultiplexer" $
    it "opens a separate thread for a producer function" $ do
      output <- newTQueueIO :: IO (TQueue ThreadId)

      void $
        liftIO $
          newMultiplexer
            ( \_ -> do
                tid <- myThreadId
                atomically $ writeTQueue output tid
            )
            (\_ -> return ())

      outMsg <- atomically $ readTQueue output
      myThreadId `shouldNotReturn` outMsg
  describe "relayMessages" $
    it "relays a single message from producer to 1 listener on 1 test channel" $ do
      output <- newTQueueIO :: IO (TQueue Message)
      multi <-
        liftIO $
          newMultiplexer
            ( \msgs ->
                atomically $ writeTQueue msgs (Message "test" "payload")
            )
            (\_ -> return ())
      void $ onMessage multi "test" $ atomically . writeTQueue output

      liftIO $ relayMessages multi

      outMsg <- atomically $ readTQueue output
      outMsg `shouldBe` Message "test" "payload"