Type-safe GraphQL client generator for Gleam
at main 4.8 kB view raw
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}