示例#1
0
def test_mutation_operation_without_name():
    assert print_ast(parse("mutation { id, name }")) == dedent("""
    mutation {
      id
      name
    }
    """)
示例#2
0
def test_SnakeCaseToCamelCaseVisitor():
    query = parse("""
        {
            foo_bar {
                bar_foo
                ... on Object {
                    baz_foo
                }
            }
        }

        fragment A on Object {
            foo_baz
        }
        """)

    visited_query = ast_transforms.SnakeCaseToCamelCaseVisitor().visit(
        query.deepcopy())

    assert visited_query

    assert print_ast(visited_query, indent=4) == dedent("""
        {
            fooBar {
                barFoo
                ... on Object {
                    bazFoo
                }
            }
        }

        fragment A on Object {
            fooBaz
        }
        """)
示例#3
0
def test_query_operation_without_name():
    assert print_ast(parse("query { id, name }")) == dedent("""
    {
      id
      name
    }
    """)
示例#4
0
def test_block_string_single_line_with_leading_space():
    assert (print_ast(
        parse('''
        { field(arg: """    space-led value""") }
    ''')) == dedent('''
    {
      field(arg: """    space-led value""")
    }
    '''))
示例#5
0
def test_kitchen_sink(fixture_file):
    ks = fixture_file("kitchen-sink.graphql")
    assert print_ast(parse(ks)) == dedent('''
query queryName($foo: ComplexType, $site: Site = MOBILE) {
  whoever123is: node(id: [123, 456]) {
    id
    ... on User @defer {
      field2 {
        id
        alias: field1(first: 10, after: $foo) @include(if: $foo) {
          id
          ...frag
        }
      }
    }
    ... @skip(unless: $foo) {
      id
    }
    ... {
      id
    }
  }
}

mutation likeStory {
  like(story: 123) @defer {
    story {
      id
    }
  }
}

subscription StoryLikeSubscription($input: StoryLikeSubscribeInput) {
  storyLikeSubscribe(input: $input) {
    story {
      likers {
        count
      }
      likeSentence {
        text
      }
    }
  }
}

fragment frag on Friend {
  foo(size: $size, bar: $b, obj: {key: "value", block: """
    block string uses \\"""
  """})
}

{
  unnamed(truthy: true, falsey: false, nullish: null)
  query
}
''')
示例#6
0
def test_mutation_operation_without_name_and_artifacts():
    assert (print_ast(
        parse("""
        mutation ($foo: TestType) @testDirective { id, name }
    """)) == dedent("""
    mutation ($foo: TestType) @testDirective {
      id
      name
    }
    """))
示例#7
0
def test_block_string_single_line_with_leading_space_and_quotation():
    ast = parse('''
    {
      field(arg: """    space-led value "quoted string"
      """)
    }
    ''')
    assert print_ast(ast) == dedent('''
    {
      field(arg: """    space-led value "quoted string"
      """)
    }
    ''')
示例#8
0
def test_fragment_defined_variables():
    ast = parse(
        """
    fragment Foo($a: ComplexType, $b: Boolean = false) on TestType {
        id
    }
    """,
        experimental_fragment_variables=True,
    )
    assert print_ast(ast) == dedent("""
    fragment Foo($a: ComplexType, $b: Boolean = false) on TestType {
      id
    }
    """)
示例#9
0
def test_variable_definitions():
    assert (print_ast(
        parse(
            """
                query Query(
                    $a: ComplexType,
                    $b: Boolean = false,
                    $c: String @foo,
                    $d: Int! = 42 @bar(value: 42)
                ) {
                    id
                }
                """, )) == dedent("""
        query Query($a: ComplexType, $b: Boolean = false, $c: String @foo, \
$d: Int! = 42 @bar(value: 42)) {
          id
        }
        """))
示例#10
0
def test_block_string_string_with_a_first_line_indentation():
    ast = parse('''
        {
          field(arg: """
                first
              line
            indentation
          """)
        }
    ''')
    assert print_ast(ast) == dedent('''
    {
      field(arg: """
            first
          line
        indentation
      """)
    }
    ''')
示例#11
0
def test_RemoveFieldAliasesVisitor():
    query = parse("""
        {
            foo: bar {
                foo_one: one
                ... on Object {
                    foo_two: two
                }
                ... A
            }
        }

        fragment A on Object {
            foo_three: three
        }
        """)

    visited_query = ast_transforms.RemoveFieldAliasesVisitor().visit(
        query.deepcopy())

    assert visited_query

    assert print_ast(visited_query, indent=4) == dedent("""
        {
            bar {
                one
                ... on Object {
                    two
                }
                ...A
            }
        }

        fragment A on Object {
            three
        }
        """)
示例#12
0
def test_minimal_ast():
    assert print_ast(_ast.Field(name=_ast.Name(value="foo"))) == "foo"
示例#13
0
def test_schema_kitchen_sink(fixture_file):
    ks = fixture_file("schema-kitchen-sink.graphql")
    assert print_ast(parse(ks, allow_type_system=True)) == dedent('''
schema {
  query: QueryType
  mutation: MutationType
}

"""
This is a description
of the `Foo` type.
"""
type Foo implements Bar & Baz {
  one: Type
  two(argument: InputType!): Type
  three(argument: InputType, other: String): Int
  four(argument: String = "string"): String
  five(argument: [String] = ["string", "string"]): String
  six(argument: InputType = {key: "value"}): Type
  seven(argument: Int = null): Type
}

type AnnotatedObject @onObject(arg: "value") {
  annotatedField(arg: Type = "default" @onArg): Type @onField
}

type UndefinedType

extend type Foo {
  seven(argument: [String]): Type
}

extend type Foo @onType

interface Bar {
  one: Type
  four(argument: String = "string"): String
}

interface AnnotatedInterface @onInterface {
  annotatedField(arg: Type @onArg): Type @onField
}

interface UndefinedInterface

extend interface Bar {
  two(argument: InputType!): Type
}

extend interface Bar @onInterface

union Feed = Story | Article | Advert

union AnnotatedUnion @onUnion = A | B

union AnnotatedUnionTwo @onUnion = A | B

union UndefinedUnion

extend union Feed = Photo | Video

extend union Feed @onUnion

scalar CustomScalar

scalar AnnotatedScalar @onScalar

extend scalar CustomScalar @onScalar

enum Site {
  DESKTOP
  MOBILE
}

enum AnnotatedEnum @onEnum {
  ANNOTATED_VALUE @onEnumValue
  OTHER_VALUE
}

enum UndefinedEnum

extend enum Site {
  VR
}

extend enum Site @onEnum

input InputType {
  key: String!
  answer: Int = 42
}

input AnnotatedInput @onInputObject {
  annotatedField: Type @onField
}

input UndefinedInput

extend input InputType {
  other: Float = 1.23e4
}

extend input InputType @onInputObject

directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT

directive @include(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT

directive @include2(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT

extend schema @onSchema

extend schema @onSchema {
  subscription: SubscriptionType
}
''')