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 a9139f18c8..e3603d258b 100644 --- a/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java +++ b/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java @@ -8,6 +8,7 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import sonia.scm.repository.Changeset; import sonia.scm.repository.client.api.ClientCommand; import sonia.scm.repository.client.api.RepositoryClient; @@ -16,10 +17,12 @@ import java.io.IOException; import java.util.Collection; import java.util.List; -import static org.assertj.core.api.Assertions.assertThat; import static java.lang.Thread.sleep; +import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertNotNull; +import static sonia.scm.it.RestUtil.ADMIN_PASSWORD; +import static sonia.scm.it.RestUtil.ADMIN_USERNAME; import static sonia.scm.it.RestUtil.given; import static sonia.scm.it.ScmTypes.availableScmTypes; @@ -31,6 +34,7 @@ public class RepositoryAccessITCase { private final String repositoryType; private File folder; + private RepositoryRequests.AppliedRepositoryGetRequest repositoryGetRequest; public RepositoryAccessITCase(String repositoryType) { this.repositoryType = repositoryType; @@ -42,9 +46,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 @@ -152,5 +162,28 @@ public class RepositoryAccessITCase { assertThat(changesets).size().isBetween(2, 3); // svn has an implicit root revision '0' that is extra to the two commits } + + @Test + @SuppressWarnings("unchecked") + public void shouldFindFileHistory() throws IOException { + RepositoryClient repositoryClient = RepositoryUtil.createRepositoryClient(repositoryType, folder); + + String fileName_1 = "a.txt"; + Changeset changeset_1 = RepositoryUtil.createAndCommitFile(repositoryClient, ADMIN_USERNAME, fileName_1, "a"); + + repositoryGetRequest + .usingRepositoryResponse() + .requestSources() + .usingSourcesResponse() + .requestFileHistory(fileName_1) + .assertStatusCode(HttpStatus.SC_OK) + .usingChangesetsResponse() + .assertChangesets(changesets -> { + assertThat(changesets).hasSize(1); + assertThat(changesets.get(0)).containsEntry("id", changeset_1.getId()); + assertThat(changesets.get(0)).containsEntry("description", changeset_1.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..62ce82aded --- /dev/null +++ b/scm-it/src/test/java/sonia/scm/it/RepositoryRequests.java @@ -0,0 +1,245 @@ +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> changesetsConsumer) {
+ List