content: module Reddit.Actions.UserSpec where
  
  import Reddit.Actions.User
  import Reddit.Types.Comment
  import Reddit.Types.Listing
  import Reddit.Types.Options
  import Reddit.Types.User
  
  import ConfigLoad
  import Control.Monad
  import Data.Maybe
  import Data.Time.Clock
  import Test.Hspec
  
  isRight :: Either a b -> Bool
  isRight = const False `either` const True
  
  main :: IO ()
  main = hspec spec
  
  spec :: Spec
  spec = describe "Reddit.Actions.User" $ do
    (reddit, username, _) <- runIO loadConfig
    time <- runIO getCurrentTime
  
    it "should be able to get the user's most recent comments" $ do
      res <- run reddit $ getUserComments username
      res `shouldSatisfy` isRight
      case res of
        Left _ -> expectationFailure "something failed"
        Right (Listing _ _ cs) ->
          forM_ cs $ \c -> do
            author c `shouldBe` username
            replies c `shouldSatisfy` (\(Listing _ _ x) -> null x)
            created c `shouldSatisfy` (< time)
  
    it "should be able to get multiple pages of user comments" $ do
      res <- run reddit $ getUserComments' (Options Nothing (Just 1)) username
      res `shouldSatisfy` isRight
      case res of
        Right (Listing _ (Just a) (c:[])) -> do
          next <- run reddit $ getUserComments' (Options (Just $ After a) (Just 1)) username
          next `shouldSatisfy` isRight
          case next of
            Right (Listing _ _ (d:[])) ->
              c `shouldSatisfy` (/= d)
            _ -> expectationFailure "something failed"
        _ -> expectationFailure "something failed"
  
    it "should be able to get the user's about me info" $ do
      res <- run reddit aboutMe
      res `shouldSatisfy` isRight
      case res of
        Left _ -> expectationFailure "something failed"
        Right user -> do
          userName user `shouldBe` username
          userCreated user `shouldSatisfy` (< time)
          hasMail user `shouldSatisfy` isJust
          isFriend user `shouldBe` False
  
    it "should be able to get the user info for a user" $ do
      res <- run reddit $ getUserInfo username
      res `shouldSatisfy` isRight
  
    it "should be able to check if a username is available" $ do
      res <- run reddit $ isUsernameAvailable username
      res `shouldSatisfy` isRight
      case res of
        Left _ -> return ()
        Right avail -> avail `shouldBe` False
  