Skip to content
Snippets Groups Projects
Commit 778a0864 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
No related tags found
No related merge requests found
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.0.1"
[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