packages feed

morpheus-graphql-client-0.18.0: test/Case/Interface/Test.hs

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Case.Interface.Test
  ( testInterface,
  )
where

import Data.ByteString.Lazy.Char8
  ( ByteString,
  )
import Data.Morpheus.Client
  ( Fetch (..),
    FetchError,
    gql,
  )
import Data.Text (Text)
import Spec.Utils
  ( defineClientWith,
    mockApi,
  )
import Test.Tasty
  ( TestTree,
  )
import Test.Tasty.HUnit
  ( assertEqual,
    testCase,
  )
import Prelude
  ( ($),
    Either (..),
    IO,
    String,
  )

defineClientWith
  "Interface"
  [gql|
    query MyQuery {
      character {
        name
        ... on Deity {
              power
        }

        ... on Hero {
              hobby
        }
      }
      character2: character {
        name1: name
        name
      }
      character3: character {
        ... on Hero {
              hobby
        }
        ... on Character {
              name2: name
        }
      }
      character4: character {
        ... on Hero {
          hobby
        }
      }
    }
  |]

resolver :: ByteString -> IO ByteString
resolver = mockApi "Interface"

client :: IO (Either (FetchError MyQuery) MyQuery)
client = fetch resolver ()

testInterface :: TestTree
testInterface = testCase "test interfaces" $ do
  value <- client
  assertEqual
    "test interface"
    ( Right
        ( MyQuery
            { character =
                [ CharacterDeity
                    { __typename = "Deity",
                      name = "Deity Name",
                      power = "Deity Power"
                    },
                  CharacterCharacter
                    { __typename = "Character",
                      name = "Character Name"
                    },
                  CharacterHero
                    { __typename = "Hero",
                      name = "Hero Name",
                      hobby = "Deity Power"
                    }
                ],
              character2 =
                [ Character2Character
                    { __typename = "Character",
                      name1 = "test name",
                      name = "test name"
                    }
                ],
              character3 =
                [ Character3Hero
                    { __typename = "Hero",
                      hobby = "Hero Hobby",
                      name2 = "Hero name2"
                    },
                  Character3Character
                    { __typename = "Deity",
                      name2 = "Hero name2"
                    },
                  Character3Character
                    { __typename = "Character",
                      name2 = "Character name2"
                    }
                ],
              character4 =
                [ Character4Character
                    { __typename = "Character"
                    },
                  Character4Hero
                    { __typename = "Hero",
                      hobby = "Hero Hobby"
                    },
                  Character4Character
                    { __typename = "Deity"
                    }
                ]
            }
        )
    )
    value