content: {-# LANGUAGE DeriveGeneric #-}
  {-# LANGUAGE DerivingStrategies #-}
  {-# LANGUAGE DuplicateRecordFields #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE QuasiQuotes #-}
  {-# LANGUAGE TemplateHaskell #-}
  {-# LANGUAGE TypeFamilies #-}
  {-# LANGUAGE NoImplicitPrelude #-}
  
  module Case.LocalGlobal.Test
    ( test,
    )
  where
  
  import Case.LocalGlobal.Api
  import Data.Aeson
  import Data.Morpheus.Client
    ( Fetch (..),
      ID,
      declareGlobalTypes,
      declareLocalTypes,
      declareLocalTypesInline,
      raw,
    )
  import Relude
  import Spec.Utils
    ( assertFetch,
    )
  import Test.Tasty
    ( TestTree,
      testGroup,
    )
  
  declareGlobalTypes schema
  
  declareLocalTypesInline
    schema
    [raw|
      query GetCities ( $inputCity: City!) {
        city(city:$inputCity)
        cities
      }
    |]
  
  declareLocalTypes schema (loc "users1.gql")
  declareLocalTypes schema (loc "users2.gql")
  
  checkQuery ::
    ( Fetch a,
      FromJSON a,
      Eq a,
      Show a
    ) =>
    FilePath ->
    Args a ->
    a ->
    TestTree
  checkQuery x args v =
    assertFetch
      "LocalGlobal"
      (Just x)
      args
      (Right v)
  
  checkCities :: TestTree
  checkCities =
    checkQuery
      "cities"
      GetCitiesArgs {inputCity = CityAthens}
      GetCities
        { city = CityAthens,
          cities =
            [ CityAthens,
              CitySparta,
              CityCorinth,
              CityDelphi
            ]
        }
  
  checkUsers1 :: TestTree
  checkUsers1 =
    checkQuery
      "users1"
      GetUsers1Args {user = UserInput {name = "odysseus"}}
      GetUsers1
        { user =
            Just
              ( GetUsers1User
                  { name = "Odysseus",
                    home = Just CityIthaca
                  }
              )
        }
  
  checkUsers2 :: TestTree
  checkUsers2 =
    checkQuery
      "users2"
      GetUsers2Args {user = UserInput {name = "odysseus"}}
      GetUsers2
        { user =
            Just
              ( GetUsers2User
                  { name = "Morpheus"
                  }
              )
        }
  
  test :: TestTree
  test =
    testGroup
      "Local/Global"
      [ checkCities,
        checkUsers1,
        checkUsers2
      ]
  