diff --git a/ci/smoke-tests.yml b/ci/smoke-tests.yml index f6fc9fba..4f2c7f66 100644 --- a/ci/smoke-tests.yml +++ b/ci/smoke-tests.yml @@ -5,6 +5,7 @@ smoke_tests: - async - batch - cloud-function-web + - cloud-function-webflux - command-line-runner - conditional - configuration-properties diff --git a/cloud-function-webflux/README.adoc b/cloud-function-webflux/README.adoc new file mode 100644 index 00000000..bedf35f3 --- /dev/null +++ b/cloud-function-webflux/README.adoc @@ -0,0 +1 @@ +Tests if Spring Cloud Function WebFlux works diff --git a/cloud-function-webflux/build.gradle b/cloud-function-webflux/build.gradle new file mode 100644 index 00000000..05fe64ae --- /dev/null +++ b/cloud-function-webflux/build.gradle @@ -0,0 +1,27 @@ +plugins { + id 'java' + id 'org.springframework.boot' + id 'org.springframework.boot.aot' + id 'org.springframework.aot.smoke-test' + id 'org.graalvm.buildtools.native' +} + +ext { + set('springCloudVersion', "2022.0.0-SNAPSHOT") +} + +dependencies { + implementation(platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)) + implementation(platform("org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}")) + implementation("org.springframework.boot:spring-boot-starter") + implementation("org.springframework.cloud:spring-cloud-starter-function-webflux") + + testImplementation("org.springframework.boot:spring-boot-starter-test") + + aotTestImplementation(project(":aot-smoke-test-support")) + aotTestImplementation("org.awaitility:awaitility:4.2.0") +} + +aotSmokeTest { + webApplication = true +} diff --git a/cloud-function-webflux/src/aotTest/java/com/example/cloud/function/webflux/CloudFunctionWebFluxApplicationAotTests.java b/cloud-function-webflux/src/aotTest/java/com/example/cloud/function/webflux/CloudFunctionWebFluxApplicationAotTests.java new file mode 100644 index 00000000..7c28279c --- /dev/null +++ b/cloud-function-webflux/src/aotTest/java/com/example/cloud/function/webflux/CloudFunctionWebFluxApplicationAotTests.java @@ -0,0 +1,28 @@ +package com.example.cloud.function.webflux; + +import org.junit.jupiter.api.Test; + +import org.springframework.aot.smoketest.support.junit.AotSmokeTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.reactive.server.WebTestClient; + +import static org.assertj.core.api.Assertions.assertThat; + +@AotSmokeTest +class CloudFunctionWebFluxApplicationAotTests { + + @Test + void uppercaseShouldBeInvokable(WebTestClient webTestClient) { + webTestClient.post().uri("/uppercase").header("Content-Type", MediaType.TEXT_PLAIN_VALUE).bodyValue("hello") + .exchange().expectStatus().isOk().expectBody() + .consumeWith((result) -> assertThat(new String(result.getResponseBodyContent())).isEqualTo("HELLO")); + } + + @Test + void lowercaseShouldBeInvokable(WebTestClient webTestClient) { + webTestClient.post().uri("/lowercase").header("Content-Type", MediaType.TEXT_PLAIN_VALUE).bodyValue("HELLO") + .exchange().expectStatus().isOk().expectBody() + .consumeWith((result) -> assertThat(new String(result.getResponseBodyContent())).isEqualTo("hello")); + } + +} diff --git a/cloud-function-webflux/src/main/java/com/example/cloud/function/webflux/CloudFunctionWebFluxApplication.java b/cloud-function-webflux/src/main/java/com/example/cloud/function/webflux/CloudFunctionWebFluxApplication.java new file mode 100644 index 00000000..c7b7a62d --- /dev/null +++ b/cloud-function-webflux/src/main/java/com/example/cloud/function/webflux/CloudFunctionWebFluxApplication.java @@ -0,0 +1,13 @@ +package com.example.cloud.function.webflux; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CloudFunctionWebFluxApplication { + + public static void main(String[] args) { + SpringApplication.run(CloudFunctionWebFluxApplication.class, args); + } + +} diff --git a/cloud-function-webflux/src/main/java/com/example/cloud/function/webflux/Lowercase.java b/cloud-function-webflux/src/main/java/com/example/cloud/function/webflux/Lowercase.java new file mode 100644 index 00000000..792ab00d --- /dev/null +++ b/cloud-function-webflux/src/main/java/com/example/cloud/function/webflux/Lowercase.java @@ -0,0 +1,18 @@ +package com.example.cloud.function.webflux; + +import java.util.Locale; +import java.util.function.Function; + +import reactor.core.publisher.Mono; + +import org.springframework.stereotype.Component; + +@Component +class Lowercase implements Function, Mono> { + + @Override + public Mono apply(Mono input) { + return input.map((i) -> i.toLowerCase(Locale.ENGLISH)); + } + +} diff --git a/cloud-function-webflux/src/main/java/com/example/cloud/function/webflux/Uppercase.java b/cloud-function-webflux/src/main/java/com/example/cloud/function/webflux/Uppercase.java new file mode 100644 index 00000000..3091e6ac --- /dev/null +++ b/cloud-function-webflux/src/main/java/com/example/cloud/function/webflux/Uppercase.java @@ -0,0 +1,18 @@ +package com.example.cloud.function.webflux; + +import java.util.Locale; +import java.util.function.Function; + +import reactor.core.publisher.Mono; + +import org.springframework.stereotype.Component; + +@Component +class Uppercase implements Function, Mono> { + + @Override + public Mono apply(Mono input) { + return input.map((i) -> i.toUpperCase(Locale.ENGLISH)); + } + +} diff --git a/cloud-function-webflux/src/test/java/com/example/cloud/function/webflux/CloudFunctionWebFluxApplicationTests.java b/cloud-function-webflux/src/test/java/com/example/cloud/function/webflux/CloudFunctionWebFluxApplicationTests.java new file mode 100644 index 00000000..d3de8f04 --- /dev/null +++ b/cloud-function-webflux/src/test/java/com/example/cloud/function/webflux/CloudFunctionWebFluxApplicationTests.java @@ -0,0 +1,14 @@ +package com.example.cloud.function.webflux; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class CloudFunctionWebFluxApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/settings.gradle b/settings.gradle index 3bca02a7..ea0e8bc6 100644 --- a/settings.gradle +++ b/settings.gradle @@ -59,6 +59,7 @@ include "aspect" include "async" include "batch" include "cloud-function-web" +include "cloud-function-webflux" include "command-line-runner" include "conditional" include "configuration-properties"