Skip to content
Snippets Groups Projects
Commit 0d193fdc authored by Vincent Texier's avatar Vincent Texier Committed by Vincent Texier
Browse files

[enh] #59 use graphql-core library to validate GraphQL queries against server schema

parent 5a0cdec4
No related branches found
Tags
2 merge requests!119Release 0.61.0,!90Add GraphQL GVA API support
import asyncio import asyncio
import sys
import json
from duniterpy.api.client import Client from duniterpy.api.client import Client
from graphql import get_introspection_query, build_client_schema, language, validate
from graphql.error import GraphQLSyntaxError
# CONFIG ####################################### # CONFIG #######################################
# You can either use a complete defined endpoint : [NAME_OF_THE_API] [DOMAIN] [IPv4] [IPv6] [PORT] # You can either use a complete defined endpoint : [NAME_OF_THE_API] [DOMAIN] [IPv4] [IPv6] [PORT]
# or the simple definition : [NAME_OF_THE_API] [DOMAIN] [PORT] # or the simple definition : [NAME_OF_THE_API] [DOMAIN] [PORT]
# Here we use the secure BASIC_MERKLED_API (BMAS) # Here we use the secure BASIC_MERKLED_API (BMAS) for standard http over ssl requests
SWAPI_ENDPOINT = "BMAS swapi.graph.cool 443" SWAPI_ENDPOINT = "BMAS swapi.graph.cool 443"
...@@ -16,6 +20,14 @@ SWAPI_ENDPOINT = "BMAS swapi.graph.cool 443" ...@@ -16,6 +20,14 @@ SWAPI_ENDPOINT = "BMAS swapi.graph.cool 443"
async def main(): async def main():
client = Client(SWAPI_ENDPOINT) client = Client(SWAPI_ENDPOINT)
# get query to get schema from api
query = get_introspection_query(False)
# get schema from api
response = await client.query(query)
# convert response dict to schema
schema = build_client_schema(response["data"])
# create all films query
query = """query { query = """query {
allFilms { allFilms {
title, title,
...@@ -25,9 +37,23 @@ async def main(): ...@@ -25,9 +37,23 @@ async def main():
} }
} }
""" """
# check query syntax
try:
ast_document = language.parse(query)
except GraphQLSyntaxError as exception:
print("Query syntax error: {0}".format(exception.message))
sys.exit(1)
# validate query against schema
errors = validate(schema, ast_document)
if errors:
print("Schema errors:")
print(errors)
sys.exit(1)
# send valid query to api
response = await client.query(query) response = await client.query(query)
print(response) print(json.dumps(response, indent=2))
# Close client aiohttp session # Close client aiohttp session
await client.close() await client.close()
......
...@@ -32,6 +32,7 @@ attrs = "^20.2.0" ...@@ -32,6 +32,7 @@ attrs = "^20.2.0"
base58 = "^2.0.0" base58 = "^2.0.0"
libnacl = "^1.7.2" libnacl = "^1.7.2"
pyaes = "^1.6.1" pyaes = "^1.6.1"
graphql-core = "^3.1.2"
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
black = "^20.8b1" black = "^20.8b1"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment