content: module Reddit.Actions.CommentSpec where
  
  import Reddit.Actions.Comment
  import Reddit.Types.Comment
  import Reddit.Types.Listing
  
  import ConfigLoad
  import Test.Hspec
  
  isRight :: Either a b -> Bool
  isRight = const False `either` const True
  
  isLeft :: Either a b -> Bool
  isLeft = const True `either` const False
  
  main :: IO ()
  main = hspec spec
  
  spec :: Spec
  spec = describe "Reddit.Actions.Comment" $ do
    (reddit, _, _) <- runIO loadConfig
  
    it "should be able to get info for a comment" $ do
      res <- run reddit $ getCommentInfo (CommentID "c60o0iw")
      res `shouldSatisfy` isRight
  
    it "should be able to get info for multiple comments" $ do
      res <- run reddit $ getCommentsInfo [CommentID "c60o0iw", CommentID "c4zrenn"]
      res `shouldSatisfy` isRight
      case res of
        Right (Listing _ _ cs) -> length cs `shouldBe` 2
        Left _ -> expectationFailure "something failed"
  
    it "should fail if we try to get an invalid comment" $ do
      res <- run reddit $ getCommentInfo (CommentID "!!!!!!!")
      res `shouldSatisfy` isLeft
  
    it "shouldn't be able to get a list of comment IDs where some are invalid" $ do
      res <- run reddit $ getCommentsInfo [CommentID "c60o0iw", CommentID "!!!!!!!"]
      res `shouldSatisfy` isLeft
  
    it "should be able to get mass comment IDs" $ do
      let a = replicate 100 $ CommentID "c60o0iw"
      res <- run reddit $ getCommentsInfo a
      res `shouldSatisfy` isRight
      case res of
        Left _ -> expectationFailure "something failed"
        Right (Listing _ _ ps) ->
          length ps `shouldBe` length a
  
    it "should fail if it tries to get TOO many comment IDs" $ do
      let a = replicate 101 $ CommentID "c60o0iw"
      res <- run reddit $ getCommentsInfo a
      res `shouldSatisfy` isLeft
  