74 lines
2.1 KiB
Haskell
74 lines
2.1 KiB
Haskell
module Feature.StructureSpec where
|
|
|
|
import Test.Hspec hiding (pendingWith)
|
|
import Test.Hspec.Wai
|
|
import Network.HTTP.Types
|
|
|
|
import Control.Lens ((^?))
|
|
import Data.Aeson.Lens
|
|
import Data.Aeson.QQ
|
|
|
|
import SpecHelper
|
|
|
|
import Network.Wai (Application)
|
|
import Network.Wai.Test (SResponse(..))
|
|
|
|
spec :: SpecWith Application
|
|
spec = do
|
|
|
|
describe "OpenAPI" $ do
|
|
it "root path returns a valid openapi spec" $
|
|
validateOpenApiResponse [("Accept", "application/openapi+json")]
|
|
|
|
it "should respond to openapi request on none root path with 415" $
|
|
request methodGet "/items"
|
|
(acceptHdrs "application/openapi+json") ""
|
|
`shouldRespondWith` 415
|
|
|
|
describe "RPC" $
|
|
|
|
it "includes a representative function with parameters" $ do
|
|
r <- simpleBody <$> get "/"
|
|
let ref = r ^? key "paths" . key "/rpc/login"
|
|
. key "post" . key "parameters"
|
|
. nth 0 . key "schema"
|
|
. key "$ref" . _String
|
|
login = r ^? key "definitions" . key "(rpc) login"
|
|
|
|
liftIO $ do
|
|
ref `shouldBe` Just "#/definitions/(rpc) login"
|
|
login `shouldBe` Just
|
|
[aesonQQ|
|
|
{
|
|
"required": [
|
|
"id",
|
|
"pass"
|
|
],
|
|
"properties": {
|
|
"id": {
|
|
"format": "text",
|
|
"type": "string"
|
|
},
|
|
"pass": {
|
|
"format": "text",
|
|
"type": "string"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
|]
|
|
|
|
describe "Allow header" $ do
|
|
|
|
it "includes read/write verbs for writeable table" $ do
|
|
r <- request methodOptions "/items" [] ""
|
|
liftIO $
|
|
simpleHeaders r `shouldSatisfy`
|
|
matchHeader "Allow" "GET,POST,PATCH,DELETE"
|
|
|
|
it "includes read verbs for read-only table" $ do
|
|
r <- request methodOptions "/has_count_column" [] ""
|
|
liftIO $
|
|
simpleHeaders r `shouldSatisfy`
|
|
matchHeader "Allow" "GET"
|