Files
SCM-Manager/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java

282 lines
9.0 KiB
Java
Raw Normal View History

package sonia.scm.it;
2018-09-04 17:38:28 +02:00
import io.restassured.response.ExtractableResponse;
import io.restassured.response.Response;
import org.apache.http.HttpStatus;
import org.junit.Assume;
import org.junit.Before;
import org.junit.Rule;
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;
2018-08-22 09:18:17 +02:00
import sonia.scm.repository.client.api.RepositoryClient;
2018-09-04 17:38:28 +02:00
import sonia.scm.web.VndMediaType;
2018-08-22 09:18:17 +02:00
import java.io.File;
import java.io.IOException;
import java.util.Collection;
2018-08-29 13:34:53 +02:00
import java.util.List;
2018-08-17 09:33:45 +02:00
import static java.lang.Thread.sleep;
import static org.assertj.core.api.Assertions.assertThat;
2018-08-17 09:33:45 +02:00
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;
@RunWith(Parameterized.class)
public class RepositoryAccessITCase {
@Rule
public TemporaryFolder tempFolder = new TemporaryFolder();
private final String repositoryType;
2018-08-22 09:18:17 +02:00
private File folder;
private RepositoryRequests.AppliedRepositoryGetRequest repositoryGetRequest;
public RepositoryAccessITCase(String repositoryType) {
this.repositoryType = repositoryType;
}
@Parameterized.Parameters(name = "{0}")
public static Collection<String> createParameters() {
return availableScmTypes();
}
@Before
public void init() {
TestData.createDefault();
2018-08-22 09:18:17 +02:00
folder = tempFolder.getRoot();
repositoryGetRequest = RepositoryRequests.start()
.given()
.url(TestData.getDefaultRepositoryUrl(repositoryType))
.usernameAndPassword(ADMIN_USERNAME, ADMIN_PASSWORD)
.get()
.assertStatusCode(HttpStatus.SC_OK);
}
@Test
public void shouldFindBranches() throws IOException {
2018-08-22 10:59:46 +02:00
RepositoryClient repositoryClient = RepositoryUtil.createRepositoryClient(repositoryType, folder);
Assume.assumeTrue("There are no branches for " + repositoryType, repositoryClient.isCommandSupported(ClientCommand.BRANCH));
2018-08-22 10:59:46 +02:00
RepositoryUtil.createAndCommitFile(repositoryClient, "scmadmin", "a.txt", "a");
String branchesUrl = given()
.when()
.get(TestData.getDefaultRepositoryUrl(repositoryType))
.then()
.statusCode(HttpStatus.SC_OK)
.extract()
.path("_links.branches.href");
Object branchName = given()
.when()
.get(branchesUrl)
.then()
.statusCode(HttpStatus.SC_OK)
.extract()
.path("_embedded.branches[0].name");
assertNotNull(branchName);
}
2018-08-17 09:33:45 +02:00
2018-09-04 17:38:28 +02:00
@Test
public void shouldFindTags() throws IOException {
RepositoryClient repositoryClient = RepositoryUtil.createRepositoryClient(repositoryType, folder);
Assume.assumeTrue("There are no tags for " + repositoryType, repositoryClient.isCommandSupported(ClientCommand.TAG));
Changeset changeset = RepositoryUtil.createAndCommitFile(repositoryClient, ADMIN_USERNAME, "a.txt", "a");
String tagName = "v1.0";
String repositoryUrl = TestData.getDefaultRepositoryUrl(repositoryType);
String tagsUrl = given()
.when()
.get(repositoryUrl)
.then()
.statusCode(HttpStatus.SC_OK)
.extract()
.path("_links.tags.href");
ExtractableResponse<Response> response = given(VndMediaType.TAG_COLLECTION, ADMIN_USERNAME, ADMIN_PASSWORD)
.when()
.get(tagsUrl)
.then()
.statusCode(HttpStatus.SC_OK)
.extract();
assertThat(response).isNotNull();
assertThat(response.body()).isNotNull();
assertThat(response.body().asString())
.isNotNull()
2018-09-06 10:41:49 +02:00
.isNotBlank();
2018-09-04 17:38:28 +02:00
RepositoryUtil.addTag(repositoryClient, changeset.getId(), tagName);
response = given(VndMediaType.TAG_COLLECTION, ADMIN_USERNAME, ADMIN_PASSWORD)
.when()
.get(tagsUrl)
.then()
.statusCode(HttpStatus.SC_OK)
2018-09-06 10:41:49 +02:00
.extract();
2018-09-04 17:38:28 +02:00
assertThat(response).isNotNull();
assertThat(response.body()).isNotNull();
assertThat(response.body().asString())
.isNotNull()
2018-09-06 10:41:49 +02:00
.isNotBlank();
2018-09-04 17:38:28 +02:00
assertThat(response.body().jsonPath().getString("_links.self.href"))
.as("assert tags self link")
.isNotNull()
2018-09-06 10:41:49 +02:00
.contains(repositoryUrl + "/tags/");
2018-09-04 17:38:28 +02:00
assertThat(response.body().jsonPath().getList("_embedded.tags"))
.as("assert tag size")
.isNotNull()
.size()
2018-09-06 10:41:49 +02:00
.isGreaterThan(0);
2018-09-04 17:38:28 +02:00
assertThat(response.body().jsonPath().getMap("_embedded.tags.find{it.name=='" + tagName + "'}"))
.as("assert tag name and revision")
.isNotNull()
.hasSize(3)
.containsEntry("name", tagName)
2018-09-06 10:41:49 +02:00
.containsEntry("revision", changeset.getId());
2018-09-04 17:38:28 +02:00
assertThat(response.body().jsonPath().getString("_embedded.tags.find{it.name=='" + tagName + "'}._links.self.href"))
.as("assert single tag self link")
.isNotNull()
2018-09-06 10:41:49 +02:00
.contains(String.format("%s/tags/%s", repositoryUrl, tagName));
2018-09-04 17:38:28 +02:00
assertThat(response.body().jsonPath().getString("_embedded.tags.find{it.name=='" + tagName + "'}._links.sources.href"))
.as("assert single tag source link")
.isNotNull()
2018-09-06 10:41:49 +02:00
.contains(String.format("%s/sources/%s", repositoryUrl, changeset.getId()));
2018-09-04 17:38:28 +02:00
assertThat(response.body().jsonPath().getString("_embedded.tags.find{it.name=='" + tagName + "'}._links.changesets.href"))
.as("assert single tag changesets link")
.isNotNull()
2018-09-06 10:41:49 +02:00
.contains(String.format("%s/changesets/%s", repositoryUrl, changeset.getId()));
2018-09-04 17:38:28 +02:00
}
2018-08-17 09:33:45 +02:00
@Test
public void shouldReadContent() throws IOException, InterruptedException {
2018-08-28 12:43:56 +02:00
RepositoryClient repositoryClient = RepositoryUtil.createRepositoryClient(repositoryType, folder);
RepositoryUtil.createAndCommitFile(repositoryClient, "scmadmin", "a.txt", "a");
tempFolder.newFolder("subfolder");
2018-08-28 12:43:56 +02:00
RepositoryUtil.createAndCommitFile(repositoryClient, "scmadmin", "subfolder/a.txt", "sub-a");
2018-08-17 09:33:45 +02:00
sleep(1000);
String sourcesUrl = given()
.when()
.get(TestData.getDefaultRepositoryUrl(repositoryType))
.then()
.statusCode(HttpStatus.SC_OK)
.extract()
.path("_links.sources.href");
String rootContentUrl = given()
2018-08-17 09:33:45 +02:00
.when()
.get(sourcesUrl)
.then()
.statusCode(HttpStatus.SC_OK)
.extract()
.path("_embedded.files.find{it.name=='a.txt'}._links.self.href");
2018-09-03 15:36:09 +02:00
2018-08-17 09:33:45 +02:00
given()
.when()
.get(rootContentUrl)
2018-08-17 09:33:45 +02:00
.then()
.statusCode(HttpStatus.SC_OK)
.body(equalTo("a"));
String subfolderSourceUrl = given()
.when()
.get(sourcesUrl)
.then()
.statusCode(HttpStatus.SC_OK)
.extract()
.path("_embedded.files.find{it.name=='subfolder'}._links.self.href");
2018-09-03 15:36:09 +02:00
String selfOfSubfolderUrl = given()
.when()
.get(subfolderSourceUrl)
.then()
.statusCode(HttpStatus.SC_OK)
.extract()
2018-09-03 15:36:09 +02:00
.path("_links.self.href");
assertThat(subfolderSourceUrl).isEqualTo(selfOfSubfolderUrl);
String subfolderContentUrl = given()
.when()
.get(subfolderSourceUrl)
.then()
.statusCode(HttpStatus.SC_OK)
.extract()
.path("_embedded.files[0]._links.self.href");
given()
.when()
.get(subfolderContentUrl)
.then()
.statusCode(HttpStatus.SC_OK)
.body(equalTo("sub-a"));
2018-08-17 09:33:45 +02:00
}
2018-08-29 13:34:53 +02:00
@Test
public void shouldFindChangesets() throws IOException {
RepositoryClient repositoryClient = RepositoryUtil.createRepositoryClient(repositoryType, folder);
RepositoryUtil.createAndCommitFile(repositoryClient, "scmadmin", "a.txt", "a");
RepositoryUtil.createAndCommitFile(repositoryClient, "scmadmin", "b.txt", "b");
String changesetsUrl = given()
.when()
.get(TestData.getDefaultRepositoryUrl(repositoryType))
.then()
.statusCode(HttpStatus.SC_OK)
.extract()
.path("_links.changesets.href");
List changesets = given()
.when()
.get(changesetsUrl)
.then()
.statusCode(HttpStatus.SC_OK)
.extract()
.path("_embedded.changesets.id");
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);
2018-09-10 11:13:36 +02:00
Changeset changeset = RepositoryUtil.createAndCommitFile(repositoryClient, ADMIN_USERNAME, "folder/subfolder/a.txt", "a");
repositoryGetRequest
.usingRepositoryResponse()
.requestSources()
.usingSourcesResponse()
2018-09-10 11:13:36 +02:00
.requestSelf("folder")
.usingSourcesResponse()
.requestSelf("subfolder")
.usingSourcesResponse()
.requestFileHistory("a.txt")
.assertStatusCode(HttpStatus.SC_OK)
.usingChangesetsResponse()
.assertChangesets(changesets -> {
assertThat(changesets).hasSize(1);
2018-09-10 11:13:36 +02:00
assertThat(changesets.get(0)).containsEntry("id", changeset.getId());
assertThat(changesets.get(0)).containsEntry("description", changeset.getDescription());
}
);
}
}
2018-08-29 13:34:53 +02:00