@@ -10,6 +10,7 @@ module Servant.API.ContentTypesSpec where
1010import Control.Applicative
1111#endif
1212import Control.Arrow
13+import Data.Either
1314import Data.Aeson
1415import Data.Aeson.Parser (jstring)
1516import Data.Attoparsec.ByteString (parseOnly)
@@ -25,6 +26,7 @@ import Data.String.Conversions (cs)
2526import qualified Data.Text as TextS
2627import qualified Data.Text.Lazy as TextL
2728import GHC.Generics
29+import Data.Monoid
2830import Network.URL (exportParams, importParams)
2931import Test.Hspec
3032import Test.QuickCheck
@@ -36,54 +38,53 @@ spec :: Spec
3638spec = describe "Servant.API.ContentTypes" $ do
3739
3840 describe "The JSON Content-Type type" $ do
41+ let p = Proxy :: Proxy JSON
42+
43+ it "handles whitespace at end of input" $ do
44+ mimeUnrender p "[1] " `shouldBe` Right [1 :: Int]
45+
46+ it "does not like junk at end of input" $ do
47+ mimeUnrender p "[1] this probably shouldn't work"
48+ `shouldSatisfy` (isLeft :: Either a [Int] -> Bool)
3949
4050 it "has mimeUnrender reverse mimeRender for valid top-level json ([Int]) " $ do
41− let p = Proxy :: Proxy JSON
4251 property $ \x -> mimeUnrender p (mimeRender p x) == Right (x::[Int])
4352
4453 it "has mimeUnrender reverse mimeRender for valid top-level json " $ do
45− let p = Proxy :: Proxy JSON
4654 property $ \x -> mimeUnrender p (mimeRender p x) == Right (x::SomeData)
4755
4856 describe "The FormUrlEncoded Content-Type type" $ do
49−
50− let isNonNull ("", "") = False
51− isNonNull _ = True
57+ let p = Proxy :: Proxy FormUrlEncoded
5258
5359 it "has mimeUnrender reverse mimeRender" $ do
54− let p = Proxy :: Proxy FormUrlEncoded
55− property $ \x -> all isNonNull x
60+ property $ \x -> all (/= mempty) x
5661 ==> mimeUnrender p (mimeRender p x) == Right (x::[(TextS.Text,TextS.Text)])
5762
5863 it "has mimeUnrender reverse exportParams (Network.URL)" $ do
59− let p = Proxy :: Proxy FormUrlEncoded
60− property $ \x -> all isNonNull x
64+ property $ \x -> all (/= mempty) x
6165 ==> (mimeUnrender p . cs . exportParams . map (cs *** cs) $ x) == Right (x::[(TextS.Text,TextS.Text)])
6266
6367 it "has importParams (Network.URL) reverse mimeRender" $ do
64− let p = Proxy :: Proxy FormUrlEncoded
65− property $ \x -> all isNonNull x
68+ property $ \x -> all (/= mempty) x
6669 ==> (fmap (map (cs *** cs)) . importParams . cs . mimeRender p $ x) == Just (x::[(TextS.Text,TextS.Text)])
6770
6871 describe "The PlainText Content-Type type" $ do
72+ let p = Proxy :: Proxy PlainText
6973
7074 it "has mimeUnrender reverse mimeRender (lazy Text)" $ do
71− let p = Proxy :: Proxy PlainText
7275 property $ \x -> mimeUnrender p (mimeRender p x) == Right (x::TextL.Text)
7376
7477 it "has mimeUnrender reverse mimeRender (strict Text)" $ do
75− let p = Proxy :: Proxy PlainText
7678 property $ \x -> mimeUnrender p (mimeRender p x) == Right (x::TextS.Text)
7779
7880 describe "The OctetStream Content-Type type" $ do
81+ let p = Proxy :: Proxy OctetStream
7982
8083 it "is id (Lazy ByteString)" $ do
81− let p = Proxy :: Proxy OctetStream
8284 property $ \x -> mimeRender p x == (x :: BSL.ByteString)
8385 && mimeUnrender p x == Right x
8486
8587 it "is fromStrict/toStrict (Strict ByteString)" $ do
86− let p = Proxy :: Proxy OctetStream
8788 property $ \x -> mimeRender p x == BSL.fromStrict (x :: ByteString)
8889 && mimeUnrender p (BSL.fromStrict x) == Right x
8990