1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
import re
import textwrap
import pytest
import strawberry
from strawberry.exceptions import InvalidSuperclassInterfaceError
from strawberry.printer import print_schema
from tests.conftest import skip_if_gql_32
def test_renaming_input_fields():
@strawberry.input
class FilterInput:
in_: str | None = strawberry.field(name="in", default=strawberry.UNSET)
@strawberry.type
class Query:
hello: str = "Hello"
@strawberry.type
class Mutation:
@strawberry.mutation
def filter(self, input: FilterInput) -> str:
return f"Hello {input.in_ or 'nope'}"
schema = strawberry.Schema(query=Query, mutation=Mutation)
query = "mutation { filter(input: {}) }"
result = schema.execute_sync(query)
assert not result.errors
assert result.data
assert result.data["filter"] == "Hello nope"
@skip_if_gql_32("formatting is different in gql 3.2")
def test_input_with_nonscalar_field_default():
@strawberry.input
class NonScalarField:
id: int = 10
nullable_field: int | None = None
@strawberry.input
class Input:
non_scalar_field: NonScalarField = strawberry.field(
default_factory=NonScalarField
)
id: int = 10
@strawberry.type
class ExampleOutput:
input_id: int
non_scalar_id: int
non_scalar_nullable_field: int | None
@strawberry.type
class Query:
@strawberry.field
def example(self, data: Input) -> ExampleOutput:
return ExampleOutput(
input_id=data.id,
non_scalar_id=data.non_scalar_field.id,
non_scalar_nullable_field=data.non_scalar_field.nullable_field,
)
schema = strawberry.Schema(query=Query)
expected = """
type ExampleOutput {
inputId: Int!
nonScalarId: Int!
nonScalarNullableField: Int
}
input Input {
nonScalarField: NonScalarField! = { id: 10 }
id: Int! = 10
}
input NonScalarField {
id: Int! = 10
nullableField: Int = null
}
type Query {
example(data: Input!): ExampleOutput!
}
"""
assert print_schema(schema) == textwrap.dedent(expected).strip()
query = """
query($input_data: Input!)
{
example(data: $input_data) {
inputId nonScalarId nonScalarNullableField
}
}
"""
result = schema.execute_sync(
query, variable_values={"input_data": {"nonScalarField": {}}}
)
assert not result.errors
expected_result = {"inputId": 10, "nonScalarId": 10, "nonScalarNullableField": None}
assert result.data["example"] == expected_result
@pytest.mark.raises_strawberry_exception(
InvalidSuperclassInterfaceError,
match=re.escape(
"Input class 'SomeInput' cannot inherit from interface(s): SomeInterface"
),
)
def test_input_cannot_inherit_from_interface():
@strawberry.interface
class SomeInterface:
some_arg: str
@strawberry.input
class SomeInput(SomeInterface):
another_arg: str
@pytest.mark.raises_strawberry_exception(
InvalidSuperclassInterfaceError,
match=re.escape(
"Input class 'SomeOtherInput' cannot inherit from interface(s): SomeInterface, SomeOtherInterface"
),
)
def test_input_cannot_inherit_from_interfaces():
@strawberry.interface
class SomeInterface:
some_arg: str
@strawberry.interface
class SomeOtherInterface:
some_other_arg: str
@strawberry.input
class SomeOtherInput(SomeInterface, SomeOtherInterface):
another_arg: str
|