Skip to content

Commit 2d55d89

Browse files
committed
Improved testing coverage. Removed unused logic
1 parent 55e2027 commit 2d55d89

File tree

6 files changed

+88
-14
lines changed

6 files changed

+88
-14
lines changed

graphene/core/options.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,8 @@ def contribute_to_class(self, cls, name):
5555
else:
5656
self.proxy = False
5757

58-
if self.interfaces != [] and self.interface:
59-
raise Exception("A interface cannot inherit from interfaces")
60-
6158
del self.meta
6259

63-
@cached_property
64-
def object(self):
65-
return namedtuple(self.type_name, self.fields_map.keys())
66-
6760
def add_field(self, field):
6861
self.local_fields.append(field)
6962

graphene/core/types.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,6 @@ class BaseObjectType(object):
132132
def __new__(cls, *args, **kwargs):
133133
if cls._meta.is_interface:
134134
raise Exception("An interface cannot be initialized")
135-
if not args and not kwargs:
136-
return None
137135
return super(BaseObjectType, cls).__new__(cls)
138136

139137
def __init__(self, *args, **kwargs):

graphene/utils/proxy_snake_dict.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ def __iter__(self):
2424
def __len__(self):
2525
return len(self.data)
2626

27-
def __delitem__(self):
27+
def __delitem__(self, item):
2828
raise TypeError('ProxySnakeDict does not support item deletion')
2929

30-
def __setitem__(self):
30+
def __setitem__(self, item, value):
3131
raise TypeError('ProxySnakeDict does not support item assignment')
3232

3333
def __getitem__(self, key):
@@ -59,5 +59,12 @@ def iteritems(self):
5959
for k in self.iterkeys():
6060
yield k, self[k]
6161

62+
def to_data_dict(self):
63+
return self.data.__class__(self.iteritems())
64+
65+
def __eq__(self, other):
66+
return self.to_data_dict() == other.to_data_dict()
67+
6268
def __repr__(self):
63-
return dict(self.iteritems()).__repr__()
69+
data_repr = self.to_data_dict().__repr__()
70+
return '<ProxySnakeDict {}>'.format(data_repr)

tests/core/test_types.py

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,18 @@ class Human(Character):
3434
class Meta:
3535
type_name = 'core_Human'
3636

37+
@property
38+
def readonly_prop(self):
39+
return 'readonly'
40+
41+
@property
42+
def write_prop(self):
43+
return self._write_prop
44+
45+
@write_prop.setter
46+
def write_prop(self, value):
47+
self._write_prop = value
48+
3749
schema = Schema()
3850

3951

@@ -44,8 +56,12 @@ def test_interface():
4456
assert Character._meta.type_name == 'core_Character'
4557
assert object_type.description == 'Character description'
4658
assert list(object_type.get_fields().keys()) == ['name']
47-
# assert object_type.get_fields() == {
48-
# 'name': Character._meta.fields_map['name'].internal_field(schema)}
59+
60+
61+
def test_interface_cannot_initialize():
62+
with raises(Exception) as excinfo:
63+
c = Character()
64+
assert 'An interface cannot be initialized' == str(excinfo.value)
4965

5066

5167
def test_interface_resolve_type():
@@ -66,6 +82,27 @@ def test_object_type():
6682
assert Human._meta.fields_map['name'].object_type == Human
6783

6884

85+
def test_object_type_container():
86+
h = Human(name='My name')
87+
assert h.name == 'My name'
88+
89+
90+
def test_object_type_set_properties():
91+
h = Human(readonly_prop='custom', write_prop='custom')
92+
assert h.readonly_prop == 'readonly'
93+
assert h.write_prop == 'custom'
94+
95+
96+
def test_object_type_container_invalid_kwarg():
97+
with raises(TypeError):
98+
Human(invalid='My name')
99+
100+
101+
def test_object_type_container_too_many_args():
102+
with raises(IndexError):
103+
Human('Peter', 'No friends :(', None)
104+
105+
69106
def test_field_clashes():
70107
with raises(Exception) as excinfo:
71108
class Droid(Character):

tests/utils/test_misc.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import collections
2+
from graphql.core.type import GraphQLEnumType
3+
from graphene.utils.misc import enum_to_graphql_enum
4+
5+
item = collections.namedtuple('type', 'name value')
6+
7+
8+
class MyCustomEnum(list):
9+
__name__ = 'MyName'
10+
11+
12+
def test_enum_to_graphql_enum():
13+
assert isinstance(enum_to_graphql_enum(MyCustomEnum([item('k', 'v')])), GraphQLEnumType)

tests/utils/test_proxy_snake_dict.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from py.test import raises
12
from graphene.utils import ProxySnakeDict
23

34

@@ -8,13 +9,19 @@ def test_proxy_snake_dict():
89
assert 'two' in p
910
assert 'threeOrFor' in p
1011
assert 'none' in p
12+
assert len(p) == len(my_data)
1113
assert p['none'] is None
1214
assert p.get('none') is None
1315
assert p.get('none_existent') is None
1416
assert 'three_or_for' in p
1517
assert p.get('three_or_for') == 3
1618
assert 'inside' in p
1719
assert 'other_camel_case' in p['inside']
20+
assert sorted(p.items()) == sorted(list([('inside', ProxySnakeDict({'other_camel_case': 3})),
21+
('none', None),
22+
('three_or_for', 3),
23+
('two', 2),
24+
('one', 1)]))
1825

1926

2027
def test_proxy_snake_dict_as_kwargs():
@@ -24,3 +31,22 @@ def test_proxy_snake_dict_as_kwargs():
2431
def func(**kwargs):
2532
return kwargs.get('my_data')
2633
assert func(**p) == 1
34+
35+
36+
def test_proxy_snake_dict_repr():
37+
my_data = {'myData': 1}
38+
p = ProxySnakeDict(my_data)
39+
40+
assert repr(p) == "<ProxySnakeDict {'my_data': 1}>"
41+
42+
43+
def test_proxy_snake_dict_set():
44+
p = ProxySnakeDict({})
45+
with raises(TypeError):
46+
p['a'] = 2
47+
48+
49+
def test_proxy_snake_dict_delete():
50+
p = ProxySnakeDict({})
51+
with raises(TypeError):
52+
del p['a']

0 commit comments

Comments
 (0)