packages feed

reddit-0.2.3.0: test/Reddit/Types/UserSpec.hs

module Reddit.Types.UserSpec where

import Reddit.Types.User

import Data.Aeson (eitherDecode)
import Test.Hspec
import qualified Data.ByteString.Lazy.Char8 as ByteString

isRight :: Either a b -> Bool
isRight = const False `either` const True

main :: IO ()
main = hspec spec

spec :: Spec
spec =
  describe "Reddit.Types.User" $ do
    aboutMeExample <- runIO $ ByteString.readFile "test/data/aboutMe_example.json"
    getUserInfoExample <- runIO $ ByteString.readFile "test/data/getUserInfo_example.json"

    it "should be able to compare usernames for equality" $ do
      Username "Intolerable" `shouldBe` Username "intolerable"
      Username "Intolerable" `shouldBe` Username "Intolerable"
      Username "INTOLERABLE" `shouldBe` Username "intolerable"

    it "can read the examples" $ do
      aboutMeExample `shouldSatisfy` not . ByteString.null
      getUserInfoExample `shouldSatisfy` not . ByteString.null

    it "can parse a reddit user from json" $ do
      let decoded = eitherDecode aboutMeExample :: Either String User
      decoded `shouldSatisfy` isRight

      case decoded of
        Left _ -> expectationFailure "json parse failed"
        Right user -> do
          userID user `shouldBe` "4gf25"
          userName user `shouldBe` Username "Intolerable"
          linkKarma user `shouldBe` 2399
          commentKarma user `shouldBe` 44631
          hasMail user `shouldBe` Just False
          hasModMail user `shouldBe` Just False
          isFriend user `shouldBe` False
          userIsOver18 user `shouldBe` Just True
          isMod user `shouldBe` True
          hasGold user `shouldBe` False
          hasVerifiedEmail user `shouldBe` Just True

    it "can parse another reddit user from json" $ do
      let decoded = eitherDecode getUserInfoExample :: Either String User
      decoded `shouldSatisfy` isRight

      case decoded of
        Left _ -> expectationFailure "json parse failed"
        Right user -> do
          userID user `shouldBe` "gdifp"
          userName user `shouldBe` Username "intolerable-bot"
          linkKarma user `shouldBe` 1
          commentKarma user `shouldBe` 2668
          hasMail user `shouldBe` Nothing
          hasModMail user `shouldBe` Nothing
          isFriend user `shouldBe` False
          userIsOver18 user `shouldBe` Nothing
          isMod user `shouldBe` False
          hasGold user `shouldBe` False
          hasVerifiedEmail user `shouldBe` Just True