@@ -8,22 +8,24 @@ module Servant.API.ContentTypesSpec where
8import Control.Applicative
8import Control.Applicative
9import Control.Arrow
9import Control.Arrow
10import Data.Aeson
10import Data.Aeson
11+import Data.Aeson.Parser (jstring)
12+import Data.Attoparsec.ByteString (parseOnly)
11−import Data.Function (on)
13+import Data.Function (on)
12import Data.Proxy
14import Data.Proxy
14−import Data.ByteString.Char8 (ByteString, append, pack)
16+import Data.ByteString.Char8 (ByteString, append, pack)
15−import qualified Data.ByteString.Lazy as BSL
17+import qualified Data.ByteString.Lazy as BSL
16−import Data.List (maximumBy)
18+import Data.List (maximumBy)
17−import Data.Maybe (fromJust, isJust, isNothing)
19+import Data.Maybe (fromJust, isJust, isNothing)
18−import Data.String (IsString (..))
20+import Data.String (IsString (..))
19−import Data.String.Conversions (cs)
21+import Data.String.Conversions (cs)
20−import qualified Data.Text as TextS
22+import qualified Data.Text as TextS
21−import qualified Data.Text.Lazy as TextL
23+import qualified Data.Text.Lazy as TextL
22import GHC.Generics
24import GHC.Generics
23−import Network.URL (importParams, exportParams)
25+import Network.URL (exportParams, importParams)
24import Test.Hspec
26import Test.Hspec
25import Test.QuickCheck
27import Test.QuickCheck
26−import Test.QuickCheck.Instances ()
28+import Test.QuickCheck.Instances ()
28import Servant.API.ContentTypes
30import Servant.API.ContentTypes
@@ -42,17 +44,23 @@ spec = describe "Servant.API.ContentTypes" $ do
43 describe "The FormUrlEncoded Content-Type type" $ do
45 describe "The FormUrlEncoded Content-Type type" $ do
47+ let isNonNull ("", "") = False
45 it "has fromByteString reverse toByteString" $ do
50 it "has fromByteString reverse toByteString" $ do
46 let p = Proxy :: Proxy FormUrlEncoded
51 let p = Proxy :: Proxy FormUrlEncoded
52+ property $ \x -> all isNonNull x
47− property $ \x -> fromByteString p (toByteString p x) == Right (x::[(TextS.Text,TextS.Text)])
53+ ==> fromByteString p (toByteString p x) == Right (x::[(TextS.Text,TextS.Text)])
49 it "has fromByteString reverse exportParams (Network.URL)" $ do
55 it "has fromByteString reverse exportParams (Network.URL)" $ do
50 let p = Proxy :: Proxy FormUrlEncoded
56 let p = Proxy :: Proxy FormUrlEncoded
57+ property $ \x -> all isNonNull x
51− property $ \x -> (fromByteString p . cs . exportParams . map (cs *** cs) $ x) == Right (x::[(TextS.Text,TextS.Text)])
58+ ==> (fromByteString p . cs . exportParams . map (cs *** cs) $ x) == Right (x::[(TextS.Text,TextS.Text)])
53 it "has importParams (Network.URL) reverse toByteString" $ do
60 it "has importParams (Network.URL) reverse toByteString" $ do
54 let p = Proxy :: Proxy FormUrlEncoded
61 let p = Proxy :: Proxy FormUrlEncoded
62+ property $ \x -> all isNonNull x
55− property $ \x -> (fmap (map (cs *** cs)) . importParams . cs . toByteString p $ x) == Just (x::[(TextS.Text,TextS.Text)])
63+ ==> (fmap (map (cs *** cs)) . importParams . cs . toByteString p $ x) == Just (x::[(TextS.Text,TextS.Text)])
57 describe "The PlainText Content-Type type" $ do
65 describe "The PlainText Content-Type type" $ do
@@ -148,6 +156,14 @@ spec = describe "Servant.API.ContentTypes" $ do
148 (encode val)
156 (encode val)
149 `shouldBe` Just (Right val)
157 `shouldBe` Just (Right val)
159+ describe "eitherDecodeLenient" $ do
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)
152data SomeData = SomeData { record1 :: String, record2 :: Int }
168data SomeData = SomeData { record1 :: String, record2 :: Int }
153 deriving (Generic, Eq, Show)
169 deriving (Generic, Eq, Show)