Skip to content

Commit 2488f6f

Browse files
authored
Merge pull request #33 from graphql-python/feat-embedded-doc
Test: EmbeddedDocument field
2 parents 0909cdf + 940a1f8 commit 2488f6f

File tree

5 files changed

+105
-14
lines changed

5 files changed

+105
-14
lines changed

graphene_mongo/tests/fixtures.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from .models import (
22
Article, Editor, EmbeddedArticle, Player,
3-
Reporter, Child
3+
Reporter, Child, ProfessorMetadata, ProfessorVector,
44
)
55

66

@@ -84,3 +84,16 @@ def setup_fixtures():
8484

8585
child2 = Child(bar='bar', baz='baz')
8686
child2.save()
87+
88+
ProfessorVector.drop_collection()
89+
professor_metadata = ProfessorMetadata(
90+
id='5e06aa20-6805-4eef-a144-5615dedbe32b',
91+
first_name='Steven',
92+
last_name='Curry',
93+
departments=['NBA', 'MLB']
94+
)
95+
professor_vector = ProfessorVector(
96+
vec=[1.0, 2.3],
97+
metadata=professor_metadata
98+
)
99+
professor_vector.save()

graphene_mongo/tests/models.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
)
55
from mongoengine.fields import (
66
DateTimeField, EmailField, EmbeddedDocumentField,
7-
EmbeddedDocumentListField, ListField,
7+
FloatField, EmbeddedDocumentListField, ListField,
88
MapField, ReferenceField, StringField
99
)
1010

@@ -59,6 +59,8 @@ class Reporter(Document):
5959

6060

6161
class Player(Document):
62+
63+
meta = {'collection': 'test_player'}
6264
first_name = StringField(required=True)
6365
last_name = StringField(required=True)
6466
opponent = ReferenceField('Player')
@@ -78,5 +80,21 @@ class Parent(Document):
7880

7981
class Child(Parent):
8082

81-
meta = {'collection': 'Child'}
83+
meta = {'collection': 'test_child'}
8284
baz = StringField()
85+
86+
87+
class ProfessorMetadata(EmbeddedDocument):
88+
89+
meta = {'collection': 'test_professor_metadata'}
90+
id = StringField(primary_key=False)
91+
first_name = StringField()
92+
last_name = StringField()
93+
departments = ListField(StringField())
94+
95+
96+
class ProfessorVector(Document):
97+
98+
meta = {'collection': 'test_professor_vector'}
99+
vec = ListField(FloatField())
100+
metadata = EmbeddedDocumentField(ProfessorMetadata)

graphene_mongo/tests/test_converter.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66

77
from py.test import raises
88

9-
from .models import Article, Editor, EmbeddedArticle, Player, Reporter
10-
9+
from .models import (
10+
Article, Editor, EmbeddedArticle, Player, Reporter,
11+
ProfessorMetadata, ProfessorVector,
12+
)
1113
from .. import registry
1214
from ..converter import convert_mongoengine_field
1315
from ..fields import MongoengineConnectionField
@@ -80,7 +82,7 @@ def test_should_field_convert_list():
8082
assert_conversion(mongoengine.ListField, graphene.List, field=mongoengine.StringField())
8183

8284

83-
def test_should_embedded_convert_dynamic():
85+
def test_should_reference_convert_dynamic():
8486

8587
class E(MongoengineObjectType):
8688

@@ -96,6 +98,22 @@ class Meta:
9698
assert graphene_type.type == E
9799

98100

101+
def test_should_embedded_convert_dynamic():
102+
103+
class PM(MongoengineObjectType):
104+
105+
class Meta:
106+
model = ProfessorMetadata
107+
interfaces = (Node,)
108+
109+
dynamic_field = convert_mongoengine_field(
110+
ProfessorVector._fields['metadata'], PM._meta.registry)
111+
assert isinstance(dynamic_field, Dynamic)
112+
graphene_type = dynamic_field.get_type()
113+
assert isinstance(graphene_type, graphene.Field)
114+
assert graphene_type.type == PM
115+
116+
99117
def test_should_convert_none():
100118
registry.reset_global_registry()
101119
dynamic_field = convert_mongoengine_field(

graphene_mongo/tests/test_query.py

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
import graphene
44

55
from .fixtures import setup_fixtures
6-
from .models import Editor, Player, Reporter
7-
from .types import (EditorType,
8-
PlayerType,
9-
ReporterType)
6+
from .models import (
7+
Editor, Player, Reporter, ProfessorVector
8+
)
9+
from .types import (
10+
EditorType, PlayerType, ReporterType, ProfessorVectorType
11+
)
1012

1113
setup_fixtures()
1214

@@ -227,6 +229,34 @@ def resolve_all_players(self, *args, **kwargs):
227229
assert json.dumps(result.data, sort_keys=True) == json.dumps(expected, sort_keys=True)
228230

229231

230-
# TODO:
231-
def test_should_paging():
232-
pass
232+
def test_should_query_with_embedded_document():
233+
234+
class Query(graphene.ObjectType):
235+
professor_vector = graphene.Field(ProfessorVectorType, id=graphene.String())
236+
237+
def resolve_professor_vector(self, info, id):
238+
return ProfessorVector.objects(metadata__id=id).first()
239+
240+
query = """
241+
query {
242+
professorVector(id: "5e06aa20-6805-4eef-a144-5615dedbe32b") {
243+
vec
244+
metadata {
245+
firstName
246+
}
247+
}
248+
}
249+
"""
250+
251+
expected = {
252+
'professorVector': {
253+
'vec': [1.0, 2.3],
254+
'metadata': {
255+
'firstName': 'Steven'
256+
}
257+
}
258+
}
259+
schema = graphene.Schema(query=Query, types=[ProfessorVectorType])
260+
result = schema.execute(query)
261+
assert not result.errors
262+
assert json.dumps(result.data, sort_keys=True) == json.dumps(expected, sort_keys=True)

graphene_mongo/tests/types.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from ..types import MongoengineObjectType
44
from .models import (
55
Article, Editor, EmbeddedArticle, Player, Reporter,
6-
Parent, Child
6+
Parent, Child, ProfessorMetadata, ProfessorVector,
77
)
88

99

@@ -49,6 +49,18 @@ class Meta:
4949
model = Child
5050

5151

52+
class ProfessorMetadataType(MongoengineObjectType):
53+
54+
class Meta:
55+
model = ProfessorMetadata
56+
57+
58+
class ProfessorVectorType(MongoengineObjectType):
59+
60+
class Meta:
61+
model = ProfessorVector
62+
63+
5264
class ArticleNode(MongoengineObjectType):
5365

5466
class Meta:

0 commit comments

Comments
 (0)