heddit-0.0.1: tests/Main.hs
{-# LANGUAGE TypeApplications #-}
module Main where
import Data.Aeson ( eitherDecodeFileStrict' )
import Data.Either ( isRight )
import Data.Sequence ( Seq )
import Network.Reddit.Types
import Network.Reddit.Types.Account
import Network.Reddit.Types.Comment
import Network.Reddit.Types.Emoji
import Network.Reddit.Types.Flair
import Network.Reddit.Types.Live
import Network.Reddit.Types.Message
import Network.Reddit.Types.Moderation
import Network.Reddit.Types.Multireddit
import Network.Reddit.Types.Submission
import Network.Reddit.Types.Subreddit
import Network.Reddit.Types.Widget
import Network.Reddit.Types.Wiki
import Test.Hspec
main :: IO ()
main = sequence_ [ decodeAccountTypes
, decodeCommentTypes
, decodeSubmissionTypes
, decodeSubredditTypes
, decodeMessageTypes
, decodeModerationTypes
, decodeFlairTypes
, decodeWikiTypes
, decodeWidgetTypes
, decodeEmojiTypes
, decodeLiveTypes
]
{- HLINT ignore "Redundant do"-}
decodeAccountTypes :: IO ()
decodeAccountTypes = hspec $ do
describe "Network.Reddit.Types.Account" $ do
it "decodes Account" $ do
userAccount <- eitherDecodeFileStrict' @Account
$ typesDataPath "user-account.json"
userAccount `shouldSatisfy` isRight
it "decodes FriendList" $ do
friendList <- eitherDecodeFileStrict' @FriendList
$ typesDataPath "friend-list.json"
friendList `shouldSatisfy` isRight
it "decodes KarmaList" $ do
karmaList <- eitherDecodeFileStrict' @KarmaList
$ typesDataPath "karma-list.json"
karmaList `shouldSatisfy` isRight
it "decodes TrophyList" $ do
trophyList <- eitherDecodeFileStrict' @TrophyList
$ typesDataPath "trophy-list.json"
trophyList `shouldSatisfy` isRight
it "decodes Preferences" $ do
trophyList <- eitherDecodeFileStrict' @Preferences
$ typesDataPath "prefs.json"
trophyList `shouldSatisfy` isRight
decodeCommentTypes :: IO ()
decodeCommentTypes = hspec $ do
describe "Network.Reddit.Types.Comment" $ do
it "decodes (Listing CommentID Comment)" $ do
commentListing
<- eitherDecodeFileStrict' @(Listing CommentID Comment)
$ typesDataPath "comment-listing.json"
commentListing `shouldSatisfy` isRight
decodeSubmissionTypes :: IO ()
decodeSubmissionTypes = hspec $ do
describe "Network.Reddit.Types.Submission" $ do
it "decodes Submission" $ do
submission <- eitherDecodeFileStrict' @Submission
$ typesDataPath "submission.json"
submission `shouldSatisfy` isRight
describe "Network.Reddit.Types.Collection" $ do
it "decodes Collection" $ do
collection <- eitherDecodeFileStrict' @Collection
$ typesDataPath "collection.json"
collection `shouldSatisfy` isRight
decodeSubredditTypes :: IO ()
decodeSubredditTypes = hspec $ do
describe "Network.Reddit.Types.Subreddit" $ do
it "decodes Subreddit" $ do
sr <- eitherDecodeFileStrict' @Subreddit
$ typesDataPath "subreddit.json"
sr `shouldSatisfy` isRight
it "decodes PostRequirements" $ do
postRequirements <- eitherDecodeFileStrict' @PostRequirements
$ typesDataPath "post-requirements.json"
postRequirements `shouldSatisfy` isRight
it "decodes SubredditRule" $ do
postRequirements <- eitherDecodeFileStrict' @SubredditRule
$ typesDataPath "rule.json"
postRequirements `shouldSatisfy` isRight
it "decodes Multireddit" $ do
postRequirements <- eitherDecodeFileStrict' @(Seq Multireddit)
$ typesDataPath "multireddits.json"
postRequirements `shouldSatisfy` isRight
decodeMessageTypes :: IO ()
decodeMessageTypes = hspec $ do
describe "Network.Reddit.Types.Message" $ do
it "decodes Message" $ do
msg <- eitherDecodeFileStrict' @(Listing MessageID Message)
$ typesDataPath "message-listing.json"
msg `shouldSatisfy` isRight
decodeModerationTypes :: IO ()
decodeModerationTypes = hspec $ do
describe "Network.Reddit.Types.Moderation" $ do
it "decodes Ban" $ do
ban <- eitherDecodeFileStrict' @Ban $ typesDataPath "ban.json"
ban `shouldSatisfy` isRight
it "decodes SubredditSettings" $ do
settings <- eitherDecodeFileStrict' @SubredditSettings
$ typesDataPath "subreddit-settings.json"
settings `shouldSatisfy` isRight
it "decodes Modmail" $ do
settings <- eitherDecodeFileStrict' @Modmail
$ typesDataPath "modmail.json"
settings `shouldSatisfy` isRight
it "decodes (Listing ModActionID ModAction)" $ do
modlog <- eitherDecodeFileStrict' @(Listing ModActionID ModAction)
$ typesDataPath "modaction-listing.json"
modlog `shouldSatisfy` isRight
it "decodes ModInviteeList" $ do
invitees <- eitherDecodeFileStrict' @ModInviteeList
$ typesDataPath "modinvitee-list.json"
invitees `shouldSatisfy` isRight
it "decodes Traffic" $ do
traffic <- eitherDecodeFileStrict' @Traffic
$ typesDataPath "traffic.json"
traffic `shouldSatisfy` isRight
it "decodes S3ModerationLease" $ do
lease <- eitherDecodeFileStrict' @S3ModerationLease
$ typesDataPath "upload-lease.json"
lease `shouldSatisfy` isRight
decodeFlairTypes :: IO ()
decodeFlairTypes = hspec $ do
describe "Network.Reddit.Types.Flair" $ do
it "decodes FlairTemplate" $ do
flairTemplate <- eitherDecodeFileStrict' @FlairTemplate
$ typesDataPath "flair-template.json"
flairTemplate `shouldSatisfy` isRight
describe "Network.Reddit.Types.Flair" $ do
it "decodes FlairChoice" $ do
flairChoices <- eitherDecodeFileStrict' @FlairChoiceList
$ typesDataPath "flair-response.json"
flairChoices `shouldSatisfy` isRight
describe "Network.Reddit.Types.Flair" $ do
it "decodes UserFlair" $ do
userFlair <- eitherDecodeFileStrict' @CurrentUserFlair
$ typesDataPath "flair-response.json"
userFlair `shouldSatisfy` isRight
decodeWikiTypes :: IO ()
decodeWikiTypes = hspec $ do
describe "Network.Reddit.Types.Wiki" $ do
it "decodes WikiPage" $ do
wikiPage <- eitherDecodeFileStrict' @WikiPage
$ typesDataPath "wikipage.json"
wikiPage `shouldSatisfy` isRight
it "decodes WikiRevision" $ do
wikiRevListing <- eitherDecodeFileStrict' --
@(Listing WikiRevisionID WikiRevision)
$ typesDataPath "wiki-revision-listing.json"
wikiRevListing `shouldSatisfy` isRight
it "decodes WikiPageSettings" $ do
wikipageSettings <- eitherDecodeFileStrict' @WikiPageSettings
$ typesDataPath "wikipage-settings.json"
wikipageSettings `shouldSatisfy` isRight
decodeWidgetTypes :: IO ()
decodeWidgetTypes = hspec $ do
describe "Network.Reddit.Types.Widget" $ do
it "decodes Widget" $ do
widgets <- eitherDecodeFileStrict' @WidgetList
$ typesDataPath "widgets.json"
widgets `shouldSatisfy` isRight
decodeEmojiTypes :: IO ()
decodeEmojiTypes = hspec $ do
describe "Network.Reddit.Types.Emoji" $ do
it "decodes Widget" $ do
emojis <- eitherDecodeFileStrict' @EmojiList
$ typesDataPath "emoji-list.json"
emojis `shouldSatisfy` isRight
decodeLiveTypes :: IO ()
decodeLiveTypes = hspec $ do
describe "Network.Reddit.Types.Live" $ do
it "decodes LiveThread" $ do
liveThread
<- eitherDecodeFileStrict' @(Listing LiveThreadID LiveThread)
$ typesDataPath "live-thread.json"
liveThread `shouldSatisfy` isRight
it "decodes LiveUpdate" $ do
liveUpdates
<- eitherDecodeFileStrict' @(Listing LiveUpdateID LiveUpdate)
$ typesDataPath "live-update.json"
liveUpdates `shouldSatisfy` isRight
it "decodes LiveContributorList" $ do
liveContributors <- eitherDecodeFileStrict' @LiveContributorList
$ typesDataPath "live-contributor-list.json"
liveContributors `shouldSatisfy` isRight
typesDataPath :: FilePath -> FilePath
typesDataPath = (<>) "./tests/data/types/"