package io.github.azagniotov.stubby4j.stubs; import io.github.azagniotov.stubby4j.utils.StringUtils; import io.github.azagniotov.stubby4j.yaml.ConfigurableYAMLProperty; import org.eclipse.jetty.http.HttpStatus.Code; import org.junit.Before; import org.junit.Test; import java.io.File; import java.util.Optional; import static com.google.common.truth.Truth.assertThat; import static io.github.azagniotov.stubby4j.utils.FileUtils.fileFromString; import static io.github.azagniotov.stubby4j.yaml.ConfigurableYAMLProperty.BODY; public class StubResponseBuilderTest { private StubResponse.Builder builder; @Before public void setUp() throws Exception { builder = new StubResponse.Builder(); } @Test public void shouldStage_WhenConfigurablePropertyAndFieldValuePresent() throws Exception { final String expectedFieldValue = "Hello!"; final String orElse = "Boo!"; final Optional<ConfigurableYAMLProperty> propertyOptional = Optional.of(BODY); final Optional<Object> fieldValueOptional = Optional.of(expectedFieldValue); builder.stage(propertyOptional, fieldValueOptional); assertThat(builder.getStaged(String.class, BODY, orElse)).isEqualTo(expectedFieldValue); } @Test public void shouldNotStage_WhenConfigurablePropertyMissingButFieldValuePresent() throws Exception { final String expectedFieldValue = "Hello!"; final String orElse = "Boo!"; final Optional<ConfigurableYAMLProperty> propertyOptional = Optional.empty(); final Optional<Object> fieldValueOptional = Optional.of(expectedFieldValue); builder.stage(propertyOptional, fieldValueOptional); assertThat(builder.getStaged(String.class, BODY, orElse)).isEqualTo(orElse); } @Test public void shouldNotStage_WhenConfigurablePropertyPresentButFieldValueMissing() throws Exception { final String orElse = "Boo!"; final Optional<ConfigurableYAMLProperty> propertyOptional = Optional.of(BODY); final Optional<Object> fieldValueOptional = Optional.ofNullable(null); builder.stage(propertyOptional, fieldValueOptional); assertThat(builder.getStaged(String.class, BODY, orElse)).isEqualTo(orElse); } @Test public void shouldNotStage_WhenConfigurablePropertyMissingAndFieldValueMissing() throws Exception { final String orElse = "Boo!"; final Optional<ConfigurableYAMLProperty> propertyOptional = Optional.ofNullable(null); final Optional<Object> fieldValueOptional = Optional.ofNullable(null); builder.stage(propertyOptional, fieldValueOptional); assertThat(builder.getStaged(String.class, BODY, orElse)).isEqualTo(orElse); } @Test public void shouldReturnDefaultHttpStatusCode_WhenStatusFieldNull() throws Exception { assertThat(Code.OK).isEqualTo(builder.getHttpStatusCode()); } @Test public void shouldReturnRespectiveHttpStatusCode_WhenStatusFieldSet() throws Exception { assertThat(Code.CREATED).isEqualTo(builder.withHttpStatusCode(Code.CREATED).getHttpStatusCode()); } @Test public void shouldReturnBody_WhenFileIsNull() throws Exception { final StubResponse stubResponse = builder .withHttpStatusCode(Code.OK) .withBody("this is some body") .build(); final String actualResponseBody = StringUtils.newStringUtf8(stubResponse.getResponseBodyAsBytes()); assertThat("this is some body").isEqualTo(actualResponseBody); } @Test public void shouldReturnBody_WhenFileIsEmpty() throws Exception { final StubResponse stubResponse = builder .withHttpStatusCode(Code.OK) .withBody("this is some body") .withFile(File.createTempFile("tmp", "tmp")) .build(); final String actualResponseBody = StringUtils.newStringUtf8(stubResponse.getResponseBodyAsBytes()); assertThat("this is some body").isEqualTo(actualResponseBody); } @Test public void shouldReturnEmptyBody_WhenFileAndBodyAreNull() throws Exception { final StubResponse stubResponse = builder .withHttpStatusCode(Code.OK) .build(); final String actualResponseBody = StringUtils.newStringUtf8(stubResponse.getResponseBodyAsBytes()); assertThat("").isEqualTo(actualResponseBody); } @Test public void shouldReturnEmptyBody_WhenBodyIsEmpty() throws Exception { final StubResponse stubResponse = builder .withHttpStatusCode(Code.OK) .withBody("") .build(); final String actualResponseBody = StringUtils.newStringUtf8(stubResponse.getResponseBodyAsBytes()); assertThat("").isEqualTo(actualResponseBody); } @Test public void shouldReturnEmptyBody_WhenBodyIsEmpty_AndFileIsEmpty() throws Exception { final StubResponse stubResponse = builder .withHttpStatusCode(Code.OK) .withBody("") .build(); final String actualResponseBody = StringUtils.newStringUtf8(stubResponse.getResponseBodyAsBytes()); assertThat("").isEqualTo(actualResponseBody); } @Test public void shouldReturnFile_WhenFileNotEmpty_AndRegardlessOfBody() throws Exception { final String expectedResponseBody = "content"; final StubResponse stubResponse = builder .withHttpStatusCode(Code.OK) .withBody("something") .withFile(fileFromString(expectedResponseBody)) .build(); final String actualResponseBody = StringUtils.newStringUtf8(stubResponse.getResponseBodyAsBytes()); assertThat(expectedResponseBody).isEqualTo(actualResponseBody); } @Test public void shouldRequireRecording_WhenBodyStartsWithHttp() throws Exception { final String expectedResponseBody = "http://someurl.com"; final StubResponse stubResponse = builder .withHttpStatusCode(Code.OK) .withBody(expectedResponseBody) .build(); assertThat(stubResponse.isRecordingRequired()).isTrue(); } @Test public void shouldRequireRecording_WhenBodyStartsWithHttpUpperCase() throws Exception { final String expectedResponseBody = "HTtP://someurl.com"; final StubResponse stubResponse = builder .withHttpStatusCode(Code.OK) .withBody(expectedResponseBody) .build(); assertThat(stubResponse.isRecordingRequired()).isTrue(); } @Test public void shouldNotRequireRecording_WhenBodyStartsWithHtt() throws Exception { final String expectedResponseBody = "htt://someurl.com"; final StubResponse stubResponse = builder .withHttpStatusCode(Code.OK) .withBody(expectedResponseBody) .build(); assertThat(stubResponse.isRecordingRequired()).isFalse(); } @Test public void shouldNotRequireRecording_WhenBodyDoesnotStartWithHttp() throws Exception { final String expectedResponseBody = "some body content"; final StubResponse stubResponse = builder .withHttpStatusCode(Code.OK) .withBody(expectedResponseBody) .build(); assertThat(stubResponse.isRecordingRequired()).isFalse(); } @Test public void shouldFindBodyTokenized_WhenBodyContainsTemplateTokens() throws Exception { final String body = "some body with a <% token %>"; final StubResponse stubResponse = builder .withHttpStatusCode(Code.OK) .withBody(body) .build(); assertThat(stubResponse.isBodyContainsTemplateTokens()).isTrue(); } @Test public void shouldFindBodyNotTokenized_WhenRawFileIsTemplateFile() throws Exception { final String body = "some body"; final StubResponse stubResponse = builder .withHttpStatusCode(Code.OK) .withBody(body) .withFile(fileFromString("file content with a <% token %>")) .build(); assertThat(stubResponse.isBodyContainsTemplateTokens()).isTrue(); } @Test public void shouldFindBodyNotTokenized_WhenRawFileNotTemplateFile() throws Exception { final String body = "some body"; final StubResponse stubResponse = builder .withHttpStatusCode(Code.OK) .withBody(body) .withFile(fileFromString("file content")) .build(); assertThat(stubResponse.isBodyContainsTemplateTokens()).isFalse(); } }