Skip to content

Commit

Permalink
Merge pull request #141 from evo-company/fix-enum-as-arg-and-scalar-d…
Browse files Browse the repository at this point in the history
…efault

Fix custom scalar introspection defaultValue. Fix enum opt validation
  • Loading branch information
kindermax authored Oct 20, 2023
2 parents 1dddc14 + bd4468f commit 299cd89
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 6 deletions.
4 changes: 2 additions & 2 deletions hiku/introspection/graphql.py
Original file line number Diff line number Diff line change
Expand Up @@ -567,8 +567,8 @@ def input_value_info(
scalar = schema.query_graph.scalars_map[
option.type_info.type_name
]
default = serialize(
option.type, option.default, scalar.serialize
default = json.dumps(
serialize(option.type, option.default, scalar.serialize)
)
else:
default = json.dumps(option.default)
Expand Down
5 changes: 5 additions & 0 deletions hiku/validate/query.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
SequenceMeta,
RecordMeta,
TypeRefMeta,
EnumRefMeta,
GenericMeta,
AnyMeta,
BooleanMeta,
Expand Down Expand Up @@ -250,6 +251,10 @@ def visit_typeref(self, type_: TypeRefMeta) -> None:
def visit_scalar(self, type_: ScalarMeta) -> None:
pass

# TODO: add enum validation errors
def visit_enumref(self, type_: EnumRefMeta) -> None:
pass


class _ValidateOptions(GraphVisitor):
"""
Expand Down
9 changes: 8 additions & 1 deletion tests/test_enum.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from hiku.utils import listify
from hiku.readers.graphql import read
from hiku.validate.graph import GraphValidationError
from hiku.validate.query import validate


def execute(graph, query):
Expand Down Expand Up @@ -260,14 +261,20 @@ def get_field(fname, id_):
]),
], enums=[enum])

result = execute(graph, read("query GetUser { user { id status } }"))
query = "query GetUser { user { id status } }"

assert validate(graph, read(query)) == []

result = execute(graph, read(query))
assert result == {
'user': {
'id': 1,
'status': 'ACTIVE'
}
}



@pytest.mark.parametrize("enum", [
Enum.from_builtin(Status, 'UserStatus'),
Enum('UserStatus', ['ACTIVE', 'DELETED']),
Expand Down
40 changes: 37 additions & 3 deletions tests/test_introspection_graphql.py
Original file line number Diff line number Diff line change
Expand Up @@ -607,14 +607,48 @@ def serialize(cls, value: int) -> str:
),
_type('Query', 'OBJECT', fields=[
_field('user', _obj('User'), args=[
_ival('uid', _non_null(_scalar('UserId')), defaultValue='uid1'),
_ival('uidMany', _seq_of(_scalar('UserId')), defaultValue=['uid1']),
_ival('uidMaybe', _scalar('UserId'), defaultValue=None),
_ival('uid', _non_null(_scalar('UserId')), defaultValue='"uid1"'),
_ival('uidMany', _seq_of(_scalar('UserId')), defaultValue='["uid1"]'),
_ival('uidMaybe', _scalar('UserId'), defaultValue="null"),
]),
], ),
_type('UserId', 'SCALAR'),
]) == introspect(graph)


def test_custom_int_scalar():
class UserIdInt(Scalar):
@classmethod
def parse(cls, value: int) -> int:
return int(value)

@classmethod
def serialize(cls, value: int) -> int:
return int(value)

graph = Graph([
Root([
Field(
'userId',
UserIdInt,
_noop,
options=[
Option('uid', UserIdInt, default=1),
]
),
]),
], scalars=[UserIdInt])

assert _schema([
_type('Query', 'OBJECT', fields=[
_field('userId', _non_null(_scalar('UserIdInt')), args=[
_ival('uid', _non_null(_scalar('UserIdInt')), defaultValue='1'),
]),
], ),
_type('UserIdInt', 'SCALAR'),
]) == introspect(graph)


@pytest.mark.parametrize('name, expected', [
('YesNo', {'kind': 'SCALAR'}),
('XXX', None),
Expand Down

0 comments on commit 299cd89

Please sign in to comment.