hjsonschema-0.9.0.0: tests/Local.hs
module Main where
import Control.Applicative
import Control.Monad (unless)
import Data.Aeson
import qualified Data.Aeson.Pointer as P
import Data.List (isSuffixOf)
import Data.Monoid
import System.Directory (getDirectoryContents)
import Test.Tasty (TestTree, defaultMain, testGroup)
import qualified Test.Tasty.HUnit as HU
import Test.Tasty.QuickCheck (testProperty)
import Data.JsonSchema.Draft4 (Failure(..), Schema(..),
SchemaCache(..), SchemaContext(..),
emptySchema, runValidate)
import qualified Data.Validator.Draft4 as VA
import Shared (isLocal, readSchemaTests, toTest)
dir :: String
dir = "JSON-Schema-Test-Suite/tests/draft4"
main :: IO ()
main = do
filenames <- filter isLocal . filter (".json" `isSuffixOf`) <$> getDirectoryContents dir
ts <- readSchemaTests dir filenames
defaultMain . testGroup "Tests not requiring an HTTP server" $
testProperty "Invert schemas through JSON without change" invertSchema
: testGroup "Make paths to invalid data correctly" correctPaths
: fmap toTest ts
invertSchema :: Schema -> Bool
invertSchema a = Just a == decode (encode a)
correctPaths :: [TestTree]
correctPaths =
[ HU.testCase "Items object" itemsObject
, HU.testCase "Items array" itemsArray
]
itemsObject :: IO ()
itemsObject = HU.assertEqual "Path to invalid data"
(P.Pointer [P.Token "0"])
(_failureOffendingData failure)
where
[failure] = runValidate (SchemaCache schema mempty) sc (toJSON [[True, True]])
schema :: Schema
schema = emptySchema
{ _schemaItems = Just (VA.ItemsObject (emptySchema { _schemaUniqueItems = Just True }))
}
sc :: SchemaContext Schema
sc = SchemaContext
{ _scURI = Nothing
, _scSchema = schema
}
itemsArray :: IO ()
itemsArray = HU.assertEqual "Path to invalid data"
(P.Pointer [P.Token "0"])
(_failureOffendingData failure)
where
[failure] = runValidate (SchemaCache schema mempty) sc (toJSON [[True, True]])
schema :: Schema
schema = emptySchema
{ _schemaItems = Just (VA.ItemsArray [emptySchema { _schemaUniqueItems = Just True }])
}
sc :: SchemaContext Schema
sc = SchemaContext
{ _scURI = Nothing
, _scSchema = schema
}