File: test_star_wars_validation.py

package info (click to toggle)
graphql-core 3.2.6-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,384 kB
  • sloc: python: 45,812; makefile: 26; sh: 13
file content (109 lines) | stat: -rw-r--r-- 3,121 bytes parent folder | download | duplicates (2)
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
from typing import List

from graphql.error import GraphQLError
from graphql.language import parse, Source
from graphql.validation import validate

from .star_wars_schema import star_wars_schema


def validation_errors(query: str) -> List[GraphQLError]:
    """Helper function to test a query and the expected response."""
    source = Source(query, "StarWars.graphql")
    ast = parse(source)
    return validate(star_wars_schema, ast)


def describe_star_wars_validation_tests():
    def describe_basic_queries():
        def validates_a_complex_but_valid_query():
            query = """
                query NestedQueryWithFragment {
                  hero {
                    ...NameAndAppearances
                    friends {
                      ...NameAndAppearances
                      friends {
                        ...NameAndAppearances
                      }
                    }
                  }
                }

                fragment NameAndAppearances on Character {
                  name
                  appearsIn
                }
                """
            assert not validation_errors(query)

        def notes_that_non_existent_fields_are_invalid():
            query = """
                query HeroSpaceshipQuery {
                  hero {
                    favoriteSpaceship
                  }
                }
                """
            assert validation_errors(query)

        def requires_fields_on_object():
            query = """
                query HeroNoFieldsQuery {
                  hero
                }
                """
            assert validation_errors(query)

        def disallows_fields_on_scalars():
            query = """
                query HeroFieldsOnScalarQuery {
                  hero {
                    name {
                      firstCharacterOfName
                    }
                  }
                }
                """
            assert validation_errors(query)

        def disallows_object_fields_on_interfaces():
            query = """
                query DroidFieldOnCharacter {
                  hero {
                    name
                    primaryFunction
                  }
                }
                """
            assert validation_errors(query)

        def allows_object_fields_in_fragments():
            query = """
                query DroidFieldInFragment {
                  hero {
                    name
                    ...DroidFields
                  }
                }

                fragment DroidFields on Droid {
                  primaryFunction
                }
                """
            assert not validation_errors(query)

        def allows_object_fields_in_inline_fragments():
            query = """
                query DroidFieldInFragment {
                  hero {
                    name
                    ...DroidFields
                  }
                }

                fragment DroidFields on Droid {
                    primaryFunction
                }
                """
            assert not validation_errors(query)