module Protocol where import qualified Data.Aeson as A import qualified Data.HashMap.Strict as HM import qualified Data.Text as T import Network.Pusher.Protocol ( ChannelInfo (..), ChannelsInfo (..), FullChannelInfo (..), User (..), Users (..), ) import Test.Hspec (Spec, describe, it, shouldBe) import Test.QuickCheck (Arbitrary (..), elements) newtype TestChannel = TestChannel T.Text deriving (Show) instance Arbitrary TestChannel where arbitrary = do channelPrefix <- elements ["public", "private", "presence"] channelSuffix <- T.pack <$> arbitrary return $ TestChannel $ channelPrefix <> "-" <> channelSuffix test :: Spec test = do describe "Protocol.ChannelsInfo" $ it "parsing works" $ -- Data from https://pusher.com/docs/channels/library_auth_reference/rest-api#successful-response A.decode "{\ \ \"channels\": {\ \ \"presence-foobar\": {\ \ \"user_count\": 42\ \ },\ \ \"presence-another\": {\ \ \"user_count\": 123\ \ }\ \ }\ \}" `shouldBe` Just ( ChannelsInfo $ HM.fromList [ ("presence-foobar", ChannelInfo $ Just 42), ("presence-another", ChannelInfo $ Just 123) ] ) describe "Protocol.FullChannelInfo" $ it "parsing works" $ -- Data from https://pusher.com/docs/channels/library_auth_reference/rest-api#successful-response A.decode "{\ \ \"occupied\": true,\ \ \"user_count\": 42,\ \ \"subscription_count\": 42\ \}" `shouldBe` Just (FullChannelInfo True (Just 42) (Just 42)) describe "Protocol.Users" $ it "parsing works" $ A.decode "{\ \ \"users\": [\ \ { \"id\": \"1\" },\ \ { \"id\": \"2\" }\ \ ]\ \}" `shouldBe` Just (Users [User "1", User "2"])