packages feed

redis-0.12: Test/PubSubCommands.hs

{-
Copyright (c) 2010-2011, Alexander Bogdanov <andorn@gmail.com>
License: MIT
-}

module Test.PubSubCommands where

import Test.Setup

tests = TList [TLabel "subscribe and unsubscribe" test_subscribe_unsubscribe,
               TLabel "psubscribe and punsubscribe" test_psubscribe_punsubscribe,
               TLabel "publish and listen" test_publish_listen,
               TLabel "publish and listen for psubscribe" test_publish_listen_p]

test_subscribe_unsubscribe = TCase $ testRedis $
    do r <- ask
       liftIO $ do subscribed r >>= assertEqual "" 0
                   res <- subscribe r ["foo", "bar"]
                   assertEqual "" [MSubscribe "foo" 1, MSubscribe "bar" 2] res
                   subscribed r >>= assertEqual "" 2

                   res <- subscribe r ["foo", "baz"]
                   assertEqual "" [MSubscribe "foo" 2, MSubscribe "baz" 3] res
                   subscribed r >>= assertEqual "" 3

                   res <- unsubscribe r ["foo"]
                   assertEqual "" [MUnsubscribe "foo" 2] res
                   subscribed r >>= assertEqual "" 2

                   ping r >>= assertRError ""

                   res <- unsubscribe r ([] :: [String]) :: IO [Message String]
                   subscribed r >>= assertEqual "" 0

test_psubscribe_punsubscribe = TCase $ testRedis $
    do r <- ask
       liftIO $ do subscribed r >>= assertEqual "" 0
                   res <- psubscribe r ["foo*", "bar*"]
                   assertEqual "" [MPSubscribe "foo*" 1, MPSubscribe "bar*" 2] res
                   subscribed r >>= assertEqual "" 2

                   res <- psubscribe r ["foo*", "baz*"]
                   assertEqual "" [MPSubscribe "foo*" 2, MPSubscribe "baz*" 3] res
                   subscribed r >>= assertEqual "" 3

                   res <- punsubscribe r ["foo*"]
                   assertEqual "" [MPUnsubscribe "foo*" 2] res
                   subscribed r >>= assertEqual "" 2

                   ping r >>= assertRError ""

                   res <- punsubscribe r ([] :: [String]) :: IO [Message String]
                   subscribed r >>= assertEqual "" 0

test_publish_listen = TCase $ testRedis2 $
    do r1 <- ask
       r2 <- ask2
       liftIO $ do subscribed r1 >>= assertEqual "" 0
                   subscribe r1 ["foo"] :: IO [Message ()]
                   v <- later 500 $ publish r2 "foo" "bar" >>= fromRInt
                   msg <- listen r1 1000
                   assertEqual "" (Just $ MMessage "foo" "bar") msg
                   takeMVar v >>= assertEqual "" 1

                   (listen r1 500 :: IO (Maybe (Message String))) >>= assertEqual "" Nothing

test_publish_listen_p = TCase $ testRedis2 $
    do r1 <- ask
       r2 <- ask2
       liftIO $ do subscribed r1 >>= assertEqual "" 0
                   psubscribe r1 ["foo*", "f*"] :: IO [Message ()]
                   v <- later 500 $ publish r2 "fun" "funny" >>= fromRInt
                   msg <- listen r1 1000
                   assertEqual "" (Just $ MPMessage "f*" "fun" "funny") msg
                   takeMVar v >>= assertEqual "" 1
                   v <- later 500 $ publish r2 "foot" "football" >>= fromRInt
                   msg <- listen r1 1000
                   assertEqual "" (Just $ MPMessage "foo*" "foot" "football") msg
                   msg <- listen r1 1000
                   assertEqual "" (Just $ MPMessage "f*" "foot" "football") msg
                   takeMVar v >>= assertEqual "" 2
                   (listen r1 500 :: IO (Maybe (Message String))) >>= assertEqual "" Nothing