@@ -2,6 +2,7 @@
22{-# LANGUAGE ScopedTypeVariables #-}
33module Web.Internal.HttpApiDataSpec (spec) where
44
5+import Control.Applicative
56import Data.Int
67import Data.Word
78import Data.Time
@@ -9,6 +10,7 @@ import qualified Data.Text as T
910import qualified Data.Text.Lazy as L
1011import qualified Data.ByteString as BS
1112import Data.Version
13+import qualified Data.UUID as UUID
1214
1315import Data.Proxy
1416
@@ -30,6 +32,10 @@ import Web.Internal.TestInstances
3032checkUrlPiece :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Show a, Arbitrary a) => Proxy a -> String -> Spec
3133checkUrlPiece _ name = prop name (toUrlPiece <=> parseUrlPiece :: a -> Bool)
3234
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)
38+
3339-- | Check case insensitivity for @parseUrlPiece@.
3440checkUrlPieceI :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Arbitrary a) => Proxy a -> String -> Spec
3541checkUrlPieceI _ = checkUrlPiece (Proxy :: Proxy (RandomCase a))
@@ -56,11 +62,12 @@ spec = do
5662 checkUrlPiece (Proxy :: Proxy T.Text) "Text.Strict"
5763 checkUrlPiece (Proxy :: Proxy L.Text) "Text.Lazy"
5864 checkUrlPiece (Proxy :: Proxy Day) "Day"
59− checkUrlPiece (Proxy :: Proxy LocalTime) "LocalTime"
60− checkUrlPiece (Proxy :: Proxy ZonedTime) "ZonedTime"
61− checkUrlPiece (Proxy :: Proxy UTCTime) "UTCTime"
62− checkUrlPiece (Proxy :: Proxy NominalDiffTime) "NominalDiffTime"
65+ checkUrlPiece' localTimeGen "LocalTime"
66+ checkUrlPiece' zonedTimeGen "ZonedTime"
67+ checkUrlPiece' utcTimeGen "UTCTime"
68+ checkUrlPiece' nominalDiffTimeGen "NominalDiffTime"
6369 checkUrlPiece (Proxy :: Proxy Version) "Version"
70+ checkUrlPiece' uuidGen "UUID"
6471
6572 checkUrlPiece (Proxy :: Proxy (Maybe String)) "Maybe String"
6673 checkUrlPieceI (Proxy :: Proxy (Maybe Integer)) "Maybe Integer"
@@ -80,3 +87,23 @@ spec = do
8087
8188 it "invalid utf8 is handled" $ do
8289 parseHeaderMaybe (BS.pack [128]) `shouldBe` (Nothing :: Maybe T.Text)
90+
91+uuidGen :: Gen UUID.UUID
92+uuidGen = UUID.fromWords <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
93+
94+-- TODO: this generators don't generate full range items
95+localTimeGen :: Gen LocalTime
96+localTimeGen = LocalTime
97+ <$> arbitrary
98+ <*> liftA3 TimeOfDay (choose (0, 23)) (choose (0, 59)) (fromInteger <$> choose (0, 60))
99+
100+zonedTimeGen :: Gen ZonedTime
101+zonedTimeGen = ZonedTime
102+ <$> localTimeGen -- Note: not arbitrary!
103+ <*> liftA3 TimeZone arbitrary arbitrary (vectorOf 3 (elements ['A'..'Z']))
104+
105+utcTimeGen :: Gen UTCTime
106+utcTimeGen = UTCTime <$> arbitrary <*> fmap fromInteger (choose (0, 86400))
107+
108+nominalDiffTimeGen :: Gen NominalDiffTime
109+nominalDiffTimeGen = fromInteger <$> arbitrary