{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeApplications #-} -- | The matrix client specification tests module Main (main) where import Control.Monad (void) import qualified Data.Aeson.Encode.Pretty as Aeson import Data.Text (Text) import Data.Time.Clock.System (SystemTime (..), getSystemTime) import Network.Matrix.Client import Network.Matrix.Internal import Test.Hspec main :: IO () main = hspec spec spec :: Spec spec = describe "unit tests" $ do it "decode unknown" $ (decodeResp "" :: Maybe (Either MatrixError String)) `shouldBe` Nothing it "decode error" $ (decodeResp "{\"errcode\": \"TEST\", \"error\":\"a error\"}" :: Maybe (Either MatrixError String)) `shouldBe` (Just . Left $ MatrixError "TEST" "a error" Nothing) it "decode response" $ decodeResp "{\"user_id\": \"@tristanc_:matrix.org\"}" `shouldBe` (Just . Right $ UserID "@tristanc_:matrix.org") it "encode room message" $ encodePretty (RoomMessageText (MessageText "Hello" Nothing Nothing)) `shouldBe` "{\"body\":\"Hello\",\"msgtype\":\"m.text\"}" it "does not retry on success" $ checkPause (<=) $ do let resp = Right True res <- retry (pure resp) res `shouldBe` resp it "does not retry on regular failre" $ checkPause (<=) $ do let resp = Left $ MatrixError "test" "error" Nothing res <- (retry (pure resp) :: MatrixIO Int) res `shouldBe` resp it "retry on rate limit failure" $ checkPause (>=) $ do let resp = Left $ MatrixError "M_LIMIT_EXCEEDED" "error" (Just 1000) (retry' 1 (const $ pure ()) (pure resp) :: MatrixIO Int) `shouldThrow` rateLimitSelector where rateLimitSelector :: MatrixException -> Bool rateLimitSelector MatrixRateLimit = True checkPause op action = do MkSystemTime start _ <- getSystemTime void action MkSystemTime end _ <- getSystemTime (end - start) `shouldSatisfy` (`op` 1) encodePretty = Aeson.encodePretty' ( Aeson.defConfig {Aeson.confIndent = Aeson.Spaces 0, Aeson.confCompare = compare @Text} )