@@ -2,6 +2,7 @@
2{-# LANGUAGE ScopedTypeVariables #-}
2{-# LANGUAGE ScopedTypeVariables #-}
3module Web.Internal.HttpApiDataSpec (spec) where
3module Web.Internal.HttpApiDataSpec (spec) where
5+import Control.Applicative
5import Data.Int
6import Data.Int
6import Data.Word
7import Data.Word
7import Data.Time
8import Data.Time
@@ -9,6 +10,7 @@ import qualified Data.Text as T
9import qualified Data.Text.Lazy as L
10import qualified Data.Text.Lazy as L
10import qualified Data.ByteString as BS
11import qualified Data.ByteString as BS
11import Data.Version
12import Data.Version
13+import qualified Data.UUID as UUID
13import Data.Proxy
15import Data.Proxy
@@ -30,6 +32,10 @@ import Web.Internal.TestInstances
30checkUrlPiece :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Show a, Arbitrary a) => Proxy a -> String -> Spec
32checkUrlPiece :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Show a, Arbitrary a) => Proxy a -> String -> Spec
31checkUrlPiece _ name = prop name (toUrlPiece <=> parseUrlPiece :: a -> Bool)
33checkUrlPiece _ name = prop name (toUrlPiece <=> parseUrlPiece :: a -> Bool)
35+-- | Check with given generator
36+checkUrlPiece' :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Show a) => Gen a -> String -> Spec
37+checkUrlPiece' gen name = prop name $ forAll gen (toUrlPiece <=> parseUrlPiece)
33-- | Check case insensitivity for @parseUrlPiece@.
39-- | Check case insensitivity for @parseUrlPiece@.
34checkUrlPieceI :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Arbitrary a) => Proxy a -> String -> Spec
40checkUrlPieceI :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Arbitrary a) => Proxy a -> String -> Spec
35checkUrlPieceI _ = checkUrlPiece (Proxy :: Proxy (RandomCase a))
41checkUrlPieceI _ = checkUrlPiece (Proxy :: Proxy (RandomCase a))
@@ -56,11 +62,12 @@ spec = do
56 checkUrlPiece (Proxy :: Proxy T.Text) "Text.Strict"
62 checkUrlPiece (Proxy :: Proxy T.Text) "Text.Strict"
57 checkUrlPiece (Proxy :: Proxy L.Text) "Text.Lazy"
63 checkUrlPiece (Proxy :: Proxy L.Text) "Text.Lazy"
58 checkUrlPiece (Proxy :: Proxy Day) "Day"
64 checkUrlPiece (Proxy :: Proxy Day) "Day"
59− checkUrlPiece (Proxy :: Proxy LocalTime) "LocalTime"
65+ checkUrlPiece' localTimeGen "LocalTime"
60− checkUrlPiece (Proxy :: Proxy ZonedTime) "ZonedTime"
66+ checkUrlPiece' zonedTimeGen "ZonedTime"
61− checkUrlPiece (Proxy :: Proxy UTCTime) "UTCTime"
67+ checkUrlPiece' utcTimeGen "UTCTime"
62− checkUrlPiece (Proxy :: Proxy NominalDiffTime) "NominalDiffTime"
68+ checkUrlPiece' nominalDiffTimeGen "NominalDiffTime"
63 checkUrlPiece (Proxy :: Proxy Version) "Version"
69 checkUrlPiece (Proxy :: Proxy Version) "Version"
70+ checkUrlPiece' uuidGen "UUID"
65 checkUrlPiece (Proxy :: Proxy (Maybe String)) "Maybe String"
72 checkUrlPiece (Proxy :: Proxy (Maybe String)) "Maybe String"
66 checkUrlPieceI (Proxy :: Proxy (Maybe Integer)) "Maybe Integer"
73 checkUrlPieceI (Proxy :: Proxy (Maybe Integer)) "Maybe Integer"
@@ -80,3 +87,23 @@ spec = do
81 it "invalid utf8 is handled" $ do
88 it "invalid utf8 is handled" $ do
82 parseHeaderMaybe (BS.pack [128]) `shouldBe` (Nothing :: Maybe T.Text)
89 parseHeaderMaybe (BS.pack [128]) `shouldBe` (Nothing :: Maybe T.Text)
91+uuidGen :: Gen UUID.UUID
92+uuidGen = UUID.fromWords <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
94+-- TODO: this generators don't generate full range items
95+localTimeGen :: Gen LocalTime
96+localTimeGen = LocalTime
98+ <*> liftA3 TimeOfDay (choose (0, 23)) (choose (0, 59)) (fromInteger <$> choose (0, 60))
100+zonedTimeGen :: Gen ZonedTime
101+zonedTimeGen = ZonedTime
102+ <$> localTimeGen -- Note: not arbitrary!
103+ <*> liftA3 TimeZone arbitrary arbitrary (vectorOf 3 (elements ['A'..'Z']))
105+utcTimeGen :: Gen UTCTime
106+utcTimeGen = UTCTime <$> arbitrary <*> fmap fromInteger (choose (0, 86400))
108+nominalDiffTimeGen :: Gen NominalDiffTime
109+nominalDiffTimeGen = fromInteger <$> arbitrary