diff --git a/sharding-example/pom.xml b/sharding-example/pom.xml index fa1a371..a25f2a3 100644 --- a/sharding-example/pom.xml +++ b/sharding-example/pom.xml @@ -40,6 +40,41 @@ spring-boot-starter-tomcat ${spring.boot.version} + + org.springframework.boot + spring-boot-starter-actuator + ${spring.boot.version} + + + + org.springframework.boot + spring-boot-starter-test + ${spring.boot.version} + + + io.cucumber + cucumber-java + 6.8.0 + test + + + io.cucumber + cucumber-junit + 6.8.0 + test + + + io.cucumber + cucumber-spring + 6.8.0 + test + + + com.squareup.okhttp3 + okhttp + 4.10.0 + test + \ No newline at end of file diff --git a/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/CucumberTestConfiguration.java b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/CucumberTestConfiguration.java new file mode 100644 index 0000000..f6efea8 --- /dev/null +++ b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/CucumberTestConfiguration.java @@ -0,0 +1,31 @@ +package com.alpha.mongodb.sharding.example; + +import com.alpha.mongodb.sharding.example.state.ScenarioState; +import com.fasterxml.jackson.databind.ObjectMapper; +import okhttp3.OkHttpClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +import static io.cucumber.spring.CucumberTestContext.SCOPE_CUCUMBER_GLUE; + +@Configuration +public class CucumberTestConfiguration { + + @Bean + @Scope(SCOPE_CUCUMBER_GLUE) + public ScenarioState featureState() { + return new ScenarioState(); + } + + @Bean + public OkHttpClient httpClient() { + return new OkHttpClient(); + } + + @Bean + public ObjectMapper objectMapper() { + return new ObjectMapper(); + } + +} diff --git a/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/CucumberTestConstants.java b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/CucumberTestConstants.java new file mode 100644 index 0000000..ebdeaf7 --- /dev/null +++ b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/CucumberTestConstants.java @@ -0,0 +1,15 @@ +package com.alpha.mongodb.sharding.example; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public class CucumberTestConstants { + + public static final String SCOPE = "scope"; + public static final String CUKE = "cuke"; + + public static final String SCHEME = "http"; + public static final String BASE_HOSTNAME = "localhost"; + public static final int PORT = 8080; + public static final String BASE_PATH = "sharding-example"; +} diff --git a/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/ExampleApplicationCucumber.java b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/ExampleApplicationCucumber.java new file mode 100644 index 0000000..fdd059c --- /dev/null +++ b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/ExampleApplicationCucumber.java @@ -0,0 +1,10 @@ +package com.alpha.mongodb.sharding.example; + +import io.cucumber.junit.Cucumber; +import io.cucumber.junit.CucumberOptions; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +@CucumberOptions(features = "src/integration/resources/features", plugin = {"pretty", "html:target/site/cucumber.html"}) +public class ExampleApplicationCucumber { +} diff --git a/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/SpringIntegrationTest.java b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/SpringIntegrationTest.java new file mode 100644 index 0000000..9e2bee9 --- /dev/null +++ b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/SpringIntegrationTest.java @@ -0,0 +1,11 @@ +package com.alpha.mongodb.sharding.example; + +import io.cucumber.spring.CucumberContextConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ContextConfiguration; + +@CucumberContextConfiguration +@ContextConfiguration(classes = {Application.class, ExampleApplicationCucumber.class}) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) +public class SpringIntegrationTest { +} diff --git a/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/state/ScenarioState.java b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/state/ScenarioState.java new file mode 100644 index 0000000..6673a06 --- /dev/null +++ b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/state/ScenarioState.java @@ -0,0 +1,33 @@ +package com.alpha.mongodb.sharding.example.state; + +import io.cucumber.java.Scenario; +import io.cucumber.spring.ScenarioScope; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +@ScenarioScope +@Data +@NoArgsConstructor(onConstructor = @__(@Autowired)) +public class ScenarioState { + private List stepDefinitionState = new ArrayList<>(); + + private StepDefinitionState sharedStepDefinitionState; + + private Scenario scenario; + + public StepDefinitionState getPreviousStepDefinitionState() { + return stepDefinitionState.get(stepDefinitionState.size() - 2); + } + + public StepDefinitionState getCurrentStepDefinitionState() { + return stepDefinitionState.get(stepDefinitionState.size() - 1); + } + + public void addStep() { + stepDefinitionState.add(new StepDefinitionState()); + } +} diff --git a/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/state/StepDefinitionState.java b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/state/StepDefinitionState.java new file mode 100644 index 0000000..f15ddb1 --- /dev/null +++ b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/state/StepDefinitionState.java @@ -0,0 +1,12 @@ +package com.alpha.mongodb.sharding.example.state; + +import lombok.Data; +import okhttp3.Request; +import okhttp3.Response; + +@Data +public class StepDefinitionState { + private Request request; + private Object requestBody; + private Response response; +} diff --git a/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/steps/ApplicationSteps.java b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/steps/ApplicationSteps.java new file mode 100644 index 0000000..a9ca282 --- /dev/null +++ b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/steps/ApplicationSteps.java @@ -0,0 +1,59 @@ +package com.alpha.mongodb.sharding.example.steps; + +import com.alpha.mongodb.sharding.example.CucumberTestConstants; +import com.alpha.mongodb.sharding.example.state.ScenarioState; +import com.alpha.mongodb.sharding.example.utils.ExampleServiceClientUtils; +import io.cucumber.java.BeforeStep; +import io.cucumber.java.Scenario; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; +import lombok.extern.log4j.Log4j2; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.apache.logging.log4j.ThreadContext; +import org.junit.Before; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +@Log4j2 +public class ApplicationSteps { + + @Autowired + private OkHttpClient okHttpClient; + + @Autowired + private ScenarioState scenarioState; + + @Before + public void beforeScenario(Scenario scenario) { + ThreadContext.put(CucumberTestConstants.SCOPE, CucumberTestConstants.CUKE); + scenarioState.setScenario(scenario); + } + + @BeforeStep + public void beforeStep() { + scenarioState.addStep(); + } + + @When("I call the health API of the sharding example application") + public void whenThatShardingExampleApplicationIsUp() throws IOException { + HttpUrl httpUrl = ExampleServiceClientUtils.baseUrlBuilder() + .addPathSegment("actuator").addPathSegment("health").build(); + System.out.println(httpUrl); + Request request = new Request.Builder().url(httpUrl).get().build(); + Response healthApiResponse = okHttpClient.newCall(request).execute(); + + scenarioState.getCurrentStepDefinitionState().setRequest(request); + scenarioState.getCurrentStepDefinitionState().setResponse(healthApiResponse); + } + + @Then("I get a response with status code {int}") + public void thenIGetResponseWithStatusCode(int status) { + assertEquals(status, scenarioState.getPreviousStepDefinitionState().getResponse().code()); + } +} diff --git a/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/utils/ExampleServiceClientUtils.java b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/utils/ExampleServiceClientUtils.java new file mode 100644 index 0000000..3f72561 --- /dev/null +++ b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/utils/ExampleServiceClientUtils.java @@ -0,0 +1,18 @@ +package com.alpha.mongodb.sharding.example.utils; + +import com.alpha.mongodb.sharding.example.CucumberTestConstants; +import lombok.experimental.UtilityClass; +import okhttp3.HttpUrl; + +@UtilityClass +public class ExampleServiceClientUtils { + + public static HttpUrl.Builder baseUrlBuilder() { + return new HttpUrl.Builder() + .scheme(CucumberTestConstants.SCHEME) + .host(CucumberTestConstants.BASE_HOSTNAME) + .port(CucumberTestConstants.PORT) + .addPathSegment(CucumberTestConstants.BASE_PATH); + } + +} diff --git a/sharding-example/src/integration/resources/features/startup.feature b/sharding-example/src/integration/resources/features/startup.feature new file mode 100644 index 0000000..a9c1299 --- /dev/null +++ b/sharding-example/src/integration/resources/features/startup.feature @@ -0,0 +1,5 @@ +Feature: Verify that the sharding example application comes up + + Scenario: Sharding Example comes up successfully when the application is run + When I call the health API of the sharding example application + Then I get a response with status code 200 \ No newline at end of file