package com.taskadapter.redmineapi;
import com.taskadapter.redmineapi.bean.Project;
import com.taskadapter.redmineapi.bean.ProjectFactory;
import com.taskadapter.redmineapi.bean.User;
import com.taskadapter.redmineapi.bean.UserFactory;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.ClientConnectionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
public class IntegrationTestHelper {
private static final Logger logger = LoggerFactory.getLogger(IntegrationTestHelper.class);
// to make sure we all use the same config
public static TestConfig getTestConfig() {
return new TestConfig();
}
public static User getOurUser() {
TestConfig testConfig = getTestConfig();
Integer userId = Integer.parseInt(testConfig.getParam("createissue.userid"));
String login = testConfig.getLogin();
String fName = testConfig.getParam("userFName");
String lName = testConfig.getParam("userLName");
User user = UserFactory.create(userId);
user.setLogin(login);
user.setFirstName(fName);
user.setLastName(lName);
user.setApiKey(testConfig.getParam("apikey"));
return user;
}
public static RedmineManager createRedmineManager() {
TestConfig testConfig = getTestConfig();
logger.info("Running Redmine integration tests using: " + testConfig.getURI());
final HttpClient client = getHttpClientForTestServer();
return RedmineManagerFactory.createWithUserAuth(testConfig.getURI(),
testConfig.getLogin(), testConfig.getPassword(),
client);
}
public static RedmineManager createRedmineManagerWithAPIKey() {
TestConfig testConfig = getTestConfig();
logger.info("Running Redmine integration tests using: " + testConfig.getURI());
final HttpClient client = getHttpClientForTestServer();
return RedmineManagerFactory.createWithApiKey(testConfig.getURI(), testConfig.getApiKey(), client);
}
public static Project createProject(RedmineManager mgr) {
Project testProject = ProjectFactory.create("test project", "test" + Calendar.getInstance().getTimeInMillis());
try {
return mgr.getProjectManager().createProject(testProject);
} catch (Exception e) {
logger.error("Exception while configuring tests", e);
throw new RuntimeException(e);
}
}
public static Project createAndReturnProject(ProjectManager mgr) {
Project testProject = ProjectFactory.create("test project", "test" + Calendar.getInstance().getTimeInMillis());
try {
return mgr.createProject(testProject);
} catch (Exception e) {
logger.error("Exception while configuring tests", e);
throw new RuntimeException(e);
}
}
/**
* Delete the project if it exists. this method ignores NULL or empty projectKey parameter.
*/
public static void deleteProject(RedmineManager mgr, String projectKey) {
try {
if (mgr != null && projectKey != null) {
mgr.getProjectManager().deleteProject(projectKey);
}
} catch (Exception e) {
logger.error("Exception while deleting test project", e);
throw new RuntimeException("can't delete the test project '" + projectKey + ". reason: " + e.getMessage());
}
}
/**
* @return The client configured for our Dev Redmine server which has a self-signed SSL certificate.
*/
public static HttpClient getHttpClientForTestServer() {
final ClientConnectionManager connectionManager;
try {
connectionManager = createConnectionManagerWithOurDevKeystore();
} catch (Exception e) {
throw new RuntimeException("cannot create connection manager: " + e, e);
}
return RedmineManagerFactory.getNewHttpClient(connectionManager);
}
private static ClientConnectionManager createConnectionManagerWithOurDevKeystore() throws KeyManagementException, KeyStoreException {
final Collection<KeyStore> extraStores = new ArrayList<>();
final KeyStore builtInExtension = getExtensionKeystore();
if (builtInExtension != null) {
extraStores.add(builtInExtension);
}
if (!extraStores.isEmpty()) {
return RedmineManagerFactory.createConnectionManagerWithExtraTrust(extraStores);
}
return RedmineManagerFactory.createDefaultConnectionManager();
}
/**
* Returns a key store with the additional SSL certificates.
* this is how we provide the self-signed SSL certificate for our
* Redmine dev server.
*/
private static KeyStore getExtensionKeystore() {
final InputStream extStore =
IntegrationTestHelper.class.getClassLoader().getResourceAsStream("ta-dev-cacerts");
if (extStore == null) {
return null;
}
try {
final KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(extStore, "changeit".toCharArray());
return ks;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
extStore.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}