@@ -1,19 +1,20 @@
1-- | This module contains wrappers around lower-level functionality.
1-- | This module contains wrappers around lower-level functionality.
2module Servant.QuickCheck.Internal.QuickCheck where
2module Servant.QuickCheck.Internal.QuickCheck where
4+import qualified Data.ByteString.Lazy as LBS
4import Data.Proxy (Proxy)
5import Data.Proxy (Proxy)
6+import Data.Text (Text)
7+import Network.HTTP.Client (Manager, Request, checkStatus,
5−import Network.HTTP.Client (Manager, defaultManagerSettings,
8+ defaultManagerSettings, httpLbs,
6− newManager, httpLbs, checkStatus, Request)
9+ newManager)
7import Network.Wai.Handler.Warp (withApplication)
10import Network.Wai.Handler.Warp (withApplication)
8import Servant (HasServer, Server, serve)
11import Servant (HasServer, Server, serve)
9−import Servant.Client (BaseUrl (..), Scheme (..) )
12+import Servant.Client (BaseUrl (..), Scheme (..))
13+import System.IO.Unsafe (unsafePerformIO)
10import Test.Hspec (Expectation, expectationFailure)
14import Test.Hspec (Expectation, expectationFailure)
11import Test.QuickCheck (Args (..), Result (..),
15import Test.QuickCheck (Args (..), Result (..),
12 quickCheckWithResult)
16 quickCheckWithResult)
13−import System.IO.Unsafe (unsafePerformIO)
14−import Test.QuickCheck.Monadic
17+import Test.QuickCheck.Monadic
15−import qualified Data.ByteString.Lazy as LBS
16−import Data.Text (Text)
18import Servant.QuickCheck.Internal.HasGenRequest
19import Servant.QuickCheck.Internal.HasGenRequest
19import Servant.QuickCheck.Internal.Predicates
20import Servant.QuickCheck.Internal.Predicates
@@ -54,13 +55,29 @@ serversEqual api burl1 burl2 args req = do
54 NoExpectedFailure {} -> expectationFailure $ "No expected failure"
55 NoExpectedFailure {} -> expectationFailure $ "No expected failure"
55 InsufficientCoverage {} -> expectationFailure $ "Insufficient coverage"
56 InsufficientCoverage {} -> expectationFailure $ "Insufficient coverage"
58+-- | Check that a server satisfies the set of properties specified.
60+-- Note that, rather than having separate tests for each property you'd like to
61+-- test, you should generally prefer to combine all properties into a single
62+-- test. This enables a more parsimonious generation of requests and responses
63+-- with the same testing depth.
67+-- > goodAPISpec = describe "my server" $ do
69+-- > it "follows best practices" $ do
70+-- > withServantServer api server $ \burl ->
71+-- > serverSatisfies api burl stdArgs (not500
72+-- > <%> onlyJsonObjects
73+-- > <%> notAllowedContainsAllowHeader
57serverSatisfies :: (HasGenRequest a) =>
75serverSatisfies :: (HasGenRequest a) =>
58 Proxy a -> BaseUrl -> Args -> Predicates [Text] [Text] -> Expectation
76 Proxy a -> BaseUrl -> Args -> Predicates [Text] [Text] -> Expectation
59serverSatisfies api burl args preds = do
77serverSatisfies api burl args preds = do
60 let reqs = ($ burl) <$> genRequest api
78 let reqs = ($ burl) <$> genRequest api
61 r <- quickCheckWithResult args $ monadicIO $ forAllM reqs $ \req -> do
79 r <- quickCheckWithResult args $ monadicIO $ forAllM reqs $ \req -> do
62 v <- run $ finishPredicates preds (noCheckStatus req) defManager
80 v <- run $ finishPredicates preds (noCheckStatus req) defManager
64 assert $ null v
81 assert $ null v
66 Success {} -> return ()
83 Success {} -> return ()