Skip to content
Snippets Groups Projects
Commit 1c70f040 authored by Vincent Texier's avatar Vincent Texier
Browse files

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

Add graphql-core >= 3 and python >= 3.6 dependencies
parent 3520e92a
No related branches found
No related tags found
No related merge requests found
import asyncio import asyncio
import sys
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 +19,15 @@ SWAPI_ENDPOINT = "BMAS swapi.graph.cool 443" ...@@ -16,6 +19,15 @@ 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)
print(response)
# convert response dict to schema
schema = build_client_schema(response["data"])
# create all films query
query = """query { query = """query {
allFilms { allFilms {
title, title,
...@@ -25,7 +37,21 @@ async def main(): ...@@ -25,7 +37,21 @@ 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(response)
......
...@@ -6,3 +6,4 @@ jsonschema >= 2.6.0 ...@@ -6,3 +6,4 @@ jsonschema >= 2.6.0
pypeg2>=2.15.2 pypeg2>=2.15.2
attr>=0.3.1 attr>=0.3.1
pyaes>=1.6.1 pyaes>=1.6.1
graphql-core>=3
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment