module BroadcastSpec (spec) where import Protolude import Control.Concurrent.STM.TQueue import Test.Hspec import PostgresWebsockets.Broadcast 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"