@@ -0,0 +1,62 @@
1+{-# OPTIONS_GHC -Wno-unticked-promoted-constructors #-}
2+
3+module HelpersSpec (spec, main) where
4+
5+import Control.Lens
6+import Data.Aeson
7+import Data.ByteString.Char8 as C8
8+import Data.ByteString.Lazy as BL
9+import Data.ByteString.Lazy.Lens
10+import Data.Foldable
11+import Data.Functor.Identity
12+import Data.Monoid
13+import Data.Proxy
14+import Data.Schematic
15+import Data.Text as T
16+import Data.Text.Lens
17+import Data.Vinyl
18+import Test.Hspec
19+
20+
21+type UUIDSchema = 'SchemaObject '[ '("uuid", 'SchemaText IsUUID) ]
22+
23+-- | Taken from UUID RFC 4122
24+uuid :: Text
25+uuid = "f81d4fae-7dec-11d0-a765-00a0c91e6bf6"
26+
27+type ISO8601Schema = 'SchemaObject '[ '("datetime", 'SchemaText IsDateTime) ]
28+
29+-- | Taken from ISO8601 RFC 3339
30+iso8601datetimes :: [Text]
31+iso8601datetimes =
32+ [ "1985-04-12T23:20:50.52Z"
33+ , "1996-12-19T16:39:57-08:00"
34+ , "1990-12-31T23:59:60Z"
35+ , "1990-12-31T15:59:60-08:00"
36+ , "1937-01-01T12:00:27.87+00:20"
37+ ]
38+
39+spec :: Spec
40+spec = do
41+ describe "UUID: " $ do
42+ it "validates correct UUID" $ do
43+ let
44+ uuidJson = "{\"uuid\": \"" <> (uuid ^. unpacked . packedChars) <> "\" }"
45+ (decodeAndValidateJson uuidJson :: ParseResult (JsonRepr UUIDSchema))
46+ `shouldSatisfy` isValid
47+
48+ it "fails to validate incorrect UUID" $ do
49+ let
50+ incorrectJson = "{\"uuid\": \"incorrect\" }"
51+ (decodeAndValidateJson incorrectJson :: ParseResult (JsonRepr UUIDSchema))
52+ `shouldSatisfy` isValidationError
53+
54+ describe "ISO8601 datetime: " $ do
55+ for_ iso8601datetimes $ \dt -> do
56+ it ("validates correct datetime - " <> dt ^. unpacked) $ do
57+ let json = "{\"datetime\": \"" <> (dt ^. unpacked . packedChars) <> "\" }"
58+ (decodeAndValidateJson json :: ParseResult (JsonRepr ISO8601Schema))
59+ `shouldSatisfy` isValidationError
60+
61+main :: IO ()
62+main = hspec spec