packages feed

heddit-0.0.1: io-tests/UserSpec.hs

{-# 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 ]

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