44{-# LANGUAGE QuasiQuotes #-}
55{-# LANGUAGE RecordWildCards #-}
66{-# LANGUAGE ScopedTypeVariables #-}
7+ {-# LANGUAGE TypeApplications #-}
78{-# OPTIONS_GHC -fno-warn-orphans #-}
89module Data.OpenApi.Schema.ValidationSpec where
910
@@ -40,6 +41,8 @@ import Data.OpenApi
4041import Data.OpenApi.Declare
4142import Data.OpenApi.Aeson.Compat (stringToKey )
4243
44+ import Data.OpenApi.CommonTestTypes
45+ (AdditionalPropertiesYes , AdditionalPropertiesNo )
4346import Test.Hspec
4447import Test.Hspec.QuickCheck
4548import Test.QuickCheck
@@ -49,11 +52,17 @@ shouldValidate :: (ToJSON a, ToSchema a) => Proxy a -> a -> Bool
4952shouldValidate _ x = validateToJSON x == []
5053
5154shouldValidateValue :: (ToSchema a ) => Proxy a -> Value -> Expectation
52- shouldValidateValue px val = do
55+ shouldValidateValue px val = case validateValue px val of
56+ [] -> pure ()
57+ errors -> expectationFailure $ unlines errors
58+
59+ shouldNotValidateValue :: (ToSchema a ) => Proxy a -> Value -> [String ] -> Expectation
60+ shouldNotValidateValue px val = shouldMatchList (validateValue px val)
61+
62+ validateValue :: (ToSchema a ) => Proxy a -> Value -> [String ]
63+ validateValue px val =
5364 let (defs, sch) = runDeclare (declareSchema px) mempty
54- case validateJSON defs sch val of
55- [] -> pure ()
56- errors -> expectationFailure $ unlines errors
65+ in validateJSON defs sch val
5766
5867shouldNotValidate :: forall a . ToSchema a => (a -> Value ) -> a -> Bool
5968shouldNotValidate f = not . null . validateJSON defs sch . f
@@ -123,7 +132,19 @@ spec = do
123132 prop " invalidColorToJSON" $ shouldNotValidate invalidColorToJSON
124133 prop " invalidPaintToJSON" $ shouldNotValidate invalidPaintToJSON
125134 prop " invalidLightToJSON" $ shouldNotValidate invalidLightToJSON
126- prop " invalidButtonImagesToJSON" $ shouldNotValidate invalidButtonImagesToJSON
135+ describe " rejectUnknownFields" $ do
136+ let val = [aesonQQ |
137+ {
138+ "prop1" : true,
139+ "prop2" : 1,
140+ "prop3" : null
141+ }
142+ |]
143+ it " disabled" $
144+ shouldValidateValue (Proxy @ AdditionalPropertiesYes ) val
145+ it " enabled" $
146+ shouldNotValidateValue (Proxy @ AdditionalPropertiesNo ) val
147+ [" additionalProperties=false but extra property \" prop3\" found" ]
127148
128149main :: IO ()
129150main = hspec spec
0 commit comments