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"