@@ -10,6 +10,7 @@ module Servant.API.ContentTypesSpec where
10import Control.Applicative
10import Control.Applicative
12import Control.Arrow
12import Control.Arrow
13import Data.Aeson
14import Data.Aeson
14import Data.Aeson.Parser (jstring)
15import Data.Aeson.Parser (jstring)
15import Data.Attoparsec.ByteString (parseOnly)
16import Data.Attoparsec.ByteString (parseOnly)
@@ -25,6 +26,7 @@ import Data.String.Conversions (cs)
25import qualified Data.Text as TextS
26import qualified Data.Text as TextS
26import qualified Data.Text.Lazy as TextL
27import qualified Data.Text.Lazy as TextL
27import GHC.Generics
28import GHC.Generics
28import Network.URL (exportParams, importParams)
30import Network.URL (exportParams, importParams)
29import Test.Hspec
31import Test.Hspec
30import Test.QuickCheck
32import Test.QuickCheck
@@ -36,54 +38,53 @@ spec :: Spec
36spec = describe "Servant.API.ContentTypes" $ do
38spec = describe "Servant.API.ContentTypes" $ do
38 describe "The JSON Content-Type type" $ do
40 describe "The JSON Content-Type type" $ do
41+ let p = Proxy :: Proxy JSON
43+ it "handles whitespace at end of input" $ do
44+ mimeUnrender p "[1] " `shouldBe` Right [1 :: Int]
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)
40 it "has mimeUnrender reverse mimeRender for valid top-level json ([Int]) " $ do
50 it "has mimeUnrender reverse mimeRender for valid top-level json ([Int]) " $ do
41− let p = Proxy :: Proxy JSON
42 property $ \x -> mimeUnrender p (mimeRender p x) == Right (x::[Int])
51 property $ \x -> mimeUnrender p (mimeRender p x) == Right (x::[Int])
44 it "has mimeUnrender reverse mimeRender for valid top-level json " $ do
53 it "has mimeUnrender reverse mimeRender for valid top-level json " $ do
45− let p = Proxy :: Proxy JSON
46 property $ \x -> mimeUnrender p (mimeRender p x) == Right (x::SomeData)
54 property $ \x -> mimeUnrender p (mimeRender p x) == Right (x::SomeData)
48 describe "The FormUrlEncoded Content-Type type" $ do
56 describe "The FormUrlEncoded Content-Type type" $ do
49−
57+ let p = Proxy :: Proxy FormUrlEncoded
50− let isNonNull ("", "") = False
53 it "has mimeUnrender reverse mimeRender" $ do
59 it "has mimeUnrender reverse mimeRender" $ do
54− let p = Proxy :: Proxy FormUrlEncoded
55− property $ \x -> all isNonNull x
60+ property $ \x -> all (/= mempty) x
56 ==> mimeUnrender p (mimeRender p x) == Right (x::[(TextS.Text,TextS.Text)])
61 ==> mimeUnrender p (mimeRender p x) == Right (x::[(TextS.Text,TextS.Text)])
58 it "has mimeUnrender reverse exportParams (Network.URL)" $ do
63 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
61 ==> (mimeUnrender p . cs . exportParams . map (cs *** cs) $ x) == Right (x::[(TextS.Text,TextS.Text)])
65 ==> (mimeUnrender p . cs . exportParams . map (cs *** cs) $ x) == Right (x::[(TextS.Text,TextS.Text)])
63 it "has importParams (Network.URL) reverse mimeRender" $ do
67 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
66 ==> (fmap (map (cs *** cs)) . importParams . cs . mimeRender p $ x) == Just (x::[(TextS.Text,TextS.Text)])
69 ==> (fmap (map (cs *** cs)) . importParams . cs . mimeRender p $ x) == Just (x::[(TextS.Text,TextS.Text)])
68 describe "The PlainText Content-Type type" $ do
71 describe "The PlainText Content-Type type" $ do
72+ let p = Proxy :: Proxy PlainText
70 it "has mimeUnrender reverse mimeRender (lazy Text)" $ do
74 it "has mimeUnrender reverse mimeRender (lazy Text)" $ do
71− let p = Proxy :: Proxy PlainText
72 property $ \x -> mimeUnrender p (mimeRender p x) == Right (x::TextL.Text)
75 property $ \x -> mimeUnrender p (mimeRender p x) == Right (x::TextL.Text)
74 it "has mimeUnrender reverse mimeRender (strict Text)" $ do
77 it "has mimeUnrender reverse mimeRender (strict Text)" $ do
75− let p = Proxy :: Proxy PlainText
76 property $ \x -> mimeUnrender p (mimeRender p x) == Right (x::TextS.Text)
78 property $ \x -> mimeUnrender p (mimeRender p x) == Right (x::TextS.Text)
78 describe "The OctetStream Content-Type type" $ do
80 describe "The OctetStream Content-Type type" $ do
81+ let p = Proxy :: Proxy OctetStream
80 it "is id (Lazy ByteString)" $ do
83 it "is id (Lazy ByteString)" $ do
81− let p = Proxy :: Proxy OctetStream
82 property $ \x -> mimeRender p x == (x :: BSL.ByteString)
84 property $ \x -> mimeRender p x == (x :: BSL.ByteString)
83 && mimeUnrender p x == Right x
85 && mimeUnrender p x == Right x
85 it "is fromStrict/toStrict (Strict ByteString)" $ do
87 it "is fromStrict/toStrict (Strict ByteString)" $ do
86− let p = Proxy :: Proxy OctetStream
87 property $ \x -> mimeRender p x == BSL.fromStrict (x :: ByteString)
88 property $ \x -> mimeRender p x == BSL.fromStrict (x :: ByteString)
88 && mimeUnrender p (BSL.fromStrict x) == Right x
89 && mimeUnrender p (BSL.fromStrict x) == Right x