@@ -1,29 +1,32 @@
11module Servant.QuickCheck.Internal.Predicates where
22
33import Control.Exception (catch, throw)
4−import Control.Monad (when, unless, liftM2)
4+import Control.Monad (liftM2, unless, when)
55import Data.Aeson (Object, decode)
6+import Data.Bifunctor (first)
67import qualified Data.ByteString as SBS
78import qualified Data.ByteString.Char8 as SBSC
89import qualified Data.ByteString.Lazy as LBS
9−import Data.CaseInsensitive (mk)
10+import Data.CaseInsensitive (mk, foldedCase)
1011import Data.Either (isRight)
1112import Data.List.Split (wordsBy)
1213import Data.Maybe (fromMaybe, isJust)
1314import Data.Monoid ((<>))
14−import Data.Time (parseTimeM, defaultTimeLocale,
15− rfc822DateFormat, UTCTime)
15+import Data.Time (UTCTime, defaultTimeLocale, parseTimeM,
16+ rfc822DateFormat)
1617import GHC.Generics (Generic)
1718import Network.HTTP.Client (Manager, Request, Response, httpLbs,
18− method, requestHeaders, responseBody,
19− responseHeaders, parseRequest, responseStatus)
19+ method, parseRequest, requestHeaders,
20+ responseBody, responseHeaders,
21+ responseStatus)
2022import Network.HTTP.Media (matchAccept)
2123import Network.HTTP.Types (methodGet, methodHead, parseMethod,
2224 renderStdMethod, status100, status200,
2325 status201, status300, status401,
2426 status405, status500)
25−import System.Clock (toNanoSecs, Clock(Monotonic), getTime, diffTimeSpec)
2627import Prelude.Compat
28+import System.Clock (Clock (Monotonic), diffTimeSpec,
29+ getTime, toNanoSecs)
2730
2831import Servant.QuickCheck.Internal.ErrorTypes
2932
@@ -80,9 +83,15 @@ notLongerThan maxAllowed
8083-- /Since 0.0.0.0/
8184onlyJsonObjects :: ResponsePredicate
8285onlyJsonObjects
83− = ResponsePredicate (\resp -> case decode (responseBody resp) of
86+ = ResponsePredicate (\resp -> case go resp of
8487 Nothing -> throw $ PredicateFailure "onlyJsonObjects" Nothing resp
85− Just (_ :: Object) -> return ())
88+ Just () -> return ())
89+ where
90+ go r = do
91+ ctyp <- lookup "content-type" (first foldedCase <$> responseHeaders r)
92+ when ("application/json" `SBS.isPrefixOf` ctyp) $ do
93+ (_ :: Object) <- decode (responseBody r)
94+ return ()
8695
8796-- | __Optional__
8897--
@@ -353,7 +362,7 @@ instance Monoid ResponsePredicate where
353362--
354363-- /Since 0.0.0.0/
355364newtype RequestPredicate = RequestPredicate
356− { getRequestPredicate :: Request -> Manager -> IO [Response LBS.ByteString]
365+ { getRequestPredicate :: Request -> Manager -> IO [Response LBS.ByteString]
357366 } deriving (Generic)
358367
359368-- TODO: This isn't actually a monoid
@@ -364,7 +373,7 @@ instance Monoid RequestPredicate where
364373
365374-- | A set of predicates. Construct one with 'mempty' and '<%>'.
366375data Predicates = Predicates
367− { requestPredicates :: RequestPredicate
376+ { requestPredicates :: RequestPredicate
368377 , responsePredicates :: ResponsePredicate
369378 } deriving (Generic)
370379