@@ -8,22 +8,24 @@ module Servant.API.ContentTypesSpec where
88import Control.Applicative
99import Control.Arrow
1010import Data.Aeson
11−import Data.Function (on)
11+import Data.Aeson.Parser (jstring)
12+import Data.Attoparsec.ByteString (parseOnly)
13+import Data.Function (on)
1214import Data.Proxy
1315
14−import Data.ByteString.Char8 (ByteString, append, pack)
15−import qualified Data.ByteString.Lazy as BSL
16−import Data.List (maximumBy)
17−import Data.Maybe (fromJust, isJust, isNothing)
18−import Data.String (IsString (..))
19−import Data.String.Conversions (cs)
20−import qualified Data.Text as TextS
21−import qualified Data.Text.Lazy as TextL
16+import Data.ByteString.Char8 (ByteString, append, pack)
17+import qualified Data.ByteString.Lazy as BSL
18+import Data.List (maximumBy)
19+import Data.Maybe (fromJust, isJust, isNothing)
20+import Data.String (IsString (..))
21+import Data.String.Conversions (cs)
22+import qualified Data.Text as TextS
23+import qualified Data.Text.Lazy as TextL
2224import GHC.Generics
23−import Network.URL (importParams, exportParams)
25+import Network.URL (exportParams, importParams)
2426import Test.Hspec
2527import Test.QuickCheck
26−import Test.QuickCheck.Instances ()
28+import Test.QuickCheck.Instances ()
2729
2830import Servant.API.ContentTypes
2931
@@ -42,17 +44,23 @@ spec = describe "Servant.API.ContentTypes" $ do
4244
4345 describe "The FormUrlEncoded Content-Type type" $ do
4446
47+ let isNonNull ("", "") = False
48+ isNonNull _ = True
49+
4550 it "has fromByteString reverse toByteString" $ do
4651 let p = Proxy :: Proxy FormUrlEncoded
47− property $ \x -> fromByteString p (toByteString p x) == Right (x::[(TextS.Text,TextS.Text)])
52+ property $ \x -> all isNonNull x
53+ ==> fromByteString p (toByteString p x) == Right (x::[(TextS.Text,TextS.Text)])
4854
4955 it "has fromByteString reverse exportParams (Network.URL)" $ do
5056 let p = Proxy :: Proxy FormUrlEncoded
51− property $ \x -> (fromByteString p . cs . exportParams . map (cs *** cs) $ x) == Right (x::[(TextS.Text,TextS.Text)])
57+ property $ \x -> all isNonNull x
58+ ==> (fromByteString p . cs . exportParams . map (cs *** cs) $ x) == Right (x::[(TextS.Text,TextS.Text)])
5259
5360 it "has importParams (Network.URL) reverse toByteString" $ do
5461 let p = Proxy :: Proxy FormUrlEncoded
55− property $ \x -> (fmap (map (cs *** cs)) . importParams . cs . toByteString p $ x) == Just (x::[(TextS.Text,TextS.Text)])
62+ property $ \x -> all isNonNull x
63+ ==> (fmap (map (cs *** cs)) . importParams . cs . toByteString p $ x) == Just (x::[(TextS.Text,TextS.Text)])
5664
5765 describe "The PlainText Content-Type type" $ do
5866
@@ -148,6 +156,14 @@ spec = describe "Servant.API.ContentTypes" $ do
148156 (encode val)
149157 `shouldBe` Just (Right val)
150158
159+ describe "eitherDecodeLenient" $ do
160+
161+ it "parses top-level strings" $ do
162+ let toMaybe = either (const Nothing) Just
163+ -- The Left messages differ, so convert to Maybe
164+ property $ \x -> toMaybe (eitherDecodeLenient x)
165+ `shouldBe` toMaybe (parseOnly jstring $ cs x)
166+
151167
152168data SomeData = SomeData { record1 :: String, record2 :: Int }
153169 deriving (Generic, Eq, Show)