packages feed

graphql-client-1.2.3: test/Data/GraphQL/Test/TestUtils.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TypeApplications #-}

module Data.GraphQL.Test.TestUtils where

import Control.Exception (SomeException, try)
import Data.Aeson (object, (.=))
import Data.Aeson.Schema (get)
import Data.Either (isLeft)
import Data.Maybe (listToMaybe)
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit (assertFailure, testCase, (@?), (@?=))

import Data.GraphQL.Monad (runQuery)
import Data.GraphQL.Test.TestQuery (TestQuery (..))
import Data.GraphQL.TestUtils (ResultMock (..), mocked, runMockQueryT)

testTestUtils :: TestTree
testTestUtils =
  testGroup
    "TestUtils"
    [ testCase "MockQueryT returns a mock" $ do
        obj <-
          runMockQueryT
            runTestQuery
            [ mocked
                ResultMock
                  { query = TestQuery
                  , result = object ["getUser" .= object ["id" .= (20 :: Int)]]
                  }
            ]
        [get| obj.getUser.id |] @?= 20
    , testCase "MockQueryT errors with no matching mock" $ do
        obj <- try @SomeException $ runMockQueryT runTestQuery []
        case obj of
          Right _ -> assertFailure "MockQueryT did not error"
          Left e -> (listToMaybe . lines . show) e @?= Just "No more mocked responses for query: test"
    , testCase "MockQueryT removes mock after use" $ do
        obj <-
          try @SomeException $
            runMockQueryT
              (runTestQuery >> runTestQuery)
              [ mocked
                  ResultMock
                    { query = TestQuery
                    , result = object ["getUser" .= object ["id" .= (20 :: Int)]]
                    }
              ]
        isLeft obj @? "MockQueryT did not error"
    ]
  where
    runTestQuery = runQuery TestQuery