@@ -24,11 +24,20 @@ type UUIDSchema = 'SchemaObject '[ '("uuid", 'SchemaText IsUUID) ]
24uuid :: Text
24uuid :: Text
25uuid = "f81d4fae-7dec-11d0-a765-00a0c91e6bf6"
25uuid = "f81d4fae-7dec-11d0-a765-00a0c91e6bf6"
27+type ISO8601DateSchema = 'SchemaObject '[ '("date", 'SchemaText IsDate) ]
29+iso8601dates :: [Text]
30+iso8601dates = [ "1985-04-12" ]
32+invalidIso8601dates :: [Text]
33+invalidIso8601dates = [ "1999-13-12" ]
27−type ISO8601Schema = 'SchemaObject '[ '("datetime", 'SchemaText IsDateTime) ]
35+type ISO8601DateTimeSchema = 'SchemaObject '[ '("datetime", 'SchemaText IsDateTime) ]
29-- | Taken from ISO8601 RFC 3339
37-- | Taken from ISO8601 RFC 3339
30iso8601datetimes :: [Text]
38iso8601datetimes :: [Text]
31iso8601datetimes =
39iso8601datetimes =
32 [ "1985-04-12T23:20:50.52Z"
41 [ "1985-04-12T23:20:50.52Z"
33 , "1996-12-19T16:39:57-08:00"
42 , "1996-12-19T16:39:57-08:00"
34 , "1990-12-31T23:59:60Z"
43 , "1990-12-31T23:59:60Z"
@@ -36,6 +45,15 @@ iso8601datetimes =
36 , "1937-01-01T12:00:27.87+00:20"
45 , "1937-01-01T12:00:27.87+00:20"
48+invalidIso8601datetimes :: [Text]
49+invalidIso8601datetimes =
50+ [ "1985-04-29T23:20:50.52Z"
51+ , "1996-12-129T16:39:57-08:00"
52+ , "1990-2-31T23:59:60Z"
53+ , "1990-12-31T15:59:70"
54+ , "1937-01-01T12:00:27.87+24:20"
39spec :: Spec
57spec :: Spec
41 describe "UUID: " $ do
59 describe "UUID: " $ do
@@ -51,11 +69,30 @@ spec = do
51 (decodeAndValidateJson incorrectJson :: ParseResult (JsonRepr UUIDSchema))
69 (decodeAndValidateJson incorrectJson :: ParseResult (JsonRepr UUIDSchema))
52 `shouldSatisfy` isValidationError
70 `shouldSatisfy` isValidationError
72+ describe "ISO8601 date: " $ do
73+ for_ iso8601dates $ \dt -> do
74+ it ("validates correct date - " <> dt ^. unpacked) $ do
75+ let json = "{\"date\": \"" <> (dt ^. unpacked . packedChars) <> "\" }"
76+ (decodeAndValidateJson json :: ParseResult (JsonRepr ISO8601DateSchema))
77+ `shouldSatisfy` isValid
79+ for_ invalidIso8601dates $ \dt -> do
80+ it ("fails to validate incorrect date - " <> dt ^. unpacked) $ do
81+ let json = "{\"date\": \"" <> (dt ^. unpacked . packedChars) <> "\" }"
82+ (decodeAndValidateJson json :: ParseResult (JsonRepr ISO8601DateSchema))
83+ `shouldSatisfy` isValidationError
54 describe "ISO8601 datetime: " $ do
85 describe "ISO8601 datetime: " $ do
55 for_ iso8601datetimes $ \dt -> do
86 for_ iso8601datetimes $ \dt -> do
56 it ("validates correct datetime - " <> dt ^. unpacked) $ do
87 it ("validates correct datetime - " <> dt ^. unpacked) $ do
57 let json = "{\"datetime\": \"" <> (dt ^. unpacked . packedChars) <> "\" }"
88 let json = "{\"datetime\": \"" <> (dt ^. unpacked . packedChars) <> "\" }"
58− (decodeAndValidateJson json :: ParseResult (JsonRepr ISO8601Schema))
89+ (decodeAndValidateJson json :: ParseResult (JsonRepr ISO8601DateTimeSchema))
90+ `shouldSatisfy` isValid
92+ for_ invalidIso8601datetimes $ \dt -> do
93+ it ("fails to validate incorrect datetime - " <> dt ^. unpacked) $ do
94+ let json = "{\"datetime\": \"" <> (dt ^. unpacked . packedChars) <> "\" }"
95+ (decodeAndValidateJson json :: ParseResult (JsonRepr ISO8601DateTimeSchema))
59 `shouldSatisfy` isValidationError
96 `shouldSatisfy` isValidationError
61main :: IO ()
98main :: IO ()