{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE ScopedTypeVariables #-} module Main where import Control.Applicative import Control.Monad import Test.Hspec import Test.SmallCheck import Test.SmallCheck.Series import Test.Hspec.SmallCheck import Data.Monoid ((<>)) import Data.Function import Data.List import Data.HashMap.Strict (HashMap) import qualified Data.HashMap.Strict as HMS import Data.Text (Text) import qualified Data.Text as T import Data.Vector (Vector) import qualified Data.Vector as V import Data.Time import Data.Time.Clock.POSIX import Data.Aeson import Data.Aeson.Types import Data.Aeson.Encode.Pretty import Network.HTTP.Conduit import GitHub.Types.Events main :: IO () main = do httpManager <- newManager tlsManagerSettings hspec $ spec httpManager spec :: Manager -> Spec spec httpManager = do describe "GitHub.Types.Event" $ do it "should parse all events from the public timeline" $ flip shouldReturn True $ do req <- parseUrl $ "https://api.github.com/events" body <- httpLbs (req { requestHeaders = ("User-Agent", "githb-types-haskell-test") : requestHeaders req }) httpManager case eitherDecode (responseBody body) :: Either String [Value] of Left e -> fail $ "Failed to parse response as list of JSON values: " <> e Right x -> do forM_ x $ \v -> do case fromJSON v :: Result Event of Error s -> fail $ "Failed to parse event " <> s <> ", payload: " <> show (encodePretty v) _ -> return () return True