def test_graphql_interface_init(mocked_resolver_factory): interface = GraphQLInterfaceType( name="Name", fields=OrderedDict([ ("test", GraphQLField(name="arg", gql_type="Int")), ("another", GraphQLField(name="arg", gql_type="String")), ]), description="description", ) assert interface.name == "Name" assert interface.find_field("test") == GraphQLField(name="arg", gql_type="Int") assert interface.find_field("another") == GraphQLField(name="arg", gql_type="String") assert interface.description == "description"
def interface_type_definition(self, tree: Tree) -> GraphQLInterfaceType: # TODO: Add directives description = None ast_node = None # TODO: Should we discard it or keep it ? name = None fields = None for child in tree.children: if child.type == 'description': description = child.value elif child.type == 'INTERFACE': ast_node = child elif child.type == 'IDENT': name = String(str(child.value), ast_node=child) elif child.type == 'fields': fields = child.value elif child.type == 'discard': pass else: raise UnexpectedASTNode( "Unexpected AST node `{}`, type `{}`".format( child, child.__class__.__name__)) return GraphQLInterfaceType( name=name, fields=fields, description=description, )
def interface_type_definition(self, tree: Tree) -> GraphQLInterfaceType: description = None name = None fields = None directives = None for child in tree.children: if child.type == "description": description = child.value elif child.type == "IDENT": name = child.value elif child.type == "fields": fields = child.value elif child.type == "directives": directives = child.value elif child.type == "discard" or child.type == "INTERFACE": pass else: raise UnexpectedASTNode( "Unexpected AST node `{}`, type `{}`".format( child, child.__class__.__name__)) return GraphQLInterfaceType( name=name, fields=fields, description=description, schema=self._schema, directives=directives, )
def parse_interface_type_definition( interface_type_definition_node: "InterfaceTypeDefinitionNode", schema: "GraphQLSchema", ) -> Optional["GraphQLInterfaceType"]: """ Computes an AST interface type definition node into a GraphQLInterfaceType instance. :param interface_type_definition_node: AST interface type definition node to treat :param schema: the GraphQLSchema instance linked to the engine :type interface_type_definition_node: InterfaceTypeDefinitionNode :type schema: GraphQLSchema :return: the GraphQLInterfaceType instance :rtype: Optional[GraphQLInterfaceType] """ if not interface_type_definition_node: return None interface_type = GraphQLInterfaceType( name=parse_name(interface_type_definition_node.name, schema), description=parse_name(interface_type_definition_node.description, schema), fields=parse_fields_definition(interface_type_definition_node.fields, schema), directives=interface_type_definition_node.directives, ) schema.add_type_definition(interface_type) return interface_type
def test_graphql_interface_repr(): interface = GraphQLInterfaceType(name="Name", fields=OrderedDict([ ("test", GraphQLField(name="arg", gql_type="Int")), ("another", GraphQLField(name="arg", gql_type="String")), ]), description="description") assert interface.__repr__() == "GraphQLInterfaceType(name='Name', " \ "fields=OrderedDict([" \ "('test', GraphQLField(name='arg', gql_type='Int', arguments=OrderedDict(), resolver=None, description=None)), " \ "('another', GraphQLField(name='arg', gql_type='String', arguments=OrderedDict(), resolver=None, description=None))" \ "]), description='description')" assert interface == eval(repr(interface))
def test_graphql_interface_init(): interface = GraphQLInterfaceType(name="Name", fields=OrderedDict([ ("test", GraphQLField(name="arg", gql_type="Int")), ("another", GraphQLField(name="arg", gql_type="String")), ]), description="description") assert interface.name == "Name" assert interface.fields == OrderedDict([ ("test", GraphQLField(name="arg", gql_type="Int")), ("another", GraphQLField(name="arg", gql_type="String")), ]) assert interface.description == "description"
def test_graphql_interface_eq(mocked_resolver_factory): interface = GraphQLInterfaceType( name="Name", fields=OrderedDict([ ("test", GraphQLField(name="arg", gql_type="Int")), ("another", GraphQLField(name="arg", gql_type="String")), ]), description="description", ) ## Same assert interface == interface assert interface == GraphQLInterfaceType( name="Name", fields=OrderedDict([ ("test", GraphQLField(name="arg", gql_type="Int")), ("another", GraphQLField(name="arg", gql_type="String")), ]), description="description", ) # Currently we ignore the description in comparing assert interface == GraphQLInterfaceType( name="Name", fields=OrderedDict([ ("test", GraphQLField(name="arg", gql_type="Int")), ("another", GraphQLField(name="arg", gql_type="String")), ]), ) ## Different assert interface != GraphQLInterfaceType( name="Name", fields=OrderedDict([ ("another", GraphQLField(name="arg", gql_type="String")), ("test", GraphQLField(name="arg", gql_type="Int")), # We reversed the order of arguments ]), ) assert interface != GraphQLInterfaceType(name="Name", fields=OrderedDict()) assert interface != GraphQLInterfaceType( name="OtherName", fields=OrderedDict([ ("another", GraphQLField(name="arg", gql_type="String")), ("test", GraphQLField(name="arg", gql_type="Int")), # We reversed the order of arguments ]), )
async def test_build_schema(monkeypatch, clean_registry): from tartiflette.resolver.factory import ResolverExecutorFactory from tartiflette.engine import _import_builtins resolver_excutor = Mock() monkeypatch.setattr( ResolverExecutorFactory, "get_resolver_executor", Mock(return_value=resolver_excutor), ) from tartiflette.schema.bakery import SchemaBakery from tartiflette.types.argument import GraphQLArgument from tartiflette.types.field import GraphQLField from tartiflette.types.input_object import GraphQLInputObjectType from tartiflette.types.interface import GraphQLInterfaceType from tartiflette.types.list import GraphQLList from tartiflette.types.non_null import GraphQLNonNull from tartiflette.types.object import GraphQLObjectType from tartiflette.types.union import GraphQLUnionType schema_sdl = """ schema @enable_cache { query: RootQuery mutation: RootMutation subscription: RootSubscription } union Group = Foo | Bar | Baz interface Something { oneField: [Int] anotherField: [String] aLastOne: [[Date!]]! } input UserInfo { name: String dateOfBirth: [Date] graphQLFan: Boolean! } # directive @partner(goo: Anything) on ENUM_VALUE \"\"\" This is a docstring for the Test Object Type. \"\"\" type Test implements Unknown & Empty{ \"\"\" This is a field description :D \"\"\" field(input: InputObject): String! anotherField: [Int] fieldWithDefaultValueArg(test: String = "default"): ID simpleField: Date } """ _, schema_sdl = await _import_builtins([], schema_sdl, "G") _, schema_E = await _import_builtins([], "", "E") clean_registry.register_sdl("G", schema_sdl) clean_registry.register_sdl("E", schema_E) generated_schema = SchemaBakery._preheat("G") expected_schema = SchemaBakery._preheat("E") expected_schema.query_type = "RootQuery" expected_schema.mutation_type = "RootMutation" expected_schema.subscription_type = "RootSubscription" expected_schema.add_definition( GraphQLUnionType(name="Group", gql_types=["Foo", "Bar", "Baz"])) expected_schema.add_definition( GraphQLInterfaceType( name="Something", fields=OrderedDict( oneField=GraphQLField(name="oneField", gql_type=GraphQLList(gql_type="Int")), anotherField=GraphQLField( name="anotherField", gql_type=GraphQLList(gql_type="String"), ), aLastOne=GraphQLField( name="aLastOne", gql_type=GraphQLNonNull(gql_type=GraphQLList( gql_type=GraphQLList(gql_type=GraphQLNonNull( gql_type="Date")))), ), ), )) expected_schema.add_definition( GraphQLInputObjectType( name="UserInfo", fields=OrderedDict([ ("name", GraphQLArgument(name="name", gql_type="String")), ( "dateOfBirth", GraphQLArgument( name="dateOfBirth", gql_type=GraphQLList(gql_type="Date"), ), ), ( "graphQLFan", GraphQLArgument( name="graphQLFan", gql_type=GraphQLNonNull(gql_type="Boolean"), ), ), ]), )) expected_schema.add_definition( GraphQLObjectType( name="Test", fields=OrderedDict([ ( "field", GraphQLField( name="field", gql_type=GraphQLNonNull(gql_type="String"), arguments=OrderedDict(input=GraphQLArgument( name="input", gql_type="InputObject")), ), ), ( "anotherField", GraphQLField( name="anotherField", gql_type=GraphQLList(gql_type="Int"), ), ), ( "fieldWithDefaultValueArg", GraphQLField( name="fieldWithDefaultValueArg", gql_type="ID", arguments=OrderedDict(test=GraphQLArgument( name="test", gql_type="String", default_value="default", )), ), ), ( "simpleField", GraphQLField(name="simpleField", gql_type="Date"), ), ]), interfaces=["Unknown", "Empty"], )) assert 5 < len(generated_schema._gql_types) assert len(expected_schema._gql_types) == len(generated_schema._gql_types) monkeypatch.undo()
def test_build_schema(): schema_sdl = """ schema @enable_cache { query: RootQuery mutation: RootMutation subscription: RootSubscription } scalar Date union Group = Foo | Bar | Baz interface Something { oneField: [Int] anotherField: [String] aLastOne: [[Date!]]! } input UserInfo { name: String dateOfBirth: [Date] graphQLFan: Boolean! } # directive @partner(goo: Anything) on ENUM_VALUE \"\"\" This is a docstring for the Test Object Type. \"\"\" type Test implements Unknown & Empty @enable_cache { \"\"\" This is a field description :D \"\"\" field(input: InputObject): String! @deprecated(reason: "Useless field") anotherField: [Int] @something( lst: ["about" "stuff"] obj: {some: [4, 8, 16], complex: {about: 19.4}, another: EnumVal} ) fieldWithDefaultValueArg(test: String = "default"): ID simpleField: Date } """ generated_schema = build_graphql_schema_from_sdl(schema_sdl, schema=GraphQLSchema()) expected_schema = GraphQLSchema() expected_schema.query_type = "RootQuery" expected_schema.mutation_type = "RootMutation" expected_schema.subscription_type = "RootSubscription" expected_schema.add_definition(GraphQLScalarType(name="Date")) expected_schema.add_definition(GraphQLUnionType(name="Group", gql_types=[ "Foo", "Bar", "Baz", ])) expected_schema.add_definition(GraphQLInterfaceType(name="Something", fields=OrderedDict( oneField=GraphQLField(name="oneField", gql_type=GraphQLList(gql_type="Int")), anotherField=GraphQLField(name="anotherField", gql_type=GraphQLList(gql_type="String")), aLastOne=GraphQLField(name="aLastOne", gql_type=GraphQLNonNull(gql_type=GraphQLList(gql_type=GraphQLList(gql_type=GraphQLNonNull(gql_type="Date"))))), ))) expected_schema.add_definition(GraphQLInputObjectType(name="UserInfo", fields=OrderedDict([ ('name', GraphQLArgument(name="name", gql_type="String")), ('dateOfBirth', GraphQLArgument(name="dateOfBirth", gql_type=GraphQLList(gql_type="Date"))), ('graphQLFan', GraphQLArgument(name="graphQLFan", gql_type=GraphQLNonNull(gql_type="Boolean"))), ]))) expected_schema.add_definition(GraphQLObjectType(name="Test", fields=OrderedDict([ ('field', GraphQLField(name="field", gql_type=GraphQLNonNull(gql_type="String"), arguments=OrderedDict( input=GraphQLArgument(name="input", gql_type="InputObject"), ))), ('anotherField', GraphQLField(name="anotherField", gql_type=GraphQLList(gql_type="Int"))), ('fieldWithDefaultValueArg', GraphQLField(name="fieldWithDefaultValueArg", gql_type="ID", arguments=OrderedDict( test=GraphQLArgument(name="test", gql_type="String", default_value="default"), ))), ('simpleField', GraphQLField(name="simpleField", gql_type="Date")), ]), interfaces=[ "Unknown", "Empty", ])) assert expected_schema == generated_schema assert len(generated_schema._gql_types) > 5 assert len(generated_schema._gql_types) == len(expected_schema._gql_types) # Only the default types should be in the schema assert len(DefaultGraphQLSchema._gql_types) == 5
], ), ( """ \"\"\" Vehicle interface for any type of entity-moving apparatus \"\"\" interface Vehicle { speedInKmh: Float } """, [ Tree('type_definition', [ GraphQLInterfaceType(name="Vehicle", fields=OrderedDict([ ("speedInKmh", GraphQLField(name="speedInKmh", gql_type="Float")), ])), ]) ], ), ( """ input UserProfileInput { fullName: String } """, [ Tree('type_definition', [ GraphQLInputObjectType(name="UserProfileInput", fields=OrderedDict([