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"