from graphene.test import Client

from ..data import setup
from ..schema import schema

setup()

client = Client(schema)


def test_hero_name_query(snapshot):
    query = """
        query HeroNameQuery {
          hero {
            name
          }
        }
    """
    snapshot.assert_match(client.execute(query))


def test_hero_name_and_friends_query(snapshot):
    query = """
        query HeroNameAndFriendsQuery {
          hero {
            id
            name
            friends {
              name
            }
          }
        }
    """
    snapshot.assert_match(client.execute(query))


def test_nested_query(snapshot):
    query = """
        query NestedQuery {
          hero {
            name
            friends {
              name
              appearsIn
              friends {
                name
              }
            }
          }
        }
    """
    snapshot.assert_match(client.execute(query))


def test_fetch_luke_query(snapshot):
    query = """
        query FetchLukeQuery {
          human(id: "1000") {
            name
          }
        }
    """
    snapshot.assert_match(client.execute(query))


def test_fetch_some_id_query(snapshot):
    query = """
        query FetchSomeIDQuery($someId: String!) {
          human(id: $someId) {
            name
          }
        }
    """
    params = {"someId": "1000"}
    snapshot.assert_match(client.execute(query, variables=params))


def test_fetch_some_id_query2(snapshot):
    query = """
        query FetchSomeIDQuery($someId: String!) {
          human(id: $someId) {
            name
          }
        }
    """
    params = {"someId": "1002"}
    snapshot.assert_match(client.execute(query, variables=params))


def test_invalid_id_query(snapshot):
    query = """
        query humanQuery($id: String!) {
          human(id: $id) {
            name
          }
        }
    """
    params = {"id": "not a valid id"}
    snapshot.assert_match(client.execute(query, variables=params))


def test_fetch_luke_aliased(snapshot):
    query = """
        query FetchLukeAliased {
          luke: human(id: "1000") {
            name
          }
        }
    """
    snapshot.assert_match(client.execute(query))


def test_fetch_luke_and_leia_aliased(snapshot):
    query = """
        query FetchLukeAndLeiaAliased {
          luke: human(id: "1000") {
            name
          }
          leia: human(id: "1003") {
            name
          }
        }
    """
    snapshot.assert_match(client.execute(query))


def test_duplicate_fields(snapshot):
    query = """
        query DuplicateFields {
          luke: human(id: "1000") {
            name
            homePlanet
          }
          leia: human(id: "1003") {
            name
            homePlanet
          }
        }
    """
    snapshot.assert_match(client.execute(query))


def test_use_fragment(snapshot):
    query = """
        query UseFragment {
          luke: human(id: "1000") {
            ...HumanFragment
          }
          leia: human(id: "1003") {
            ...HumanFragment
          }
        }
        fragment HumanFragment on Human {
          name
          homePlanet
        }
    """
    snapshot.assert_match(client.execute(query))


def test_check_type_of_r2(snapshot):
    query = """
        query CheckTypeOfR2 {
          hero {
            __typename
            name
          }
        }
    """
    snapshot.assert_match(client.execute(query))


def test_check_type_of_luke(snapshot):
    query = """
        query CheckTypeOfLuke {
          hero(episode: EMPIRE) {
            __typename
            name
          }
        }
    """
    snapshot.assert_match(client.execute(query))