diff --git a/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java b/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java
index 399dd26035..fc095828b3 100644
--- a/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java
+++ b/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java
@@ -37,6 +37,7 @@ public class RepositoryAccessITCase {
private final String repositoryType;
private File folder;
+ private RepositoryRequests.AppliedRepositoryGetRequest repositoryGetRequest;
public RepositoryAccessITCase(String repositoryType) {
this.repositoryType = repositoryType;
@@ -48,9 +49,15 @@ public class RepositoryAccessITCase {
}
@Before
- public void initClient() {
+ public void init() {
TestData.createDefault();
folder = tempFolder.getRoot();
+ repositoryGetRequest = RepositoryRequests.start()
+ .given()
+ .url(TestData.getDefaultRepositoryUrl(repositoryType))
+ .usernameAndPassword(ADMIN_USERNAME, ADMIN_PASSWORD)
+ .get()
+ .assertStatusCode(HttpStatus.SC_OK);
}
@Test
@@ -281,5 +288,29 @@ public class RepositoryAccessITCase {
.contains("diff");
}
+
+ @Test
+ @SuppressWarnings("unchecked")
+ public void shouldFindFileHistory() throws IOException {
+ RepositoryClient repositoryClient = RepositoryUtil.createRepositoryClient(repositoryType, folder);
+ Changeset changeset = RepositoryUtil.createAndCommitFile(repositoryClient, ADMIN_USERNAME, "folder/subfolder/a.txt", "a");
+ repositoryGetRequest
+ .usingRepositoryResponse()
+ .requestSources()
+ .usingSourcesResponse()
+ .requestSelf("folder")
+ .usingSourcesResponse()
+ .requestSelf("subfolder")
+ .usingSourcesResponse()
+ .requestFileHistory("a.txt")
+ .assertStatusCode(HttpStatus.SC_OK)
+ .usingChangesetsResponse()
+ .assertChangesets(changesets -> {
+ assertThat(changesets).hasSize(1);
+ assertThat(changesets.get(0)).containsEntry("id", changeset.getId());
+ assertThat(changesets.get(0)).containsEntry("description", changeset.getDescription());
+ }
+ );
+ }
}
diff --git a/scm-it/src/test/java/sonia/scm/it/RepositoryRequests.java b/scm-it/src/test/java/sonia/scm/it/RepositoryRequests.java
new file mode 100644
index 0000000000..41fa2a6a3d
--- /dev/null
+++ b/scm-it/src/test/java/sonia/scm/it/RepositoryRequests.java
@@ -0,0 +1,249 @@
+package sonia.scm.it;
+
+import io.restassured.RestAssured;
+import io.restassured.response.Response;
+
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+
+
+/**
+ * Encapsulate rest requests of a repository in builder pattern
+ *
+ * A Get Request can be applied with the methods request*()
+ * These methods return a AppliedGet*Request object
+ * This object can be used to apply general assertions over the rest Assured response
+ * In the AppliedGet*Request classes there is a using*Response() method
+ * that return the *Response class containing specific operations related to the specific response
+ * the *Response class contains also the request*() method to apply the next GET request from a link in the response.
+ */
+public class RepositoryRequests {
+
+ private String url;
+ private String username;
+ private String password;
+
+ static RepositoryRequests start() {
+ return new RepositoryRequests();
+ }
+
+ Given given() {
+ return new Given();
+ }
+
+
+ /**
+ * Apply a GET Request to the extracted url from the given link
+ *
+ * @param linkPropertyName the property name of link
+ * @param response the response containing the link
+ * @return the response of the GET request using the given link
+ */
+ private Response getResponseFromLink(Response response, String linkPropertyName) {
+ return getResponse(response
+ .then()
+ .extract()
+ .path(linkPropertyName));
+ }
+
+
+ /**
+ * Apply a GET Request to the given url and return the response.
+ *
+ * @param url the url of the GET request
+ * @return the response of the GET request using the given url
+ */
+ private Response getResponse(String url) {
+ return RestAssured.given()
+ .auth().preemptive().basic(username, password)
+ .when()
+ .get(url);
+ }
+
+ private void setUrl(String url) {
+ this.url = url;
+ }
+
+ private void setUsername(String username) {
+ this.username = username;
+ }
+
+ private void setPassword(String password) {
+ this.password = password;
+ }
+
+ private String getUrl() {
+ return url;
+ }
+
+ private String getUsername() {
+ return username;
+ }
+
+ private String getPassword() {
+ return password;
+ }
+
+ class Given {
+
+ GivenUrl url(String url) {
+ setUrl(url);
+ return new GivenUrl();
+ }
+
+ }
+
+ class GivenWithUrlAndAuth {
+ AppliedRepositoryGetRequest get() {
+ return new AppliedRepositoryGetRequest(
+ getResponse(url)
+ );
+ }
+ }
+
+ class AppliedGetRequest {
+ private Response response;
+
+ public AppliedGetRequest(Response response) {
+ this.response = response;
+ }
+
+ /**
+ * apply custom assertions to the actual response
+ *
+ * @param consumer consume the response in order to assert the content. the header, the payload etc..
+ * @return the self object
+ */
+ SELF assertResponse(Consumer consumer) {
+ consumer.accept(response);
+ return (SELF) this;
+ }
+
+ /**
+ * special assertion of the status code
+ *
+ * @param expectedStatusCode the expected status code
+ * @return the self object
+ */
+ SELF assertStatusCode(int expectedStatusCode) {
+ this.response.then().assertThat().statusCode(expectedStatusCode);
+ return (SELF) this;
+ }
+
+ }
+
+ class AppliedRepositoryGetRequest extends AppliedGetRequest {
+
+ AppliedRepositoryGetRequest(Response response) {
+ super(response);
+ }
+
+ RepositoryResponse usingRepositoryResponse() {
+ return new RepositoryResponse(super.response);
+ }
+ }
+
+ class RepositoryResponse {
+
+ private Response repositoryResponse;
+
+ public RepositoryResponse(Response repositoryResponse) {
+ this.repositoryResponse = repositoryResponse;
+ }
+
+ AppliedGetSourcesRequest requestSources() {
+ return new AppliedGetSourcesRequest(getResponseFromLink(repositoryResponse, "_links.sources.href"));
+ }
+
+ AppliedGetChangesetsRequest requestChangesets(String fileName) {
+ return new AppliedGetChangesetsRequest(getResponseFromLink(repositoryResponse, "_links.changesets.href"));
+ }
+ }
+
+ class AppliedGetChangesetsRequest extends AppliedGetRequest {
+
+ AppliedGetChangesetsRequest(Response response) {
+ super(response);
+ }
+
+ ChangesetsResponse usingChangesetsResponse() {
+ return new ChangesetsResponse(super.response);
+ }
+ }
+
+ class ChangesetsResponse {
+ private Response changesetsResponse;
+
+ public ChangesetsResponse(Response changesetsResponse) {
+ this.changesetsResponse = changesetsResponse;
+ }
+
+ ChangesetsResponse assertChangesets(Consumer> changesetsConsumer) {
+ List