graphql-python / graphql-python/gql

DSL does not provide expected argument validation

Abierto
#355 1 comentario 0 reacciones 0 asignados Ver en GitHub
type: feature
Lenguaje dominante
Python
Estrellas
1.7k
Forks
195
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

**Describe the bug**

- When creating a query with `gql.gql()`, the query string is checked for invalid arguments, and raises an exception if any are found. (**expected behavior**)
- When creating a query with `gql.dsl.dsl_gql()`, the arguments are not checked, causing unexpected return values. (**unexpected behavior**)

I've been able to recreate this using the [countries api](https://countries.trevorblades.com/) used in the [docs](https://gql.readthedocs.io/en/latest/advanced/dsl_module.html#sync-example).

**To Reproduce**

Jump to step 5 to see the actual improper behavior.

1. Set up the transport/client.

```py
import json

import gql
from gql.transport.requests import RequestsHTTPTransport as Transport
from gql import dsl

url = "https://countries.trevorblades.com/"

transport = Transport(url=url)
client = gql.Client(transport=transport, fetch_schema_from_transport=True)

# Fetch the schema (lemme know if there's a recommended approach for this).
client.connect_sync()
client.close_sync()
ds = dsl.DSLSchema(client.schema)
```

2. Run a good query using strings.

```py
good_query_str = gql.gql(
"""
query {
continents (filter:{code:{eq:"AN"}}) {
code
name
}
}
"""
)
result = client.execute(good_query_str)
print(json.dumps(result, indent=2))
```

Result:

```json
{
"continents": [
{
"code": "AN",
"name": "Antarctica"
}
]
}
```

3. Run a bad query using strings. The only change here is using `'AN' ` directly as an argument to `code`, instead of providing the `eq` directive.

```py
bad_query_str = gql.gql(
"""
query {
continents (filter:{code:"AN"}) {
code
name
}
}
"""
)
result = client.execute(bad_query_str)
print(json.dumps(result, indent=2))
```

Result:

```py
GraphQLError: Expected value of type 'StringQueryOperatorInput', found "AN".

GraphQL request:3:34
2 | query {
3 | continents (filter:{code:"AN"}) {
| ^
4 | code
```

4. Run a good query using DSL.

```py
good_query_dsl = dsl.dsl_gql(
dsl.DSLQuery(
ds.Query.continents(
filter={
'code': {'eq': 'AN'}
}
).select(
ds.Continent.code,
ds.Continent.name,
)
)
)
result = client.execute(good_query_dsl)
print(json.dumps(result, indent=2))
```

Result:

```json
{
"continents": [
{
"code": "AN",
"name": "Antarctica"
}
]
}
```

5. Run a bad query using DSL. Same deal, just remove the 'eq' level of filter specification. Note that the result is an unfiltered response.

```py
bad_query_dsl = dsl.dsl_gql(
dsl.DSLQuery(
ds.Query.continents(
filter={
'code': 'AN'
}
).select(
ds.Continent.code,
ds.Continent.name,
)
)
)
result = client.execute(bad_query_dsl)
print(json.dumps(result, indent=2))
```

Result:

```json
{
"continents": [
{
"code": "AF",
"name": "Africa"
},
{
"code": "AN",
"name": "Antarctica"
},
{
"code": "AS",
"name": "Asia"
},
{
"code": "EU",
"name": "Europe"
},
{
"code": "NA",
"name": "North America"
},
{
"code": "OC",
"name": "Oceania"
},
{
"code": "SA",
"name": "South America"
}
]
}
```

**Expected behavior**

Step 5 should raise an equivalent exception to step 3.

**System info (please complete the following information):**

- OS: Wins 10
- Python version: 3.9.12
- gql version: 3.4.0
- graphql-core version: 3.2.1

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.