packages feed

heddit-0.2: io-tests/UserSpec.hs

{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE TypeApplications #-}

module UserSpec ( spec ) where

import           Data.Generics.Labels ()
import           Data.Time

import           Lens.Micro.GHC

import           Network.Reddit

import           Test.Hspec

spec :: Spec
spec = beforeAll (loadClient Nothing) . describe "Network.Reddit.User"
    $ sequence_ [ users
                , trophies
                , submissions
                , summaries
                , searches
                , moderated
                , banned
                ]

users :: SpecWith Client
users = it "gets a user" $ \c -> do
    user <- runReddit c $ getUser =<< mkUsername "edwardkmett"
    user ^. #userID `shouldBe` UserID "26009"
    user ^. #created `shouldBe` read @UTCTime "2007-07-13 07:11:06 +0000"
    user ^. #commentKarma `shouldSatisfy` (> 50000)
    user ^. #linkKarma `shouldSatisfy` (> 6000)

trophies :: SpecWith Client
trophies = it "gets a user's trophies" $ \c -> do
    ts <- runReddit c $ getUserTrophies =<< mkUsername "edwardkmett"
    case ts ^? each . filtered ((Just "4" ==) . (^. #awardID)) of
        Nothing     -> expectationFailure "Failed to get correct user trophies"
        Just trophy -> do
            trophy ^. #name `shouldBe` "Best Comment"
            trophy ^. #trophyID `shouldBe` Just "y35z3"

submissions :: SpecWith Client
submissions = it "gets a user's submissions" $ \c -> do
    let opts      = defaultItemOpts
            & (#itemTime ?~ AllTime) . (#itemSort ?~ Top)
        paginator = emptyPaginator & (#limit .~ 1) . (#opts .~ opts)
    username <- mkUsername "bgamari"
    ss <- runReddit c $ getUserSubmissions username paginator
    case ss ^? #children . _head of
        Nothing         -> expectationFailure "Failed to get user ss"
        Just submission -> do
            submission ^. #submissionID `shouldBe` SubmissionID "4kdzp2"
            submission ^. #numComments `shouldBe` 124

summaries :: SpecWith Client
summaries = it "gets user summaries" $ \c -> do
    account <- runReddit c $ getUser =<< mkUsername "edwardkmett"
    summary <- runReddit c . getUserSummary $ account ^. #userID
    summary ^. #userID `shouldBe` Just (UserID "26009")
    summary ^. #commentKarma `shouldSatisfy` (> 50000)
    summary ^. #linkKarma `shouldSatisfy` (> 6000)
    summary ^. #profileColor `shouldBe` Nothing
    summary ^. #profileOver18 `shouldBe` False

searches :: SpecWith Client
searches = it "searches users by name" $ \c -> do
    results <- runReddit c . firstPage $ searchUsers "edwardkmett"
    case results ^? _head of
        Nothing -> expectationFailure "Failed to search users"
        Just u  -> do
            username <- mkUsername "edwardkmett"
            u ^. #username `shouldBe` username

moderated :: SpecWith Client
moderated = it "searches users by name" $ \c -> do
    ms <- runReddit c $ getUserModerated =<< mkUsername "edwardkmett"
    subname <- mkSubredditName "haskell"
    (ms ^.. each . #name) `shouldContain` [ subname ]

banned :: SpecWith Client
banned =
    it "throws the correct exception when getting a banned user" $ \c -> do
        username <- mkUsername "Unidan"
        let action = getUser username
            ex     = \case
                UserIsBanned (BannedUser uname _ True)
                    | uname == username -> True
                _ -> False
        runReddit c action `shouldThrow` ex