-
Notifications
You must be signed in to change notification settings - Fork 766
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
replace merge_queryset with resolve_queryset pattern (#796)
* replace merge_queryset with resolve_queryset pattern * skip double limit test * Update graphene_django/fields.py Co-Authored-By: Jonathan Kim <[email protected]> * yank skipped test * fix bad variable ref * add test for annotations * add test for using queryset with django filters * document ththat one should use defer instead of values with queysets and DjangoObjectTypes
- Loading branch information
Showing
5 changed files
with
132 additions
and
132 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -608,58 +608,6 @@ def resolve_all_reporters(self, info, **args): | |
assert result.data == expected | ||
|
||
|
||
def test_should_query_filter_node_double_limit_raises(): | ||
class ReporterFilter(FilterSet): | ||
limit = NumberFilter(method="filter_limit") | ||
|
||
def filter_limit(self, queryset, name, value): | ||
return queryset[:value] | ||
|
||
class Meta: | ||
model = Reporter | ||
fields = ["first_name"] | ||
|
||
class ReporterType(DjangoObjectType): | ||
class Meta: | ||
model = Reporter | ||
interfaces = (Node,) | ||
|
||
class Query(ObjectType): | ||
all_reporters = DjangoFilterConnectionField( | ||
ReporterType, filterset_class=ReporterFilter | ||
) | ||
|
||
def resolve_all_reporters(self, info, **args): | ||
return Reporter.objects.order_by("a_choice")[:2] | ||
|
||
Reporter.objects.create( | ||
first_name="Bob", last_name="Doe", email="[email protected]", a_choice=2 | ||
) | ||
Reporter.objects.create( | ||
first_name="John", last_name="Doe", email="[email protected]", a_choice=1 | ||
) | ||
|
||
schema = Schema(query=Query) | ||
query = """ | ||
query NodeFilteringQuery { | ||
allReporters(limit: 1) { | ||
edges { | ||
node { | ||
id | ||
firstName | ||
} | ||
} | ||
} | ||
} | ||
""" | ||
|
||
result = schema.execute(query) | ||
assert len(result.errors) == 1 | ||
assert str(result.errors[0]) == ( | ||
"Received two sliced querysets (high mark) in the connection, please slice only in one." | ||
) | ||
|
||
|
||
def test_order_by_is_perserved(): | ||
class ReporterType(DjangoObjectType): | ||
class Meta: | ||
|
@@ -721,7 +669,7 @@ def resolve_all_reporters(self, info, reverse_order=False, **args): | |
assert reverse_result.data == reverse_expected | ||
|
||
|
||
def test_annotation_is_perserved(): | ||
def test_annotation_is_preserved(): | ||
class ReporterType(DjangoObjectType): | ||
full_name = String() | ||
|
||
|
@@ -766,6 +714,48 @@ def resolve_all_reporters(self, info, **args): | |
assert result.data == expected | ||
|
||
|
||
def test_annotation_with_only(): | ||
class ReporterType(DjangoObjectType): | ||
full_name = String() | ||
|
||
class Meta: | ||
model = Reporter | ||
interfaces = (Node,) | ||
filter_fields = () | ||
|
||
class Query(ObjectType): | ||
all_reporters = DjangoFilterConnectionField(ReporterType) | ||
|
||
def resolve_all_reporters(self, info, **args): | ||
return Reporter.objects.only("first_name", "last_name").annotate( | ||
full_name=Concat( | ||
"first_name", Value(" "), "last_name", output_field=TextField() | ||
) | ||
) | ||
|
||
Reporter.objects.create(first_name="John", last_name="Doe") | ||
|
||
schema = Schema(query=Query) | ||
|
||
query = """ | ||
query NodeFilteringQuery { | ||
allReporters(first: 1) { | ||
edges { | ||
node { | ||
fullName | ||
} | ||
} | ||
} | ||
} | ||
""" | ||
expected = {"allReporters": {"edges": [{"node": {"fullName": "John Doe"}}]}} | ||
|
||
result = schema.execute(query) | ||
|
||
assert not result.errors | ||
assert result.data == expected | ||
|
||
|
||
def test_integer_field_filter_type(): | ||
class PetType(DjangoObjectType): | ||
class Meta: | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -638,6 +638,8 @@ class Meta: | |
class Query(graphene.ObjectType): | ||
all_reporters = DjangoConnectionField(ReporterType) | ||
|
||
assert Query.all_reporters.max_limit == 100 | ||
|
||
r = Reporter.objects.create( | ||
first_name="John", last_name="Doe", email="[email protected]", a_choice=1 | ||
) | ||
|
@@ -679,6 +681,8 @@ class Meta: | |
class Query(graphene.ObjectType): | ||
all_reporters = DjangoConnectionField(ReporterType) | ||
|
||
assert Query.all_reporters.max_limit == 100 | ||
|
||
r = Reporter.objects.create( | ||
first_name="John", last_name="Doe", email="[email protected]", a_choice=1 | ||
) | ||
|
@@ -804,7 +808,7 @@ def resolve_all_reporters(self, info, **args): | |
schema = graphene.Schema(query=Query) | ||
query = """ | ||
query ReporterLastQuery { | ||
allReporters(first: 2) { | ||
allReporters(first: 1) { | ||
edges { | ||
node { | ||
id | ||
|
@@ -1116,3 +1120,55 @@ def resolve_films(root, info): | |
with django_assert_num_queries(3) as captured: | ||
result = schema.execute(query) | ||
assert not result.errors | ||
|
||
|
||
def test_should_preserve_annotations(): | ||
class ReporterType(DjangoObjectType): | ||
class Meta: | ||
model = Reporter | ||
interfaces = (graphene.relay.Node,) | ||
|
||
class FilmType(DjangoObjectType): | ||
reporters = DjangoConnectionField(ReporterType) | ||
reporters_count = graphene.Int() | ||
|
||
class Meta: | ||
model = Film | ||
interfaces = (graphene.relay.Node,) | ||
|
||
class Query(graphene.ObjectType): | ||
films = DjangoConnectionField(FilmType) | ||
|
||
def resolve_films(root, info): | ||
qs = Film.objects.prefetch_related("reporters") | ||
return qs.annotate(reporters_count=models.Count("reporters")) | ||
|
||
r1 = Reporter.objects.create(first_name="Dave", last_name="Smith") | ||
r2 = Reporter.objects.create(first_name="Jane", last_name="Doe") | ||
|
||
f1 = Film.objects.create() | ||
f1.reporters.set([r1, r2]) | ||
f2 = Film.objects.create() | ||
f2.reporters.set([r2]) | ||
|
||
query = """ | ||
query { | ||
films { | ||
edges { | ||
node { | ||
reportersCount | ||
} | ||
} | ||
} | ||
} | ||
""" | ||
schema = graphene.Schema(query=Query) | ||
result = schema.execute(query) | ||
assert not result.errors, str(result) | ||
|
||
expected = { | ||
"films": { | ||
"edges": [{"node": {"reportersCount": 2}}, {"node": {"reportersCount": 1}}] | ||
} | ||
} | ||
assert result.data == expected, str(result.data) |