packages feed

jordan-openapi-0.2.0.0: test/JordanOpenApiSpec.hs

{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}

module Main where

import Data.Aeson (encode)
import qualified Data.ByteString.Lazy as BS
import qualified Data.HashMap.Strict.InsOrd as I
import Data.OpenApi
import Data.OpenApi.Declare (Declare, evalDeclare, execDeclare)
import Data.OpenApi.Internal
import Data.Proxy (Proxy (..))
import Data.Text (Text)
import Jordan (FromJSON (..), ToJSON (..))
import Jordan.OpenAPI (JordanToJSONSchema, getFromNamed, getToNamed)
import Jordan.OpenAPI.SpecDefs
import Optics.Operators ((^.))
import Test.Hspec (Expectation, SpecWith, before, describe, hspec, it, shouldBe, shouldContain)

main = do
  hspec $ do
    fileScenarios
    entryScenarios
    recursiveScenarios

shouldMakeNamedTo ::
  (ToJSON a) =>
  Proxy a ->
  Text ->
  Expectation
shouldMakeNamedTo p@Proxy name =
  (evalDeclare (getToNamed p) mempty ^. #_namedSchemaName) `shouldBe` Just name

shouldDeclareTo ::
  (ToJSON a) =>
  Proxy a ->
  Text ->
  Expectation
shouldDeclareTo p@Proxy name =
  I.keys (execDeclare (getToNamed p) mempty) `shouldContain` [name]

fileScenarios = describe "basic scenarios with file-like types" $ do
  it "works with file" $ do
    (Proxy @File) `shouldMakeNamedTo` "Jordan.OpenAPI.SpecDefs.File"
  it "works with directory" $ do
    (Proxy @Directory) `shouldMakeNamedTo` "Jordan.OpenAPI.SpecDefs.Directory"

entryScenarios = describe "bsaic scenarios with a directory-entry-like type" $ do
  it "includes definition for a file" $ do
    (Proxy @FileEntry) `shouldDeclareTo` "Jordan.OpenAPI.SpecDefs.File"
  it "includes definition for a directory" $ do
    (Proxy @FileEntry) `shouldDeclareTo` "Jordan.OpenAPI.SpecDefs.Directory"

recursiveScenarios = describe "scenarios with a recursive data type" $ do
  it "contains the top-level type" $ do
    (Proxy @Managership) `shouldDeclareTo` "Jordan.OpenAPI.SpecDefs.Managership"
  it "contains a nested type" $ do
    (Proxy @Managership) `shouldDeclareTo` "Jordan.OpenAPI.SpecDefs.Person"