servant-quickcheck 0.0.2.2 → 0.0.2.3
raw patch · 4 files changed
+56/−9 lines, 4 filesdep ~hspec
Dependency ranges changed: hspec
Files
- CHANGELOG.yaml +8/−0
- servant-quickcheck.cabal +2/−2
- src/Servant/QuickCheck/Internal/HasGenRequest.hs +8/−7
- test/Servant/QuickCheck/InternalSpec.hs +38/−0
CHANGELOG.yaml view
@@ -2,6 +2,14 @@ releases: + - version: "0.0.2.3"+ changes:++ - description: Fix QueryParam and QueryFlag requests+ issue: 23+ authors: declension+ date: 2017-03-10+ - version: "0.0.2.2" changes:
servant-quickcheck.cabal view
@@ -1,5 +1,5 @@ name: servant-quickcheck-version: 0.0.2.2+version: 0.0.2.3 synopsis: QuickCheck entire APIs description: This packages provides QuickCheck properties that are tested across an entire@@ -38,7 +38,7 @@ , case-insensitive == 1.2.* , clock >= 0.7 && < 0.8 , data-default-class >= 0.0 && < 0.2- , hspec == 2.2.*+ , hspec >= 2.2 && < 2.4 , http-client >= 0.4.30 && < 0.6 , http-media == 0.6.* , http-types > 0.8 && < 0.10
src/Servant/QuickCheck/Internal/HasGenRequest.hs view
@@ -15,9 +15,8 @@ import Servant.API.ContentTypes (AllMimeRender (..)) import Servant.Client (BaseUrl (..), Scheme (..)) import Test.QuickCheck (Arbitrary (..), Gen, elements, oneof)-#if MIN_VERSION_servant(0,8,0)+ import qualified Data.ByteString as BS-#endif class HasGenRequest a where@@ -91,9 +90,10 @@ genRequest _ = do new' <- new old' <- old- return $ \burl -> let r = old' burl in r {- queryString = queryString r- <> param <> "=" <> cs (toQueryParam new') }+ return $ \burl -> let r = old' burl+ newExpr = param <> "=" <> cs (toQueryParam new')+ qs = queryString r in r {+ queryString = if BS.null qs then newExpr else newExpr <> "&" <> qs } where old = genRequest (Proxy :: Proxy b) param = cs $ symbolVal (Proxy :: Proxy x)@@ -118,8 +118,9 @@ => HasGenRequest (QueryFlag x :> b) where genRequest _ = do old' <- old- return $ \burl -> let r = old' burl in r {- queryString = queryString r <> param <> "=" }+ return $ \burl -> let r = old' burl+ qs = queryString r in r {+ queryString = if BS.null qs then param else param <> "&" <> qs } where old = genRequest (Proxy :: Proxy b) param = cs $ symbolVal (Proxy :: Proxy x)
test/Servant/QuickCheck/InternalSpec.hs view
@@ -4,12 +4,16 @@ import Control.Concurrent.MVar (newMVar, readMVar, swapMVar) import Control.Monad.IO.Class (liftIO) import qualified Data.ByteString as BS+import qualified Data.ByteString.Char8 as C import Prelude.Compat import Servant import Test.Hspec (Spec, context, describe, it, shouldBe, shouldContain) import Test.Hspec.Core.Spec (Arg, Example, Result (..), defaultParams, evaluateExample)+import Test.QuickCheck.Gen (unGen)+import Test.QuickCheck.Random (mkQCGen)+import Network.HTTP.Client (queryString) #if MIN_VERSION_servant(0,8,0) import Servant.API.Internal.Test.ComprehensiveAPI (comprehensiveAPIWithoutRaw)@@ -28,6 +32,8 @@ isComprehensiveSpec onlyJsonObjectSpec notLongerThanSpec+ queryParamsSpec+ queryFlagsSpec serversEqualSpec :: Spec serversEqualSpec = describe "serversEqual" $ do@@ -107,7 +113,28 @@ let _g = genRequest comprehensiveAPIWithoutRaw True `shouldBe` True -- This is a type-level check +queryParamsSpec :: Spec+queryParamsSpec = describe "QueryParams" $ do + it "reduce to an HTTP query string correctly" $ do+ let rng = mkQCGen 0+ burl = BaseUrl Http "localhost" 80 ""+ gen = genRequest paramsAPI+ req = (unGen gen rng 0) burl+ qs = C.unpack $ queryString req+ qs `shouldBe` "one=_&two=_"++queryFlagsSpec :: Spec+queryFlagsSpec = describe "QueryFlags" $ do++ it "reduce to an HTTP query string correctly" $ do+ let rng = mkQCGen 0+ burl = BaseUrl Http "localhost" 80 ""+ gen = genRequest flagsAPI+ req = (unGen gen rng 0) burl+ qs = C.unpack $ queryString req+ qs `shouldBe` "one&two"+ ------------------------------------------------------------------------------ -- APIs ------------------------------------------------------------------------------@@ -118,6 +145,17 @@ api :: Proxy API api = Proxy++type ParamsAPI = QueryParam "one" () :> QueryParam "two" () :> Get '[JSON] ()++paramsAPI :: Proxy ParamsAPI+paramsAPI = Proxy++type FlagsAPI = QueryFlag "one" :> QueryFlag "two" :> Get '[JSON] ()++flagsAPI :: Proxy FlagsAPI+flagsAPI = Proxy+ server :: IO (Server API) server = do