langchain/libs/community/tests/unit_tests/utilities/test_graphql.py
Zachary Toliver 29ee0496b6
community[patch]: Allow override of 'fetch_schema_from_transport' in the GraphQL tool (#17649)
- **Description:** In order to override the bool value of
"fetch_schema_from_transport" in the GraphQLAPIWrapper, a
"fetch_schema_from_transport" value needed to be added to the
"_EXTRA_OPTIONAL_TOOLS" dictionary in load_tools in the "graphql" key.
The parameter "fetch_schema_from_transport" must also be passed in to
the GraphQLAPIWrapper to allow reading of the value when creating the
client. Passing as an optional parameter is probably best to avoid
breaking changes. This change is necessary to support GraphQL instances
that do not support fetching schema, such as TigerGraph. More info here:
[TigerGraph GraphQL Schema
Docs](https://docs.tigergraph.com/graphql/current/schema)
  - **Threads handle:** @zacharytoliver

---------

Co-authored-by: Zachary Toliver <zt10191991@hotmail.com>
Co-authored-by: Bagatur <baskaryan@gmail.com>
2024-02-21 15:32:43 -08:00

94 lines
2.9 KiB
Python

import json
import pytest
import responses
from langchain_community.utilities.graphql import GraphQLAPIWrapper
TEST_ENDPOINT = "http://testserver/graphql"
# Mock GraphQL response for testing
MOCK_RESPONSE = {
"data": {
"allUsers": [{"name": "Alice"}],
"__schema": {
"queryType": {"name": "Query"},
"types": [
{
"kind": "OBJECT",
"name": "Query",
"fields": [
{
"name": "allUsers",
"args": [],
"type": {
"kind": "NON_NULL",
"name": None,
"ofType": {
"kind": "OBJECT",
"name": "allUsers",
"ofType": None,
},
},
}
],
"inputFields": None,
"interfaces": [],
"enumValues": None,
"possibleTypes": None,
},
{
"kind": "SCALAR",
"name": "String",
},
{
"kind": "OBJECT",
"name": "allUsers",
"description": None,
"fields": [
{
"name": "name",
"description": None,
"args": [],
"type": {
"kind": "NON_NULL",
"name": None,
"ofType": {
"kind": "SCALAR",
"name": "String",
"ofType": None,
},
},
},
],
"inputFields": None,
"interfaces": [],
"enumValues": None,
"possibleTypes": None,
},
{
"kind": "SCALAR",
"name": "Boolean",
},
],
},
}
}
@pytest.mark.requires("gql", "requests_toolbelt")
@responses.activate
def test_run() -> None:
responses.add(responses.POST, TEST_ENDPOINT, json=MOCK_RESPONSE, status=200)
query = "query { allUsers { name } }"
graphql_wrapper = GraphQLAPIWrapper(
graphql_endpoint=TEST_ENDPOINT,
custom_headers={"Authorization": "Bearer testtoken"},
fetch_schema_from_transport=True,
)
result = graphql_wrapper.run(query)
expected_result = json.dumps(MOCK_RESPONSE["data"], indent=2)
assert result == expected_result