diff --git a/README.md b/README.md index 81bfd1c..ef4690e 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ It enables jQAssistant to scan and to analyze data from **Jira**. Download the jQAssistant command line tool for your system: [jQAssistant - Get Started](https://jqassistant.org/get-started/). -Next download the latest version from the release tab. Put the `jqa-jira-plugin-*.jar` into the plugins folder of the jQAssistant command +Next download the latest version from the release tab. Put the `jqassistant-jira-plugin-*.jar` into the plugins folder of the jQAssistant command line tool. Finally, you need to configure the plugin via XML. The file must be named `jira-plugin-configuration.xml`: @@ -40,18 +40,18 @@ you to use your email as login name as well. This is not possible when querying Now scan your configuration and wait for the plugin to finish: ```bash -jqassistant-commandline-neo4jv3-1.6.0/bin/jqassistant.sh scan -f jira-plugin-configuration.xml +jqassistant.sh scan -f jira-plugin-configuration.xml ``` You can then start a local Neo4j server to start querying the database at [http://localhost:7474](http://localhost:7474): ```bash -jqassistant-commandline-neo4jv3-1.6.0/bin/jqassistant.sh server +bin/jqassistant.sh server ``` -## Custom Certificate +## Self-Signed Certificate -If you use a self-signed certificate register it with the [Keytool](http://tutorials.jenkov.com/java-cryptography/keytool.html): +If your JIRA instance uses a self-signed certificate register it with the [Keytool](http://tutorials.jenkov.com/java-cryptography/keytool.html): ```bash keytool -import -alias JIRA -file jira.crt -keystore $JAVA_HOME/jre/lib/security/cacerts diff --git a/pom.xml b/pom.xml index c90386a..468081f 100644 --- a/pom.xml +++ b/pom.xml @@ -6,12 +6,12 @@ org.jqassistant.contrib.common parent - 1.6.0 + 1.7.0 org.jqassistant.contrib.plugin - jqa-jira-plugin - 0.0.1 + jqassistant-jira-plugin + 1.7.0-SNAPSHOT jQAssistant Jira Plugin The jQAssistant plugin to scan and to analyze a Jira instance. @@ -34,6 +34,13 @@ + + scm:git:git@github.com:softvis-research/jqa-jira-plugin.git + scm:git:git@github.com:softvis-research/jqa-jira-plugin.git + https://github.com/softvis-research/jqa-jira-plugin.git + HEAD + + GNU General Public License, v3 @@ -57,10 +64,6 @@ - - 2.0.0.0 - - @@ -141,27 +144,8 @@ - - - - - - junit - junit - 4.12 - test - - - org.mockito - mockito-core - 1.10.19 - test - - - - org.jdom @@ -173,6 +157,12 @@ com.atlassian.jira jira-rest-java-client-core 5.1.1-e0dd194 + + + commons-logging + commons-logging + + @@ -238,7 +228,6 @@ com.buschmais.xo xo.neo4j.embedded - test @@ -249,23 +238,26 @@ org.hamcrest java-hamcrest - ${org.hamcrest.version} - junit - junit - test + org.junit.jupiter + junit-jupiter-engine - org.slf4j - slf4j-simple - provided + org.mockito + mockito-core - - com.buschmais.jqassistant.plugin - java - test + org.mockito + mockito-junit-jupiter + + + org.assertj + assertj-core + + + org.slf4j + slf4j-simple \ No newline at end of file diff --git a/src/main/java/org/jqassistant/contrib/plugin/jira/jdom/XMLCredentials.java b/src/main/java/org/jqassistant/contrib/plugin/jira/configuration/Credentials.java similarity index 62% rename from src/main/java/org/jqassistant/contrib/plugin/jira/jdom/XMLCredentials.java rename to src/main/java/org/jqassistant/contrib/plugin/jira/configuration/Credentials.java index 4b44dfe..37b85f0 100644 --- a/src/main/java/org/jqassistant/contrib/plugin/jira/jdom/XMLCredentials.java +++ b/src/main/java/org/jqassistant/contrib/plugin/jira/configuration/Credentials.java @@ -1,11 +1,11 @@ -package org.jqassistant.contrib.plugin.jira.jdom; +package org.jqassistant.contrib.plugin.jira.configuration; import lombok.AllArgsConstructor; import lombok.Getter; @AllArgsConstructor @Getter -public class XMLCredentials { +public class Credentials { private String user; private String password; diff --git a/src/main/java/org/jqassistant/contrib/plugin/jira/configuration/JiraPluginConfiguration.java b/src/main/java/org/jqassistant/contrib/plugin/jira/configuration/JiraPluginConfiguration.java new file mode 100644 index 0000000..80b558c --- /dev/null +++ b/src/main/java/org/jqassistant/contrib/plugin/jira/configuration/JiraPluginConfiguration.java @@ -0,0 +1,16 @@ +package org.jqassistant.contrib.plugin.jira.configuration; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.List; +import java.util.Optional; + +@AllArgsConstructor +@Getter +public class JiraPluginConfiguration { + + private String url; + private Optional credentials; + private List projects; +} diff --git a/src/main/java/org/jqassistant/contrib/plugin/jira/jdom/XMLJiraProject.java b/src/main/java/org/jqassistant/contrib/plugin/jira/configuration/Project.java similarity index 57% rename from src/main/java/org/jqassistant/contrib/plugin/jira/jdom/XMLJiraProject.java rename to src/main/java/org/jqassistant/contrib/plugin/jira/configuration/Project.java index 255c7df..91e8c15 100644 --- a/src/main/java/org/jqassistant/contrib/plugin/jira/jdom/XMLJiraProject.java +++ b/src/main/java/org/jqassistant/contrib/plugin/jira/configuration/Project.java @@ -1,11 +1,11 @@ -package org.jqassistant.contrib.plugin.jira.jdom; +package org.jqassistant.contrib.plugin.jira.configuration; import lombok.AllArgsConstructor; import lombok.Getter; @AllArgsConstructor @Getter -public class XMLJiraProject { +public class Project { private String key; } diff --git a/src/main/java/org/jqassistant/contrib/plugin/jira/jdom/XMLJiraPluginConfiguration.java b/src/main/java/org/jqassistant/contrib/plugin/jira/jdom/XMLJiraPluginConfiguration.java deleted file mode 100644 index aac96b6..0000000 --- a/src/main/java/org/jqassistant/contrib/plugin/jira/jdom/XMLJiraPluginConfiguration.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.jqassistant.contrib.plugin.jira.jdom; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.List; - -@AllArgsConstructor -@Getter -public class XMLJiraPluginConfiguration { - - private String url; - private XMLCredentials credentials; - private List projects; -} diff --git a/src/main/java/org/jqassistant/contrib/plugin/jira/jdom/XMLParser.java b/src/main/java/org/jqassistant/contrib/plugin/jira/jdom/XMLParser.java index ccb9e9b..3761f79 100644 --- a/src/main/java/org/jqassistant/contrib/plugin/jira/jdom/XMLParser.java +++ b/src/main/java/org/jqassistant/contrib/plugin/jira/jdom/XMLParser.java @@ -4,11 +4,15 @@ import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; +import org.jqassistant.contrib.plugin.jira.configuration.Credentials; +import org.jqassistant.contrib.plugin.jira.configuration.JiraPluginConfiguration; +import org.jqassistant.contrib.plugin.jira.configuration.Project; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import java.util.Optional; /** * The {@link XMLParser} class contains two functions which parse the configuration file for the Jira plugin. @@ -37,16 +41,16 @@ public class XMLParser { * @throws JDOMException If XML parsing failed. * @throws IOException If reading the config file failed. */ - public XMLJiraPluginConfiguration parseConfiguration(InputStream inputStream) throws JDOMException, NullPointerException, IOException { + public JiraPluginConfiguration parseConfiguration(InputStream inputStream) throws JDOMException, NullPointerException, IOException { SAXBuilder builder = new SAXBuilder(); Document document = builder.build(inputStream); String jiraUrl = this.parseJiraUrl(document); - XMLCredentials xmlCredentials = this.parseCredentials(document); - List xmlJiraProjectList = this.parseJiraProjects(document); + Optional xmlCredentials = this.parseCredentials(document); + List projectList = this.parseJiraProjects(document); - return new XMLJiraPluginConfiguration(jiraUrl, xmlCredentials, xmlJiraProjectList); + return new JiraPluginConfiguration(jiraUrl, xmlCredentials, projectList); } @@ -55,27 +59,31 @@ private String parseJiraUrl(Document document) { return document.getRootElement().getChildText(URL_ELEMENT_NAME); } - private XMLCredentials parseCredentials(Document document) { + private Optional parseCredentials(Document document) { Element credentialsElement = document.getRootElement().getChild(CREDENTIALS_ELEMENT_NAME); + if (credentialsElement == null) { + return Optional.empty(); + } + String username = credentialsElement.getChildText(USERNAME_ELEMENT_NAME); String password = credentialsElement.getChildText(PASSWORD_ELEMENT_NAME); - return new XMLCredentials(username, password); + return Optional.of(new Credentials(username, password)); } - private List parseJiraProjects(Document document) { + private List parseJiraProjects(Document document) { - List xmlJiraProjectList = new ArrayList<>(); + List projectList = new ArrayList<>(); for (Element jiraProject : document.getRootElement().getChild(PROJECTS_ELEMENT_NAME).getChildren()) { String key = jiraProject.getChildText(PROJECT_KEY_ELEMENT_NAME); - xmlJiraProjectList.add(new XMLJiraProject(key)); + projectList.add(new Project(key)); } - return xmlJiraProjectList; + return projectList; } } diff --git a/src/main/java/org/jqassistant/contrib/plugin/jira/jjrc/DefaultJiraRestClientWrapper.java b/src/main/java/org/jqassistant/contrib/plugin/jira/jjrc/DefaultJiraRestClientWrapper.java index e6dd035..4e9ff73 100644 --- a/src/main/java/org/jqassistant/contrib/plugin/jira/jjrc/DefaultJiraRestClientWrapper.java +++ b/src/main/java/org/jqassistant/contrib/plugin/jira/jjrc/DefaultJiraRestClientWrapper.java @@ -2,7 +2,10 @@ import com.atlassian.jira.rest.client.api.JiraRestClient; import com.atlassian.jira.rest.client.api.domain.*; +import com.atlassian.jira.rest.client.auth.AnonymousAuthenticationHandler; import com.atlassian.jira.rest.client.internal.async.AsynchronousJiraRestClientFactory; +import org.jqassistant.contrib.plugin.jira.configuration.Credentials; +import org.jqassistant.contrib.plugin.jira.configuration.JiraPluginConfiguration; import java.net.URI; import java.util.Collections; @@ -21,10 +24,15 @@ public class DefaultJiraRestClientWrapper implements JiraRestClientWrapper { private final JiraRestClient jiraRestClient; - public DefaultJiraRestClientWrapper(String url, String username, String password) { - - jiraRestClient = new AsynchronousJiraRestClientFactory() - .createWithBasicHttpAuthentication(URI.create(url), username, password); + public DefaultJiraRestClientWrapper(JiraPluginConfiguration pluginConfiguration) { + AsynchronousJiraRestClientFactory clientFactory = new AsynchronousJiraRestClientFactory(); + URI uri = URI.create(pluginConfiguration.getUrl()); + if (pluginConfiguration.getCredentials().isPresent()) { + Credentials x = pluginConfiguration.getCredentials().get(); + jiraRestClient = clientFactory.createWithBasicHttpAuthentication(uri, x.getUser(), x.getPassword()); + } else { + jiraRestClient = clientFactory.create(uri, new AnonymousAuthenticationHandler()); + } } @Override diff --git a/src/main/java/org/jqassistant/contrib/plugin/jira/model/JiraIssue.java b/src/main/java/org/jqassistant/contrib/plugin/jira/model/JiraIssue.java index a83c921..5a597c1 100644 --- a/src/main/java/org/jqassistant/contrib/plugin/jira/model/JiraIssue.java +++ b/src/main/java/org/jqassistant/contrib/plugin/jira/model/JiraIssue.java @@ -34,7 +34,7 @@ public interface JiraIssue extends Jira, JiraID, JiraAuditInformation, JiraDescr JiraUser getAssignee(); void setAssignee(JiraUser jiraUser); - @Relation("CONCERNES") + @Relation("CONCERNS") List getComponents(); @Relation("IS_OF_TYPE") diff --git a/src/main/java/org/jqassistant/contrib/plugin/jira/scanner/GraphBuilder.java b/src/main/java/org/jqassistant/contrib/plugin/jira/scanner/GraphBuilder.java index 28eca55..17b8324 100644 --- a/src/main/java/org/jqassistant/contrib/plugin/jira/scanner/GraphBuilder.java +++ b/src/main/java/org/jqassistant/contrib/plugin/jira/scanner/GraphBuilder.java @@ -4,22 +4,20 @@ import com.buschmais.jqassistant.core.scanner.api.Scope; import com.buschmais.jqassistant.plugin.common.api.scanner.filesystem.FileResource; import org.jqassistant.contrib.plugin.jira.cache.CacheEndpoint; -import org.jqassistant.contrib.plugin.jira.jdom.XMLJiraPluginConfiguration; +import org.jqassistant.contrib.plugin.jira.configuration.JiraPluginConfiguration; import org.jqassistant.contrib.plugin.jira.jjrc.DefaultJiraRestClientWrapper; import org.jqassistant.contrib.plugin.jira.jjrc.JiraRestClientWrapper; import org.jqassistant.contrib.plugin.jira.model.JiraServer; import org.jqassistant.contrib.plugin.jira.scanner.builder.*; +import java.io.IOException; + /** * The GraphBuilder gets build only once per execution of the Jira plugin * {@link JiraScannerPlugin#scan(FileResource, String, Scope, Scanner)} method. */ public class GraphBuilder { - // FIXME: We should find a better solution to switch between the mocked and the default implementation. - // After fixing this we can also move the mock classes to the test package. - public static String TEST_ENV = "JQASSISTANT_JIRA_PLUGIN_TEST"; - private final ServerInfoBuilder serverInfoBuilder; private final PriorityBuilder priorityBuilder; private final StatusBuilder statusBuilder; @@ -27,9 +25,9 @@ public class GraphBuilder { private final SubtaskRelationBuilder subtaskRelationBuilder; private final ProjectBuilder projectBuilder; - GraphBuilder(XMLJiraPluginConfiguration xmlJiraPluginConfiguration, CacheEndpoint cacheEndpoint) throws IllegalAccessException, InstantiationException, ClassNotFoundException { + GraphBuilder(JiraPluginConfiguration jiraPluginConfiguration, CacheEndpoint cacheEndpoint) throws IOException { - JiraRestClientWrapper jiraRestClientWrapper = this.initializeJiraRestClientWrapper(xmlJiraPluginConfiguration); + JiraRestClientWrapper jiraRestClientWrapper = this.initializeJiraRestClientWrapper(jiraPluginConfiguration); this.serverInfoBuilder = new ServerInfoBuilder(jiraRestClientWrapper); this.priorityBuilder = new PriorityBuilder(cacheEndpoint, jiraRestClientWrapper); @@ -45,30 +43,30 @@ public class GraphBuilder { this.projectBuilder = new ProjectBuilder(cacheEndpoint, jiraRestClientWrapper, componentBuilder, issueBuilder, userBuilder); } - private JiraRestClientWrapper initializeJiraRestClientWrapper(XMLJiraPluginConfiguration xmlJiraPluginConfiguration) throws ClassNotFoundException, IllegalAccessException, InstantiationException { - - String url = xmlJiraPluginConfiguration.getUrl(); - String username = xmlJiraPluginConfiguration.getCredentials().getUser(); - String password = xmlJiraPluginConfiguration.getCredentials().getPassword(); - - if (System.getenv(TEST_ENV) != null) { - return (JiraRestClientWrapper) GraphBuilder.class - .getClassLoader() - .loadClass("org.jqassistant.contrib.plugin.jira.jjrc.MockedJiraRestClientWrapper") - .newInstance(); + private JiraRestClientWrapper initializeJiraRestClientWrapper(JiraPluginConfiguration jiraPluginConfiguration) throws IOException { + String restClientClass = System.getProperty(JiraRestClientWrapper.class.getName()); + if (restClientClass != null) { + try { + return (JiraRestClientWrapper) + Thread.currentThread().getContextClassLoader() + .loadClass(restClientClass) + .newInstance(); + } catch (ReflectiveOperationException e) { + throw new IOException("Cannot load class " + restClientClass); + } } else { - return new DefaultJiraRestClientWrapper(url, username, password); + return new DefaultJiraRestClientWrapper(jiraPluginConfiguration); } } - void startTraversal(final JiraServer jiraServer, final XMLJiraPluginConfiguration xmlJiraPluginConfiguration) { + void startTraversal(final JiraServer jiraServer, final JiraPluginConfiguration jiraPluginConfiguration) { this.serverInfoBuilder.handleServerInfo(jiraServer); this.priorityBuilder.handlePriorities(jiraServer); this.statusBuilder.handleStatuses(jiraServer); - this.projectBuilder.handleProjects(jiraServer, xmlJiraPluginConfiguration); + this.projectBuilder.handleProjects(jiraServer, jiraPluginConfiguration); this.issueLinkBuilder.handleIssueLinks(); this.subtaskRelationBuilder.handleSubtaskRelations(); diff --git a/src/main/java/org/jqassistant/contrib/plugin/jira/scanner/JiraScannerPlugin.java b/src/main/java/org/jqassistant/contrib/plugin/jira/scanner/JiraScannerPlugin.java index c2558b5..fab80f1 100644 --- a/src/main/java/org/jqassistant/contrib/plugin/jira/scanner/JiraScannerPlugin.java +++ b/src/main/java/org/jqassistant/contrib/plugin/jira/scanner/JiraScannerPlugin.java @@ -8,7 +8,7 @@ import com.buschmais.jqassistant.plugin.common.api.scanner.filesystem.FileResource; import org.jdom2.JDOMException; import org.jqassistant.contrib.plugin.jira.cache.CacheEndpoint; -import org.jqassistant.contrib.plugin.jira.jdom.XMLJiraPluginConfiguration; +import org.jqassistant.contrib.plugin.jira.configuration.JiraPluginConfiguration; import org.jqassistant.contrib.plugin.jira.jdom.XMLParser; import org.jqassistant.contrib.plugin.jira.model.JiraServer; import org.slf4j.Logger; @@ -27,7 +27,7 @@ public class JiraScannerPlugin extends AbstractScannerPlugin credentials = jiraPluginConfiguration.getCredentials(); + assertTrue(credentials.isPresent()); + assertEquals("testuser", credentials.get().getUser()); + assertEquals("secret", credentials.get().getPassword()); + + + assertEquals(2, jiraPluginConfiguration.getProjects().size()); + assertEquals("Project X", jiraPluginConfiguration.getProjects().get(0).getKey()); + assertEquals("Project Y", jiraPluginConfiguration.getProjects().get(1).getKey()); + } + + @Test + public void pluginConfigurationWithoutCredentials() throws JDOMException, IOException { + + JiraPluginConfiguration jiraPluginConfiguration = xmlParser.parseConfiguration( + this.getClass().getClassLoader().getResourceAsStream(TEST_CONFIGURATION_WITHOUT_CREDENTIALS_FILE_NAME)); - Assert.assertEquals("testuser", xmlJiraPluginConfiguration.getCredentials().getUser()); - Assert.assertEquals("secret", xmlJiraPluginConfiguration.getCredentials().getPassword()); + assertEquals("http://localhost:32763", jiraPluginConfiguration.getUrl()); + assertFalse(jiraPluginConfiguration.getCredentials().isPresent()); - Assert.assertEquals(2, xmlJiraPluginConfiguration.getProjects().size()); - Assert.assertEquals("Project X", xmlJiraPluginConfiguration.getProjects().get(0).getKey()); - Assert.assertEquals("Project Y", xmlJiraPluginConfiguration.getProjects().get(1).getKey()); + assertEquals(2, jiraPluginConfiguration.getProjects().size()); + assertEquals("Project X", jiraPluginConfiguration.getProjects().get(0).getKey()); + assertEquals("Project Y", jiraPluginConfiguration.getProjects().get(1).getKey()); } } diff --git a/src/test/java/org/jqassistant/contrib/plugin/jira/jjrc/MockedProject.java b/src/test/java/org/jqassistant/contrib/plugin/jira/jjrc/MockedProject.java index 573dd4f..87fd47c 100644 --- a/src/test/java/org/jqassistant/contrib/plugin/jira/jjrc/MockedProject.java +++ b/src/test/java/org/jqassistant/contrib/plugin/jira/jjrc/MockedProject.java @@ -1,8 +1,13 @@ package org.jqassistant.contrib.plugin.jira.jjrc; import com.atlassian.jira.rest.client.api.OptionalIterable; -import com.atlassian.jira.rest.client.api.domain.*; -import org.parboiled.common.StringUtils; +import com.atlassian.jira.rest.client.api.domain.BasicComponent; +import com.atlassian.jira.rest.client.api.domain.BasicProject; +import com.atlassian.jira.rest.client.api.domain.BasicUser; +import com.atlassian.jira.rest.client.api.domain.IssueType; +import com.atlassian.jira.rest.client.api.domain.Project; +import com.atlassian.jira.rest.client.api.domain.Version; +import org.apache.commons.lang3.StringUtils; import java.net.URI; import java.util.Collections; diff --git a/src/test/java/org/jqassistant/contrib/plugin/jira/rate_limits/RateLimitsTest.java b/src/test/java/org/jqassistant/contrib/plugin/jira/rate_limits/RateLimitsTest.java index 53c8ab0..b77822e 100644 --- a/src/test/java/org/jqassistant/contrib/plugin/jira/rate_limits/RateLimitsTest.java +++ b/src/test/java/org/jqassistant/contrib/plugin/jira/rate_limits/RateLimitsTest.java @@ -5,12 +5,15 @@ import com.atlassian.jira.rest.client.internal.async.AsynchronousJiraRestClientFactory; import io.atlassian.util.concurrent.Promise; import lombok.extern.slf4j.Slf4j; -import org.junit.BeforeClass; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import java.net.URI; +import static org.junit.jupiter.api.Assumptions.assumeTrue; + /** * This test can be used to test the rate limits of the Jira REST API. *

@@ -27,14 +30,14 @@ public class RateLimitsTest { private static JiraRestClient jiraRestClient; - @BeforeClass + @BeforeAll public static void setUpJiraRestClient() { - + assumeTrue(URL != null); jiraRestClient = new AsynchronousJiraRestClientFactory() .createWithBasicHttpAuthentication(URI.create(URL), USERNAME, PASSWORD); } - @Ignore + @Disabled @Test public void when_oneRequestIsMadeAgainstJira_succeed() { @@ -47,7 +50,7 @@ public void when_oneRequestIsMadeAgainstJira_succeed() { } } - @Ignore + @Disabled @Test public void when_fivehundredRequestAreMadeAgainstJira_succeed() { diff --git a/src/test/java/org/jqassistant/contrib/plugin/jira/scanner/InvalidConfigurationTestIT.java b/src/test/java/org/jqassistant/contrib/plugin/jira/scanner/InvalidConfigurationTestIT.java index 18cbd0f..1740270 100644 --- a/src/test/java/org/jqassistant/contrib/plugin/jira/scanner/InvalidConfigurationTestIT.java +++ b/src/test/java/org/jqassistant/contrib/plugin/jira/scanner/InvalidConfigurationTestIT.java @@ -2,7 +2,7 @@ import com.buschmais.jqassistant.core.scanner.api.DefaultScope; import com.buschmais.jqassistant.plugin.common.test.AbstractPluginIT; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.File; import java.util.Objects; diff --git a/src/test/java/org/jqassistant/contrib/plugin/jira/scanner/ScannerTestIT.java b/src/test/java/org/jqassistant/contrib/plugin/jira/scanner/ScannerTestIT.java index d3c38a9..a33fb37 100644 --- a/src/test/java/org/jqassistant/contrib/plugin/jira/scanner/ScannerTestIT.java +++ b/src/test/java/org/jqassistant/contrib/plugin/jira/scanner/ScannerTestIT.java @@ -3,25 +3,28 @@ import com.buschmais.jqassistant.core.scanner.api.DefaultScope; import com.buschmais.jqassistant.core.store.api.model.Descriptor; import com.buschmais.jqassistant.plugin.common.test.AbstractPluginIT; -import org.hamcrest.CoreMatchers; +import org.jqassistant.contrib.plugin.jira.jjrc.JiraRestClientWrapper; +import org.jqassistant.contrib.plugin.jira.jjrc.MockedJiraRestClientWrapper; import org.jqassistant.contrib.plugin.jira.jjrc.MockedProject; import org.jqassistant.contrib.plugin.jira.jjrc.MockedServerInfo; import org.jqassistant.contrib.plugin.jira.model.JiraServer; -import org.jqassistant.contrib.plugin.jira.utils.EnvironmentOverrider; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import java.io.File; import java.util.Objects; +import static org.assertj.core.api.Assertions.assertThat; import static org.jqassistant.contrib.plugin.jira.utils.TimeConverter.convertTime; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + public class ScannerTestIT extends AbstractPluginIT { - @BeforeClass - public static void setTestEnvironmentVariables() throws Exception { - EnvironmentOverrider.setTestEnvironmentVariables(); + @BeforeAll + public static void setTestEnvironmentVariables() { + System.setProperty(JiraRestClientWrapper.class.getName(), MockedJiraRestClientWrapper.class.getName()); } @Test @@ -33,8 +36,7 @@ public void scanJira() { File file = new File(Objects.requireNonNull(classLoader.getResource("scanner/jira-plugin-configuration.xml")).getFile()); Descriptor descriptor = getScanner().scan(file, "/scanner/jira-plugin-configuration.xml", DefaultScope.NONE); - - assertThat(descriptor, CoreMatchers.instanceOf(JiraServer.class)); + assertThat(descriptor).isInstanceOf(JiraServer.class); JiraServer jiraServer = (JiraServer) descriptor; assertEquals(MockedServerInfo.BASE_URI.toString(), jiraServer.getBaseUri()); diff --git a/src/test/java/org/jqassistant/contrib/plugin/jira/utils/EnvironmentOverrider.java b/src/test/java/org/jqassistant/contrib/plugin/jira/utils/EnvironmentOverrider.java deleted file mode 100644 index 00eb6bc..0000000 --- a/src/test/java/org/jqassistant/contrib/plugin/jira/utils/EnvironmentOverrider.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.jqassistant.contrib.plugin.jira.utils; - -import org.jqassistant.contrib.plugin.jira.jjrc.MockedJiraRestClientWrapper; -import org.jqassistant.contrib.plugin.jira.scanner.GraphBuilder; -import org.jqassistant.contrib.plugin.jira.scanner.ScannerTestIT; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.lang.reflect.Field; -import java.util.Collections; -import java.util.Map; - -import static org.jqassistant.contrib.plugin.jira.scanner.GraphBuilder.TEST_ENV; - -public abstract class EnvironmentOverrider { - - private static final Logger LOGGER = LoggerFactory.getLogger(ScannerTestIT.class); - - public static void setTestEnvironmentVariables() throws Exception { - - LOGGER.info("Overriding environment variables inside JVM to make the Jira plugin use the mocked service."); - - Map environmentVariables = Collections.singletonMap(TEST_ENV, "true"); - setEnvironmentVariables(environmentVariables); - } - public static void setEmptyEnvironmentVariables() throws Exception { - - LOGGER.info("Resetting environment variables inside JVM to make the Jira plugin use the default service."); - - setEnvironmentVariables(Collections.emptyMap()); - } - - /** - * This is a rather hacky approach to make {@link GraphBuilder} use the - * {@link MockedJiraRestClientWrapper} - * instead of the {@link org.jqassistant.contrib.plugin.jira.jjrc.DefaultJiraRestClientWrapper}. - *

- * According to the stackoverflow post this hack does not modify the actual environment but just those in the JVM: - * https://stackoverflow.com/questions/318239/how-do-i-set-environment-variables-from-java - */ - @SuppressWarnings({"unchecked"}) - private static void setEnvironmentVariables(Map environmentVariables ) throws Exception { - - try { - Class processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment"); - Field theEnvironmentField = processEnvironmentClass.getDeclaredField("theEnvironment"); - theEnvironmentField.setAccessible(true); - Map env = (Map) theEnvironmentField.get(null); - env.putAll(environmentVariables); - Field theCaseInsensitiveEnvironmentField = processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment"); - theCaseInsensitiveEnvironmentField.setAccessible(true); - Map cienv = (Map) theCaseInsensitiveEnvironmentField.get(null); - cienv.putAll(environmentVariables); - } catch (NoSuchFieldException e) { - Class[] classes = Collections.class.getDeclaredClasses(); - Map env = System.getenv(); - for (Class cl : classes) { - if ("java.util.Collections$UnmodifiableMap".equals(cl.getName())) { - Field field = cl.getDeclaredField("m"); - field.setAccessible(true); - Object obj = field.get(env); - Map map = (Map) obj; - map.clear(); - map.putAll(environmentVariables); - } - } - } - } -} diff --git a/src/test/java/org/jqassistant/contrib/plugin/jira/utils/TimeConverterTest.java b/src/test/java/org/jqassistant/contrib/plugin/jira/utils/TimeConverterTest.java index 25c80ed..640eae9 100644 --- a/src/test/java/org/jqassistant/contrib/plugin/jira/utils/TimeConverterTest.java +++ b/src/test/java/org/jqassistant/contrib/plugin/jira/utils/TimeConverterTest.java @@ -1,8 +1,8 @@ package org.jqassistant.contrib.plugin.jira.utils; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertNull; public class TimeConverterTest { diff --git a/src/test/resources/jdom/jira-plugin-configuration_without_credentials.xml b/src/test/resources/jdom/jira-plugin-configuration_without_credentials.xml new file mode 100644 index 0000000..1fe8390 --- /dev/null +++ b/src/test/resources/jdom/jira-plugin-configuration_without_credentials.xml @@ -0,0 +1,14 @@ + + + http://localhost:32763 + + + + Project X + + + Project Y + + + + \ No newline at end of file