content: {-# LANGUAGE DisambiguateRecordFields #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE NoImplicitPrelude #-}
  
  module Main
    ( main,
    )
  where
  
  import APIConstraints (runAPIConstraints)
  import Batching (runBatchingTest)
  import Data.Morpheus.App
    ( App (..),
      eitherSchema,
      mkApp,
      runApp,
    )
  import Data.Morpheus.Core
    ( parseSchema,
    )
  import Data.Morpheus.Internal.Ext
    ( toEither,
    )
  import Data.Morpheus.Types.IO
    ( GQLRequest (..),
      GQLResponse,
    )
  import DisableIntrospection (runDisableIntrospectionTest, runNamedDisableIntrospectionTest)
  import Execution (runExecutionTest)
  import NamedResolvers (runNamedResolversTest)
  import Relude hiding (ByteString)
  import Test.Morpheus
    ( FileUrl,
      deepScan,
      getAppsBy,
      mainTest,
      mkUrl,
      renderingAssertion,
      testApi,
    )
  import Test.Tasty
    ( TestTree,
    )
  
  getApps :: FileUrl -> IO (App e IO)
  getApps = getAppsBy (toEither . parseSchema, mkApp)
  
  testQuery :: FileUrl -> FileUrl -> TestTree
  testQuery url = testApi api
    where
      api :: GQLRequest -> IO GQLResponse
      api req = getApps url >>= (`runApp` req)
  
  runApiTest :: FileUrl -> [FileUrl] -> [TestTree]
  runApiTest url = map (testQuery url)
  
  runRenderingTest :: FileUrl -> TestTree
  runRenderingTest = renderingAssertion (fmap eitherSchema . getApps)
  
  runMergeTest :: FileUrl -> [FileUrl] -> [TestTree]
  runMergeTest url assets = runRenderingTest url : runApiTest url assets
  
  main :: IO ()
  main =
    mainTest
      "App Tests"
      [ deepScan runMergeTest (mkUrl "merge"),
        deepScan runApiTest (mkUrl "api"),
        deepScan (map . runNamedResolversTest) (mkUrl "named-resolvers"),
        deepScan (map . runAPIConstraints) (mkUrl "api-constraints"),
        deepScan (map . runBatchingTest) (mkUrl "batching"),
        deepScan (map . runExecutionTest) (mkUrl "execution"),
        deepScan (map . runNamedDisableIntrospectionTest) (mkUrl "disable-introspection"),
        deepScan (map . runDisableIntrospectionTest) (mkUrl "disable-introspection")
      ]
  