graphql-python / graphql-python/graphene

Default_value option in Arguments inside Mutation is not working as expected

Aperta
#1,534 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Python
Stelle
8.2k
Fork
818
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

Hi,

* **What is the current behavior?**
When I am working with the following set up of graphene Mutation:

```python
class AnimalFarm(graphene.Mutation):
class Arguments:
animals = graphene.List(graphene.String, default_value=[])

output = graphene.List(graphene.String)

def mutate(root, info, **filters):
import pdb; pdb.set_trace()
animals_mio = filters["animals"]
animals_mio.append('duck')

return animals_mio

class Mutation(graphene.ObjectType):
animal_farm = AnimalFarm.Field()
```
where you can see that I am declaring a Mutation that have and argument called "**animals**" which type is "**graphene.List(graphene.String, default_value=[])**", that means if I dont pass this argument in the mutation, graphene automatically filled this argument ("animals") with an empty list.

At this point all works perfect, but when I try the following steps, I reckon that could be a little bug in to reset the old value of "animals" argument.

- **Step 1:** Install the latest version of graphene, in a linux OS, in my case is Ubuntu 22.04.3 LTS:
```shell
pip install "graphene>=3.1"
```

- **Step 2:** Copy this code in a file with extension ".py", for example:
```shell
nano cool_file_name.py
```

- **Step 3:** Copy this code to have the example, where you can this bug:

```python
import graphene

class Query(graphene.ObjectType):
nothing = graphene.String()

def resolve_nothing(root, info):
return "empty"

class AnimalFarm(graphene.Mutation):
class Arguments:
animals = graphene.List(graphene.String, default_value=[])

output = graphene.List(graphene.String)

def mutate(root, info, **filters):
import pdb; pdb.set_trace()
animals_local = filters["animals"]
animals_local.append('duck')

return animals_local

class Mutation(graphene.ObjectType):
animal_farm = AnimalFarm.Field()

schema = graphene.Schema(query=Query, mutation=Mutation)

mutation = """
mutation addAnimals{
animalFarm {
output
}
}
"""

def test_mutation():
# First request
result = schema.execute(mutation)
print(result)

# Second request, in this request it is the problem !!!
result = schema.execute(mutation)
print(result)

test_mutation()
```

- **Step 4:** Then save the changes and launch the file:

```shell
python3 cool_file_name.py
```
- **Step 5:** Execute "n" + Enter, to check this steps that works as expected in the first request, where we can see that both variables:
**animals_local**
**filters["animals"]**
are equal as an empty list, as you can see in this image:
![image](https://github.com/graphql-python/graphene/assets/33021153/beaf28c9-f6ea-498a-8949-63026483d433)
Now if we add a value to the variable "**aniamls_local**" we also see that works perfect:
![image](https://github.com/graphql-python/graphene/assets/33021153/d93ea85a-2807-4878-860f-b8ad4e93f4e6)

- **Step 6:** The bug appear in the second request, where we do same steps that in the **Step 5**, but in this second request if we check the value of varieble **filters["animals"]** we can see that its default value is the old value of the previous request, where we added "duck" word to "animals" list argument:
![image](https://github.com/graphql-python/graphene/assets/33021153/a2d9e4b6-938a-4aeb-a72c-7b47db3f4f89)

* **What is the expected behavior?**
The expected behavior is that if I launch multiple request of this mutation and I dont pass any value for "animals" argument, the default_value must be what I declare in set up type (an empty list).
So graphene have to reset correctly the default_value and not persist old values.

* **Please tell us about your environment:**
- Version: **graphene>=3.1**
- Platform: **Ubuntu 22.04.3 LTS**

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Direzione di ricerca

Inizia con le chiamate ripetute a schema.execute nella riproduzione fornita di test_mutation e traccia il modo in cui AnimalFarm Arguments default_value viene passato a mutate. Verifica che un argomento animals omesso riceva una nuova lista vuota a ogni richiesta e aggiungi un test di regressione che copra entrambe le esecuzioni.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
graphql, python
Ambito
api, backend
Tipo di issue
Bug
Difficoltà
3/5
Tempo stimato
1-2 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
45/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.