content: {-# LANGUAGE FlexibleContexts #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE ScopedTypeVariables #-}
  {-# LANGUAGE NoImplicitPrelude #-}
  
  module Spec.Utils
    ( path,
      assertFetch,
    )
  where
  
  import Data.Aeson (FromJSON, ToJSON)
  import qualified Data.ByteString.Lazy as L (readFile)
  import Data.ByteString.Lazy.Char8 (ByteString)
  import Data.Morpheus.Client
    ( Fetch (..),
      FetchError,
      RequestType (..),
    )
  import Relude hiding (ByteString, exp)
  import Test.Tasty
    ( TestTree,
    )
  import Test.Tasty.HUnit
    ( assertEqual,
      testCase,
    )
  
  path :: FilePath -> FilePath
  path name = "test/Case/" <> name
  
  getFile :: FilePath -> IO ByteString
  getFile p = L.readFile (path p)
  
  mockJSON :: FilePath -> ByteString -> IO ByteString
  mockJSON p _ = getFile (p <> ".json")
  
  assertFetch ::
    ( RequestType a,
      FromJSON a,
      ToJSON (RequestArgs a),
      Eq a,
      Show a
    ) =>
    FilePath ->
    Maybe FilePath ->
    Args a ->
    Either (FetchError a) a ->
    TestTree
  assertFetch folder file args v =
    testCase display $ do
      response <- fetch (mockJSON (folder <> "/" <> fileName)) args
      assertEqual ("Test " <> display) v response
    where
      fileName = fromMaybe "response" file
      display = fromMaybe folder file
  