Skip to content

Commit

Permalink
fix: Take care all self-reference comparison and fix MongoengineConne…
Browse files Browse the repository at this point in the history
…ctionField.default_filter_args.
  • Loading branch information
abawchen committed Feb 27, 2018
1 parent 5686b15 commit dcb9133
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 37 deletions.
2 changes: 2 additions & 0 deletions Makefile
Expand Up @@ -2,10 +2,12 @@ clean:
@rm -f .coverage 2> /dev/null
@rm -rf .eggs 2> /dev/null
@rm -rf .cache 2> /dev/null
@rm -rf ./graphene_mongo/.cache 2> /dev/null
@rm -rf build 2> /dev/null
@rm -rf dist 2> /dev/null
@rm -rf graphene_mongo.egg-info 2> /dev/null
@find . -name "*.pyc" -delete
@find . -name "*.swp" -delete
@find . -name "__pycache__" -delete

lint:
Expand Down
5 changes: 4 additions & 1 deletion graphene_mongo/fields.py
Expand Up @@ -65,8 +65,11 @@ def args(self, args):

@property
def default_filter_args(self):
def is_filterable(kv):
return hasattr(kv[1], '_type') and hasattr(kv[1]._type, '_of_type')

return reduce(
lambda r, kv: r.update({kv[0]: kv[1]._type._of_type()}) or r if hasattr(kv[1], '_type') else r,
lambda r, kv: r.update({kv[0]: kv[1]._type._of_type()}) or r if is_filterable(kv) else r,
self.fields.items(),
{}
)
Expand Down
2 changes: 1 addition & 1 deletion graphene_mongo/tests/models.py
Expand Up @@ -61,4 +61,4 @@ class Player(Document):
last_name = StringField(required=True)
opponent = ReferenceField('Player')
players = ListField(ReferenceField('Player'))
articles = ListField(ReferenceField('Article'))
# articles = ListField(ReferenceField('Article'))
8 changes: 5 additions & 3 deletions graphene_mongo/tests/test_converter.py
Expand Up @@ -10,6 +10,7 @@
from .models import Article, Editor, EmbeddedArticle, Player, Reporter

from ..converter import convert_mongoengine_field
from ..fields import MongoengineConnectionField
from ..types import MongoengineObjectType


Expand Down Expand Up @@ -101,9 +102,8 @@ class Meta:
dynamic_field = graphene_field.get_type()
assert dynamic_field._of_type == A


def test_should_self_reference_convert_dynamic():

# pass
class P(MongoengineObjectType):

class Meta:
Expand All @@ -116,6 +116,9 @@ class Meta:
assert isinstance(graphene_type, graphene.Field)
assert graphene_type.type == P

graphene_field = convert_mongoengine_field(Player._fields['players'], P._meta.registry)
assert isinstance(graphene_field, MongoengineConnectionField)


def test_should_list_of_self_reference_convert_list():

Expand All @@ -133,4 +136,3 @@ class Meta:
assert isinstance(graphene_field, graphene.List)
dynamic_field = graphene_field.get_type()
assert dynamic_field._of_type == P

70 changes: 39 additions & 31 deletions graphene_mongo/tests/test_query.py
Expand Up @@ -34,6 +34,8 @@ def setup_fixtures():
player1.save()
player2 = Player(first_name='Magic', last_name='Johnson', opponent=player1)
player2.save()
player3 = Player(first_name='Larry', last_name='Bird', players=[player1, player2])
player3.save()

setup_fixtures()

Expand Down Expand Up @@ -403,50 +405,56 @@ def test_should_self_reference():

class Query(graphene.ObjectType):

players = MongoengineConnectionField(PlayerNode)
all_players = graphene.List(PlayerType)

def resolve_all_players(self, *args, **kwargs):
return Player.objects.all()

query = '''
query PlayerQuery {
players {
edges {
cursor,
node {
firstName,
opponent {
firstName
}
}
query PlayersQuery {
allPlayers {
firstName,
opponent {
firstName
},
players {
firstName
}
}
}
'''
expected = {
'players': {
'edges': [
{
'cursor': 'xxx',
'node': {
'firstName': 'Michael',
'opponent': None
}
'allPlayers': [
{
'firstName': 'Michael',
'opponent': None,
'players': []
},
{
'firstName': 'Magic',
'opponent': {
'firstName': 'Michael'
},
{
'cursor': 'xxx',
'node': {
'firstName': 'Magic',
'opponent': {
'firstName': 'Michael'
}
'players': []
},
{
'firstName': 'Larry',
'opponent': None,
'players': [
{
'firstName': 'Michael'
},
{
'firstName': 'Magic'
}
}
]
}
]
}
]
}
schema = graphene.Schema(query=Query)
result = schema.execute(query)

assert not result.errors
assert all(item in get_nodes(result.data, 'players') for item in get_nodes(expected, 'players'))
assert json.dumps(result.data, sort_keys=True) == json.dumps(expected, sort_keys=True)


# TODO:
Expand Down
4 changes: 3 additions & 1 deletion graphene_mongo/types.py
Expand Up @@ -26,13 +26,15 @@ def construct_fields(model, registry, only_fields, exclude_fields):
# Take care of list of self-reference.
document_type_obj = field.field.__dict__.get('document_type_obj', None)
if document_type_obj == model._class_name \
or isinstance(document_type_obj, model):
or isinstance(document_type_obj, model) \
or document_type_obj == model:
self_referenced[name] = field
continue
converted = convert_mongoengine_field(field, registry)
if not converted:
continue
fields[name] = converted

return fields, self_referenced


Expand Down

0 comments on commit dcb9133

Please sign in to comment.