diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/graphql/security/GraphQlWebMvcSecurityAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/graphql/security/GraphQlWebMvcSecurityAutoConfiguration.java index a5f3bc7481e..dfec0a22125 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/graphql/security/GraphQlWebMvcSecurityAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/graphql/security/GraphQlWebMvcSecurityAutoConfiguration.java @@ -26,7 +26,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.autoconfigure.graphql.servlet.GraphQlWebMvcAutoConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.graphql.execution.SecurityContextThreadLocalAccessor; import org.springframework.graphql.execution.SecurityDataFetcherExceptionResolver; import org.springframework.graphql.server.webmvc.GraphQlHttpHandler; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @@ -50,10 +49,4 @@ public class GraphQlWebMvcSecurityAutoConfiguration { return new SecurityDataFetcherExceptionResolver(); } - @Bean - @ConditionalOnMissingBean - public SecurityContextThreadLocalAccessor securityContextThreadLocalAccessor() { - return new SecurityContextThreadLocalAccessor(); - } - } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/graphql/servlet/GraphQlWebMvcAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/graphql/servlet/GraphQlWebMvcAutoConfiguration.java index 015d616e190..811fc067546 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/graphql/servlet/GraphQlWebMvcAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/graphql/servlet/GraphQlWebMvcAutoConfiguration.java @@ -44,7 +44,6 @@ import org.springframework.core.annotation.Order; import org.springframework.core.log.LogMessage; import org.springframework.graphql.ExecutionGraphQlService; import org.springframework.graphql.execution.GraphQlSource; -import org.springframework.graphql.execution.ThreadLocalAccessor; import org.springframework.graphql.server.WebGraphQlHandler; import org.springframework.graphql.server.WebGraphQlInterceptor; import org.springframework.graphql.server.webmvc.GraphQlHttpHandler; @@ -98,11 +97,9 @@ public class GraphQlWebMvcAutoConfiguration { @Bean @ConditionalOnMissingBean public WebGraphQlHandler webGraphQlHandler(ExecutionGraphQlService service, - ObjectProvider interceptorsProvider, - ObjectProvider accessorsProvider) { + ObjectProvider interceptorsProvider) { return WebGraphQlHandler.builder(service) - .interceptors(interceptorsProvider.orderedStream().collect(Collectors.toList())) - .threadLocalAccessors(accessorsProvider.orderedStream().collect(Collectors.toList())).build(); + .interceptors(interceptorsProvider.orderedStream().collect(Collectors.toList())).build(); } @Bean @@ -185,13 +182,14 @@ public class GraphQlWebMvcAutoConfiguration { } @Bean + @SuppressWarnings("deprecation") public HandlerMapping graphQlWebSocketMapping(GraphQlWebSocketHandler handler, GraphQlProperties properties) { String path = properties.getWebsocket().getPath(); logger.info(LogMessage.format("GraphQL endpoint WebSocket %s", path)); WebSocketHandlerMapping mapping = new WebSocketHandlerMapping(); mapping.setWebSocketUpgradeMatch(true); mapping.setUrlMap(Collections.singletonMap(path, - handler.asWebSocketHttpRequestHandler(new DefaultHandshakeHandler()))); + handler.initWebSocketHttpRequestHandler(new DefaultHandshakeHandler()))); mapping.setOrder(2); // Ahead of HTTP endpoint ("routerFunctionMapping" bean) return mapping; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/graphql/security/GraphQlWebMvcSecurityAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/graphql/security/GraphQlWebMvcSecurityAutoConfigurationTests.java index fa33b554397..d56510311d8 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/graphql/security/GraphQlWebMvcSecurityAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/graphql/security/GraphQlWebMvcSecurityAutoConfigurationTests.java @@ -34,7 +34,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.graphql.execution.ErrorType; import org.springframework.graphql.execution.RuntimeWiringConfigurer; -import org.springframework.graphql.execution.SecurityContextThreadLocalAccessor; import org.springframework.graphql.execution.SecurityDataFetcherExceptionResolver; import org.springframework.http.MediaType; import org.springframework.lang.Nullable; @@ -78,10 +77,8 @@ class GraphQlWebMvcSecurityAutoConfigurationTests { @Test void contributesSecurityComponents() { - this.contextRunner.run((context) -> { - assertThat(context).hasSingleBean(SecurityDataFetcherExceptionResolver.class); - assertThat(context).hasSingleBean(SecurityContextThreadLocalAccessor.class); - }); + this.contextRunner + .run((context) -> assertThat(context).hasSingleBean(SecurityDataFetcherExceptionResolver.class)); } @Test diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/build.gradle similarity index 100% rename from spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/build.gradle rename to spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/build.gradle diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/GreetingController.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/GreetingController.java deleted file mode 100644 index 18c5c62d8d5..00000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/GreetingController.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2012-2021 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package smoketest.graphql; - -import org.springframework.graphql.data.method.annotation.Argument; -import org.springframework.graphql.data.method.annotation.QueryMapping; -import org.springframework.stereotype.Controller; - -@Controller -public class GreetingController { - - private final GreetingService greetingService; - - public GreetingController(GreetingService greetingService) { - this.greetingService = greetingService; - } - - @QueryMapping - public String greeting(@Argument String name) { - return this.greetingService.greet(name); - } - -} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/GreetingService.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/GreetingService.java deleted file mode 100644 index aa9c5bee02d..00000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/GreetingService.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2012-2021 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package smoketest.graphql; - -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.stereotype.Component; - -@Component -public class GreetingService { - - @PreAuthorize("hasRole('ADMIN')") - public String greet(String name) { - return "Hello, " + name + "!"; - } - -} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/Project.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/Project.java deleted file mode 100644 index 5e8d514de69..00000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/Project.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2012-2021 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package smoketest.graphql; - -import java.util.Objects; - -public class Project { - - private String slug; - - private String name; - - public Project(String slug, String name) { - this.slug = slug; - this.name = name; - } - - public String getSlug() { - return this.slug; - } - - public void setSlug(String slug) { - this.slug = slug; - } - - public String getName() { - return this.name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - Project project = (Project) o; - return this.slug.equals(project.slug); - } - - @Override - public int hashCode() { - return Objects.hash(this.slug); - } - -} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/ProjectController.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/ProjectController.java deleted file mode 100644 index b96379cce43..00000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/ProjectController.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2012-2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package smoketest.graphql; - -import java.util.Arrays; -import java.util.List; -import java.util.Optional; - -import org.springframework.graphql.data.method.annotation.Argument; -import org.springframework.graphql.data.method.annotation.QueryMapping; -import org.springframework.stereotype.Controller; - -@Controller -public class ProjectController { - - private final List projects; - - public ProjectController() { - this.projects = Arrays.asList(new Project("spring-boot", "Spring Boot"), - new Project("spring-graphql", "Spring GraphQL"), new Project("spring-framework", "Spring Framework")); - } - - @QueryMapping - public Optional project(@Argument String slug) { - return this.projects.stream().filter((project) -> project.getSlug().equals(slug)).findFirst(); - } - -} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/SampleGraphQlApplication.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/SampleGraphQlApplication.java deleted file mode 100644 index 9674af544af..00000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/SampleGraphQlApplication.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2012-2021 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package smoketest.graphql; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class SampleGraphQlApplication { - - public static void main(String[] args) { - SpringApplication.run(SampleGraphQlApplication.class, args); - } - -} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/SecurityConfig.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/SecurityConfig.java deleted file mode 100644 index ec1a87f0307..00000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/java/smoketest/graphql/SecurityConfig.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2012-2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package smoketest.graphql; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.core.userdetails.User; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.provisioning.InMemoryUserDetailsManager; -import org.springframework.security.web.DefaultSecurityFilterChain; - -import static org.springframework.security.config.Customizer.withDefaults; - -@Configuration(proxyBeanMethods = false) -@EnableWebSecurity -@EnableGlobalMethodSecurity(prePostEnabled = true) -public class SecurityConfig { - - @Bean - public DefaultSecurityFilterChain springWebFilterChain(HttpSecurity http) throws Exception { - return http.csrf((csrf) -> csrf.disable()) - // Demonstrate that method security works - // Best practice to use both for defense in depth - .authorizeRequests((requests) -> requests.anyRequest().permitAll()).httpBasic(withDefaults()).build(); - } - - @Bean - @SuppressWarnings("deprecation") - public InMemoryUserDetailsManager userDetailsService() { - User.UserBuilder userBuilder = User.withDefaultPasswordEncoder(); - UserDetails rob = userBuilder.username("rob").password("rob").roles("USER").build(); - UserDetails admin = userBuilder.username("admin").password("admin").roles("USER", "ADMIN").build(); - return new InMemoryUserDetailsManager(rob, admin); - } - -} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/test/java/smoketest/graphql/GreetingControllerTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/test/java/smoketest/graphql/GreetingControllerTests.java deleted file mode 100644 index 27ddea4659a..00000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/test/java/smoketest/graphql/GreetingControllerTests.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2012-2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package smoketest.graphql; - -import org.junit.jupiter.api.Test; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.graphql.tester.AutoConfigureHttpGraphQlTester; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.graphql.execution.ErrorType; -import org.springframework.graphql.test.tester.HttpGraphQlTester; - -import static org.assertj.core.api.Assertions.assertThat; - -@SpringBootTest -@AutoConfigureHttpGraphQlTester -class GreetingControllerTests { - - @Autowired - private HttpGraphQlTester graphQlTester; - - @Test - void shouldUnauthorizeAnonymousUsers() { - this.graphQlTester.documentName("greeting").variable("name", "Brian").execute().errors().satisfy((errors) -> { - assertThat(errors).hasSize(1); - assertThat(errors.get(0).getErrorType()).isEqualTo(ErrorType.UNAUTHORIZED); - }); - } - - @Test - void shouldGreetWithSpecificName() { - HttpGraphQlTester authenticated = withAdminCredentials(this.graphQlTester); - authenticated.documentName("greeting").variable("name", "Brian").execute().path("greeting").entity(String.class) - .isEqualTo("Hello, Brian!"); - } - - @Test - void shouldGreetWithDefaultName() { - HttpGraphQlTester authenticated = withAdminCredentials(this.graphQlTester); - authenticated.document("{ greeting }").execute().path("greeting").entity(String.class) - .isEqualTo("Hello, Spring!"); - } - - private HttpGraphQlTester withAdminCredentials(HttpGraphQlTester graphQlTester) { - return graphQlTester.mutate() - .webTestClient( - (httpClient) -> httpClient.defaultHeaders((headers) -> headers.setBasicAuth("admin", "admin"))) - .build(); - } - -} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/test/java/smoketest/graphql/ProjectControllerTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/test/java/smoketest/graphql/ProjectControllerTests.java deleted file mode 100644 index a9a76eee109..00000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/test/java/smoketest/graphql/ProjectControllerTests.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2012-2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package smoketest.graphql; - -import org.junit.jupiter.api.Test; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.graphql.GraphQlTest; -import org.springframework.graphql.test.tester.GraphQlTester; - -@GraphQlTest(ProjectController.class) -class ProjectControllerTests { - - @Autowired - private GraphQlTester graphQlTester; - - @Test - void shouldFindSpringGraphQl() { - this.graphQlTester.document("{ project(slug: \"spring-graphql\") { name } }").execute().path("project.name") - .entity(String.class).isEqualTo("Spring GraphQL"); - } - - @Test - void shouldNotFindUnknownProject() { - this.graphQlTester.document("{ project(slug: \"spring-unknown\") { name } }").execute().path("project.name") - .pathDoesNotExist(); - } - -} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/resources/graphql/schema.graphqls b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/src/main/resources/graphql/schema.graphqls similarity index 100% rename from spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/main/resources/graphql/schema.graphqls rename to spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/src/main/resources/graphql/schema.graphqls diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/test/resources/graphql-test/greeting.graphql b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/src/test/resources/graphql-test/greeting.graphql similarity index 100% rename from spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/spring-boot-smoke-test-graphql/src/test/resources/graphql-test/greeting.graphql rename to spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-graphql/src/test/resources/graphql-test/greeting.graphql