Type-safe GraphQL client generator for Gleam
1import gleam/list
2import gleam/option.{None, Some}
3import gleeunit/should
4import squall/internal/graphql_ast
5
6// Test: Parse simple query with no variables
7pub fn parse_simple_query_test() {
8 let source =
9 "
10 query GetUser {
11 user {
12 id
13 name
14 }
15 }
16 "
17
18 let result = graphql_ast.parse(source)
19
20 should.be_ok(result)
21 let assert Ok(operation) = result
22
23 // Check operation type
24 graphql_ast.get_operation_type(operation)
25 |> should.equal(graphql_ast.Query)
26
27 // Check operation name
28 graphql_ast.get_operation_name(operation)
29 |> should.equal(Some("GetUser"))
30
31 // Check it has a selection set
32 let selections = graphql_ast.get_selections(operation)
33 list.is_empty(selections)
34 |> should.be_false()
35}
36
37// Test: Parse query with variables
38pub fn parse_query_with_variables_test() {
39 let source =
40 "
41 query GetCharacter($id: ID!) {
42 character(id: $id) {
43 name
44 }
45 }
46 "
47
48 let result = graphql_ast.parse(source)
49
50 should.be_ok(result)
51 let assert Ok(operation) = result
52
53 // Check variables
54 let variables = graphql_ast.get_variables(operation)
55 list.length(variables)
56 |> should.equal(1)
57
58 // Check first variable
59 let assert [var] = variables
60 graphql_ast.get_variable_name(var)
61 |> should.equal("id")
62}
63
64// Test: Parse query with multiple variables
65pub fn parse_query_multiple_variables_test() {
66 let source =
67 "
68 query ListCharacters($page: Int, $filter: String) {
69 characters(page: $page, filter: $filter) {
70 results {
71 id
72 }
73 }
74 }
75 "
76
77 let result = graphql_ast.parse(source)
78
79 should.be_ok(result)
80 let assert Ok(operation) = result
81
82 let variables = graphql_ast.get_variables(operation)
83 list.length(variables)
84 |> should.equal(2)
85}
86
87// Test: Parse mutation
88pub fn parse_mutation_test() {
89 let source =
90 "
91 mutation CreateUser($name: String!) {
92 createUser(name: $name) {
93 id
94 name
95 }
96 }
97 "
98
99 let result = graphql_ast.parse(source)
100
101 should.be_ok(result)
102 let assert Ok(operation) = result
103
104 graphql_ast.get_operation_type(operation)
105 |> should.equal(graphql_ast.Mutation)
106
107 graphql_ast.get_operation_name(operation)
108 |> should.equal(Some("CreateUser"))
109}
110
111// Test: Parse subscription
112pub fn parse_subscription_test() {
113 let source =
114 "
115 subscription OnUserCreated {
116 userCreated {
117 id
118 name
119 }
120 }
121 "
122
123 let result = graphql_ast.parse(source)
124
125 should.be_ok(result)
126 let assert Ok(operation) = result
127
128 graphql_ast.get_operation_type(operation)
129 |> should.equal(graphql_ast.Subscription)
130}
131
132// Test: Parse nested selections
133pub fn parse_nested_selections_test() {
134 let source =
135 "
136 query GetCharacter {
137 character {
138 name
139 location {
140 id
141 name
142 }
143 }
144 }
145 "
146
147 let result = graphql_ast.parse(source)
148
149 should.be_ok(result)
150 let assert Ok(operation) = result
151
152 let selections = graphql_ast.get_selections(operation)
153 list.is_empty(selections)
154 |> should.be_false()
155}
156
157// Test: Parse query with arguments
158pub fn parse_query_with_arguments_test() {
159 let source =
160 "
161 query GetCharacters {
162 characters(page: 1, filter: \"Rick\") {
163 results {
164 name
165 }
166 }
167 }
168 "
169
170 let result = graphql_ast.parse(source)
171
172 should.be_ok(result)
173}
174
175// Test: Parse anonymous query (no operation name)
176pub fn parse_anonymous_query_test() {
177 let source =
178 "
179 query {
180 user {
181 id
182 }
183 }
184 "
185
186 let result = graphql_ast.parse(source)
187
188 should.be_ok(result)
189 let assert Ok(operation) = result
190
191 graphql_ast.get_operation_name(operation)
192 |> should.equal(None)
193}
194
195// Test: Invalid syntax
196pub fn parse_invalid_syntax_test() {
197 let source = "query GetUser { user { id }"
198
199 let result = graphql_ast.parse(source)
200
201 should.be_error(result)
202}
203
204// Test: Empty query
205pub fn parse_empty_query_test() {
206 let source = ""
207
208 let result = graphql_ast.parse(source)
209
210 should.be_error(result)
211}
212
213// Test: Parse variable with list type
214// NOTE: Swell's parser currently doesn't support list types in variable definitions
215// This is a known limitation: https://github.com/giacomocavalieri/swell/issues/X
216pub fn parse_variable_list_type_test() {
217 let source =
218 "
219 query GetUsers($ids: [ID!]!) {
220 users(ids: $ids) {
221 id
222 }
223 }
224 "
225
226 let result = graphql_ast.parse(source)
227
228 // For now, this is expected to fail until swell supports list types in variables
229 should.be_error(result)
230}
231
232// Test: Parse variable with non-null type
233pub fn parse_variable_non_null_type_test() {
234 let source =
235 "
236 query GetUser($id: ID!) {
237 user(id: $id) {
238 id
239 }
240 }
241 "
242
243 let result = graphql_ast.parse(source)
244
245 should.be_ok(result)
246}