package edu.harvard.iq.dataverse.api;
import com.jayway.restassured.RestAssured;
import com.jayway.restassured.response.Response;
import edu.harvard.iq.dataverse.Dataverse;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.logging.Logger;
import javax.json.Json;
import javax.json.JsonObject;
import static javax.ws.rs.core.Response.Status.CREATED;
import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR;
import static javax.ws.rs.core.Response.Status.OK;
import javax.ws.rs.core.Response.Status;
import org.junit.BeforeClass;
import org.junit.Test;
import static junit.framework.Assert.assertEquals;
import static org.hamcrest.CoreMatchers.equalTo;
public class DataversesIT {
private static final Logger logger = Logger.getLogger(DataversesIT.class.getCanonicalName());
@BeforeClass
public static void setUpClass() {
RestAssured.baseURI = UtilIT.getRestAssuredBaseUri();
}
@Test
public void testAttemptToCreateDuplicateAlias() throws Exception {
Response createUser = UtilIT.createRandomUser();
// createUser.prettyPrint();
String username = UtilIT.getUsernameFromResponse(createUser);
String apiToken = UtilIT.getApiTokenFromResponse(createUser);
Response createDataverse1Response = UtilIT.createRandomDataverse(apiToken);
if (createDataverse1Response.getStatusCode() != 201) {
// purposefully using println here to the error shows under "Test Results" in Netbeans
System.out.println("A workspace for testing (a dataverse) couldn't be created in the root dataverse. The output was:\n\n" + createDataverse1Response.body().asString());
System.out.println("\nPlease ensure that users can created dataverses in the root in order for this test to run.");
} else {
createDataverse1Response.prettyPrint();
}
assertEquals(201, createDataverse1Response.getStatusCode());
String dataverseAlias1 = UtilIT.getAliasFromResponse(createDataverse1Response);
String dataverseAlias2 = dataverseAlias1.toUpperCase();
logger.info("Attempting to creating dataverse with alias '" + dataverseAlias2 + "' (uppercase version of existing '" + dataverseAlias1 + "' dataverse, should fail)...");
String category = null;
Response attemptToCreateDataverseWithDuplicateAlias = UtilIT.createDataverse(dataverseAlias2, category, apiToken);
attemptToCreateDataverseWithDuplicateAlias.prettyPrint();
assertEquals(403, attemptToCreateDataverseWithDuplicateAlias.getStatusCode());
logger.info("Deleting dataverse " + dataverseAlias1);
Response deleteDataverse1Response = UtilIT.deleteDataverse(dataverseAlias1, apiToken);
deleteDataverse1Response.prettyPrint();
assertEquals(200, deleteDataverse1Response.getStatusCode());
logger.info("Checking response code for attempting to delete a non-existent dataverse.");
Response attemptToDeleteDataverseThatShouldNotHaveBeenCreated = UtilIT.deleteDataverse(dataverseAlias2, apiToken);
attemptToDeleteDataverseThatShouldNotHaveBeenCreated.prettyPrint();
assertEquals(404, attemptToDeleteDataverseThatShouldNotHaveBeenCreated.getStatusCode());
}
@Test
public void testDataverseCategory() {
Response createUser = UtilIT.createRandomUser();
createUser.prettyPrint();
String username = UtilIT.getUsernameFromResponse(createUser);
String apiToken = UtilIT.getApiTokenFromResponse(createUser);
Response createDataverseWithoutCategory = UtilIT.createRandomDataverse(apiToken);
createDataverseWithoutCategory.prettyPrint();
createDataverseWithoutCategory.then().assertThat()
.body("data.dataverseType", equalTo("UNCATEGORIZED"))
.statusCode(Status.CREATED.getStatusCode());
String alias1 = UtilIT.getRandomIdentifier();
String category1 = Dataverse.DataverseType.LABORATORY.toString();
Response createDataverseWithCategory = UtilIT.createDataverse(alias1, category1, apiToken);
createDataverseWithCategory.prettyPrint();
createDataverseWithCategory.then().assertThat()
.body("data.dataverseType", equalTo("LABORATORY"))
.statusCode(Status.CREATED.getStatusCode());
String alias2 = UtilIT.getRandomIdentifier();
String madeUpCategory = "madeUpCategory";
Response createDataverseWithInvalidCategory = UtilIT.createDataverse(alias2, madeUpCategory, apiToken);
createDataverseWithInvalidCategory.prettyPrint();
createDataverseWithInvalidCategory.then().assertThat()
.body("data.dataverseType", equalTo("UNCATEGORIZED"))
.statusCode(Status.CREATED.getStatusCode());
String alias3 = UtilIT.getRandomIdentifier();
String category3 = Dataverse.DataverseType.LABORATORY.toString().toLowerCase();
Response createDataverseWithLowerCaseCategory = UtilIT.createDataverse(alias3, category3, apiToken);
createDataverseWithLowerCaseCategory.prettyPrint();
createDataverseWithLowerCaseCategory.then().assertThat()
.body("data.dataverseType", equalTo("UNCATEGORIZED"))
.statusCode(Status.CREATED.getStatusCode());
}
@Test
public void testMinimalDataverse() throws FileNotFoundException {
Response createUser = UtilIT.createRandomUser();
createUser.prettyPrint();
String username = UtilIT.getUsernameFromResponse(createUser);
String apiToken = UtilIT.getApiTokenFromResponse(createUser);
JsonObject dvJson;
FileReader reader = new FileReader("doc/sphinx-guides/source/_static/api/dataverse-minimal.json");
dvJson = Json.createReader(reader).readObject();
Response create = UtilIT.createDataverse(dvJson, apiToken);
create.prettyPrint();
create.then().assertThat().statusCode(CREATED.getStatusCode());
Response deleteDataverse = UtilIT.deleteDataverse("science", apiToken);
deleteDataverse.prettyPrint();
deleteDataverse.then().assertThat().statusCode(OK.getStatusCode());
}
@Test
public void testNotEnoughJson() {
Response createUser = UtilIT.createRandomUser();
createUser.prettyPrint();
String username = UtilIT.getUsernameFromResponse(createUser);
String apiToken = UtilIT.getApiTokenFromResponse(createUser);
Response createFail = UtilIT.createDataverse(Json.createObjectBuilder().add("name", "notEnough").add("alias", "notEnough").build(), apiToken);
createFail.prettyPrint();
createFail.then().assertThat()
/**
* @todo We really don't want Dataverse to throw a 500 error
* when not enough JSON is supplied to create a dataverse.
*/
.statusCode(INTERNAL_SERVER_ERROR.getStatusCode());
}
}