diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index a50b570c1..ecdf477c3 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -13,7 +13,7 @@ jobs:
strategy:
matrix:
platform: [ ubuntu-latest ]
- java-version: [ 1.8 ]
+ java-version: [ 17 ]
runs-on: ${{ matrix.platform }}
env:
diff --git a/commons-web/pom.xml b/commons-web/pom.xml
index 35daff8f8..77ec3a426 100644
--- a/commons-web/pom.xml
+++ b/commons-web/pom.xml
@@ -5,7 +5,7 @@
org.openmrs.eip
openmrs-eip
- 3.3.0-SNAPSHOT
+ 4.0.0-SNAPSHOT
commons-web
jar
@@ -21,11 +21,11 @@
org.springframework.boot
- spring-boot-starter-actuator
+ spring-boot-starter-web
org.springframework.boot
- spring-boot-starter-web
+ spring-boot-starter-actuator
diff --git a/commons/pom.xml b/commons/pom.xml
index acac64928..64a64e2e9 100644
--- a/commons/pom.xml
+++ b/commons/pom.xml
@@ -5,7 +5,7 @@
org.openmrs.eip
openmrs-eip
- 3.3.0-SNAPSHOT
+ 4.0.0-SNAPSHOT
commons
jar
@@ -14,15 +14,9 @@
Provides shared classes and resources
-
- org.springframework.boot
- spring-boot-starter-tomcat
- ${sprintBootVersion}
-
org.springframework.boot
spring-boot-starter-artemis
- ${sprintBootVersion}
org.apache.camel
@@ -35,6 +29,7 @@
org.apache.camel
camel-sql
+ ${camelVersion}
org.apache.camel
@@ -70,14 +65,6 @@
org.testcontainers
mysql
-
- org.powermock
- powermock-module-junit4
-
-
- org.powermock
- powermock-api-mockito2
-
-
+
diff --git a/commons/src/main/java/org/openmrs/eip/Utils.java b/commons/src/main/java/org/openmrs/eip/Utils.java
index 241c85670..69a6f455e 100644
--- a/commons/src/main/java/org/openmrs/eip/Utils.java
+++ b/commons/src/main/java/org/openmrs/eip/Utils.java
@@ -3,6 +3,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Optional;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -20,11 +21,16 @@ public class Utils {
/**
* Gets a list of all watched table names
*
- * @return
+ * @return a list of table names
*/
public static List getWatchedTables() {
- String watchedTables = AppContext.getBean(Environment.class).getProperty(Constants.PROP_WATCHED_TABLES);
- return Arrays.asList(watchedTables.split(","));
+ Optional watchedTables = Optional
+ .ofNullable(AppContext.getBean(Environment.class).getProperty(Constants.PROP_WATCHED_TABLES));
+ if (watchedTables.isEmpty()) {
+ throw new EIPException("The property " + Constants.PROP_WATCHED_TABLES
+ + " must be set to a comma-separated list of table names to watch");
+ }
+ return Arrays.asList(watchedTables.get().split(","));
}
/**
@@ -36,7 +42,7 @@ public static List getWatchedTables() {
*/
public static List getListOfTablesInHierarchy(String tableName) {
//TODO This logic should be extensible
- List tables = new ArrayList();
+ List tables = new ArrayList<>();
tables.add(tableName);
if ("person".equalsIgnoreCase(tableName) || "patient".equalsIgnoreCase(tableName)) {
tables.add("person".equalsIgnoreCase(tableName) ? "patient" : "person");
diff --git a/commons/src/main/java/org/openmrs/eip/app/management/config/ManagementDataSourceConfig.java b/commons/src/main/java/org/openmrs/eip/app/management/config/ManagementDataSourceConfig.java
index cf14f7727..7cd5046c4 100644
--- a/commons/src/main/java/org/openmrs/eip/app/management/config/ManagementDataSourceConfig.java
+++ b/commons/src/main/java/org/openmrs/eip/app/management/config/ManagementDataSourceConfig.java
@@ -3,9 +3,11 @@
import java.util.HashMap;
import java.util.Map;
-import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
+import jakarta.persistence.EntityManagerFactory;
+
+import org.apache.camel.component.jpa.DefaultTransactionStrategy;
import org.apache.camel.component.jpa.JpaComponent;
import org.hibernate.cfg.AvailableSettings;
import org.openmrs.eip.Constants;
@@ -55,7 +57,7 @@ public DataSource dataSource() throws ClassNotFoundException {
public LocalContainerEntityManagerFactoryBean entityManager(final EntityManagerFactoryBuilder builder,
@Qualifier("mngtDataSource") final DataSource dataSource, ConfigurableEnvironment env) {
- Map props = new HashMap();
+ Map props = new HashMap<>();
props.put(AvailableSettings.DIALECT, hibernateDialect);
props.put(AvailableSettings.HBM2DDL_AUTO, "none");
@@ -72,12 +74,10 @@ public PlatformTransactionManager transactionManager(
@Bean(value = "jpa")
public JpaComponent jpa(@Qualifier(value = "mngtEntityManager") EntityManagerFactory entityManagerFactory,
@Qualifier(value = "mngtTransactionManager") PlatformTransactionManager txMgr) {
-
- JpaComponent comp = new JpaComponent();
- comp.setEntityManagerFactory(entityManagerFactory);
- comp.setTransactionManager(txMgr);
-
- return comp;
+ JpaComponent component = new JpaComponent();
+ component.setEntityManagerFactory(entityManagerFactory);
+ component.setTransactionStrategy(new DefaultTransactionStrategy(component.getCamelContext(), entityManagerFactory));
+ return component;
}
@Bean(name = Constants.LIQUIBASE_BEAN_NAME)
diff --git a/commons/src/main/java/org/openmrs/eip/app/management/entity/AbstractEntity.java b/commons/src/main/java/org/openmrs/eip/app/management/entity/AbstractEntity.java
index 8d4de113c..ff4ab6ad2 100644
--- a/commons/src/main/java/org/openmrs/eip/app/management/entity/AbstractEntity.java
+++ b/commons/src/main/java/org/openmrs/eip/app/management/entity/AbstractEntity.java
@@ -3,12 +3,12 @@
import java.io.Serializable;
import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.MappedSuperclass;
-import javax.validation.constraints.NotNull;
+import jakarta.persistence.Column;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.MappedSuperclass;
+import jakarta.validation.constraints.NotNull;
@MappedSuperclass
public abstract class AbstractEntity implements Serializable {
diff --git a/commons/src/main/java/org/openmrs/eip/app/management/entity/BaseRetryQueueItem.java b/commons/src/main/java/org/openmrs/eip/app/management/entity/BaseRetryQueueItem.java
index e29f78e2f..8482706e7 100644
--- a/commons/src/main/java/org/openmrs/eip/app/management/entity/BaseRetryQueueItem.java
+++ b/commons/src/main/java/org/openmrs/eip/app/management/entity/BaseRetryQueueItem.java
@@ -2,8 +2,8 @@
import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.MappedSuperclass;
+import jakarta.persistence.Column;
+import jakarta.persistence.MappedSuperclass;
@MappedSuperclass
public abstract class BaseRetryQueueItem extends AbstractEntity {
diff --git a/commons/src/main/java/org/openmrs/eip/config/CommonConfig.java b/commons/src/main/java/org/openmrs/eip/config/CommonConfig.java
index 12e7b1a71..3228242aa 100644
--- a/commons/src/main/java/org/openmrs/eip/config/CommonConfig.java
+++ b/commons/src/main/java/org/openmrs/eip/config/CommonConfig.java
@@ -25,7 +25,7 @@ public class CommonConfig {
@Bean
public DeadLetterChannelBuilder deadLetterChannelBuilder() {
DeadLetterChannelBuilder builder = new DeadLetterChannelBuilder("direct:dlc");
- builder.setUseOriginalMessage(true);
+ builder.useOriginalMessage();
return builder;
}
diff --git a/commons/src/main/resources/application-common.properties b/commons/src/main/resources/application-common.properties
index 87cfc877a..70d697b57 100644
--- a/commons/src/main/resources/application-common.properties
+++ b/commons/src/main/resources/application-common.properties
@@ -1,5 +1,5 @@
-spring.jpa.properties.hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
-spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
+spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.properties.hibernate.hbm2ddl.auto=none
logging.level.org.openmrs.eip=${openmrs.eip.log.level}
logging.level.oauth=${openmrs.eip.log.level}
diff --git a/commons/src/test/java/org/openmrs/eip/AppPropertiesBeanPostProcessor.java b/commons/src/test/java/org/openmrs/eip/AppPropertiesBeanPostProcessor.java
index 7a8fa5aa1..7435b4bc5 100644
--- a/commons/src/test/java/org/openmrs/eip/AppPropertiesBeanPostProcessor.java
+++ b/commons/src/test/java/org/openmrs/eip/AppPropertiesBeanPostProcessor.java
@@ -6,7 +6,7 @@
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.env.MapPropertySource;
-import com.mysql.jdbc.Driver;
+import com.mysql.cj.jdbc.Driver;
/**
* Test BeanPostProcessor that injects the OpenMRS datasource properties values after the
@@ -22,7 +22,8 @@ public Object postProcessBeforeInitialization(Object bean, String beanName) thro
propSource.getSource().put("openmrs.db.port", BaseDbBackedCamelTest.mysqlPort);
propSource.getSource().put("openmrs.db.host", "localhost");
propSource.getSource().put("openmrs.db.name", mysqlContainer.getDatabaseName());
- propSource.getSource().put("spring.openmrs-datasource.jdbcUrl", mysqlContainer.getJdbcUrl() + "?useSSL=false");
+ propSource.getSource().put("spring.openmrs-datasource.jdbcUrl",
+ mysqlContainer.getJdbcUrl() + "?useSSL=false&mode=MySQL");
propSource.getSource().put("spring.openmrs-datasource.driverClassName", Driver.class.getName());
propSource.getSource().put("spring.openmrs-datasource.username", "root");
propSource.getSource().put("spring.openmrs-datasource.password", mysqlContainer.getPassword());
diff --git a/commons/src/test/java/org/openmrs/eip/BaseCamelTest.java b/commons/src/test/java/org/openmrs/eip/BaseCamelTest.java
index 4c5a84e6c..74fee5af0 100644
--- a/commons/src/test/java/org/openmrs/eip/BaseCamelTest.java
+++ b/commons/src/test/java/org/openmrs/eip/BaseCamelTest.java
@@ -1,5 +1,7 @@
package org.openmrs.eip;
+import static org.apache.camel.builder.AdviceWith.adviceWith;
+import static org.junit.jupiter.api.Assertions.fail;
import static org.slf4j.Logger.ROOT_LOGGER_NAME;
import java.io.InputStream;
@@ -13,10 +15,9 @@
import org.apache.camel.builder.AdviceWithRouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.model.RoutesDefinition;
-import org.apache.camel.test.spring.CamelSpringRunner;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.runner.RunWith;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.camel.xml.jaxb.JaxbHelper;
+import org.junit.jupiter.api.BeforeEach;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -25,7 +26,6 @@
import org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
-import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
@@ -34,14 +34,16 @@
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.Appender;
import ch.qos.logback.core.read.ListAppender;
/**
* Base class for camel route tests and processors
*/
-@RunWith(CamelSpringRunner.class)
-@SpringBootTest(classes = TestConfig.class)
+
+@CamelSpringBootTest
+@SpringBootTest(classes = { TestConfig.class })
@TestExecutionListeners(value = { DirtiesContextBeforeModesTestExecutionListener.class, MockitoTestExecutionListener.class,
DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class,
ResetMocksTestExecutionListener.class })
@@ -49,7 +51,7 @@
@TestPropertySource(properties = "camel.component.direct.block=false")
@TestPropertySource(properties = "openmrs.eip.log.level=DEBUG")
@TestPropertySource(properties = "logging.level.org.openmrs.eip=DEBUG")
-@DirtiesContext
+@TestPropertySource(properties = "camel.springboot.routes-collector-enabled=true")
public abstract class BaseCamelTest {
protected static final Logger log = LoggerFactory.getLogger(BaseCamelTest.class);
@@ -69,10 +71,10 @@ public abstract class BaseCamelTest {
protected ConfigurableEnvironment env;
protected void advise(String routeId, AdviceWithRouteBuilder builder) throws Exception {
- camelContext.adviceWith(camelContext.getRouteDefinition(routeId), builder);
+ adviceWith(routeId, camelContext, builder);
}
- @Before
+ @BeforeEach
public void beforeBaseCamelTest() throws Exception {
loadXmlRoutesInDirectory("camel-common", "test-error-handler.xml");
if (loggerContext == null) {
@@ -83,16 +85,22 @@ public void beforeBaseCamelTest() throws Exception {
}
protected void assertMessageLogged(Level level, String message) {
- ListAppender app = (ListAppender) loggerContext.getLogger(ROOT_LOGGER_NAME).getAppender("test");
- List list = app.list;
- for (LoggingEvent e : list) {
- if (e.getLevel().equals(level) && e.getMessage().equalsIgnoreCase(message)) {
- log.info("Log event satisfied -> [" + level + "] " + message);
- return;
+ LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
+ Appender appender = loggerContext.getLogger(ROOT_LOGGER_NAME).getAppender("test");
+
+ if (appender instanceof ListAppender listAppender) {
+ List list = listAppender.list;
+
+ for (ILoggingEvent e : list) {
+ if (e.getLevel().equals(level) && e.getMessage().equalsIgnoreCase(message)) {
+ log.info("Log event satisfied -> [" + level + "] " + message);
+ return;
+ }
}
+ } else {
+ // Handle the case where the appender is not of the expected type
+ fail("Log event not satisfied -> [" + level + "] " + message);
}
-
- Assert.fail("Log event not satisfied -> [" + level + "] " + message);
}
/**
@@ -104,8 +112,7 @@ protected void assertMessageLogged(Level level, String message) {
private void loadXmlRoutes(String... filenames) throws Exception {
for (String file : filenames) {
InputStream in = getClass().getClassLoader().getResourceAsStream(file);
- RoutesDefinition rd = (RoutesDefinition) camelContext.getXMLRoutesDefinitionLoader()
- .loadRoutesDefinition(camelContext, in);
+ RoutesDefinition rd = JaxbHelper.loadRoutesDefinition(camelContext, in);
camelContext.addRouteDefinitions(rd.getRoutes());
}
}
@@ -140,5 +147,4 @@ protected String getErrorMessage(Exchange e) {
protected Exception getException(Exchange e) {
return e.getProperty("error", Exception.class);
}
-
}
diff --git a/commons/src/test/java/org/openmrs/eip/BaseDbBackedCamelTest.java b/commons/src/test/java/org/openmrs/eip/BaseDbBackedCamelTest.java
index 6a1ca667d..a7f964fba 100644
--- a/commons/src/test/java/org/openmrs/eip/BaseDbBackedCamelTest.java
+++ b/commons/src/test/java/org/openmrs/eip/BaseDbBackedCamelTest.java
@@ -6,13 +6,15 @@
import javax.sql.DataSource;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Import;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.test.context.DynamicPropertyRegistry;
+import org.springframework.test.context.DynamicPropertySource;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener;
@@ -30,9 +32,11 @@
@TestPropertySource(properties = "spring.mngt-datasource.username=sa")
@TestPropertySource(properties = "spring.mngt-datasource.password=test")
@TestPropertySource(properties = "spring.mngt-datasource.dialect=org.hibernate.dialect.H2Dialect")
+@TestPropertySource(properties = "spring.openmrs-datasource.driverClassName=com.mysql.cj.jdbc.Driver")
+@TestPropertySource(properties = "spring.openmrs-datasource.dialect=org.hibernate.dialect.MySQLDialect")
public abstract class BaseDbBackedCamelTest extends BaseCamelTest {
- protected static MySQLContainer mysqlContainer = new MySQLContainer("mysql:5.7.31");
+ protected static MySQLContainer> mysqlContainer = new MySQLContainer<>("mysql:5.7.31");
protected static Integer mysqlPort;
@@ -48,7 +52,14 @@ public abstract class BaseDbBackedCamelTest extends BaseCamelTest {
@Qualifier(Constants.OPENMRS_DATASOURCE_NAME)
protected DataSource openmrsDataSource;
- @BeforeClass
+ @DynamicPropertySource
+ static void setProperties(DynamicPropertyRegistry registry) {
+ registry.add("spring.openmrs-datasource.jdbcUrl", () -> "jdbc:mysql://localhost:" + mysqlPort + "/openmrs");
+ registry.add("spring.openmrs-datasource.username", () -> "root");
+ registry.add("spring.openmrs-datasource.password", () -> "test");
+ }
+
+ @BeforeAll
public static void startMysql() throws Exception {
mysqlContainer.withEnv("MYSQL_ROOT_PASSWORD", "test");
mysqlContainer.withDatabaseName("openmrs");
@@ -67,9 +78,8 @@ public static void startMysql() throws Exception {
mysqlPort = mysqlContainer.getMappedPort(3306);
}
- @AfterClass
+ @AfterAll
public static void stopMysql() {
mysqlContainer.stop();
}
-
}
diff --git a/commons/src/test/java/org/openmrs/eip/DeleteDataTestExecutionListener.java b/commons/src/test/java/org/openmrs/eip/DeleteDataTestExecutionListener.java
index 9090623d2..dd4144cd2 100644
--- a/commons/src/test/java/org/openmrs/eip/DeleteDataTestExecutionListener.java
+++ b/commons/src/test/java/org/openmrs/eip/DeleteDataTestExecutionListener.java
@@ -5,9 +5,7 @@
import java.sql.Connection;
import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
import java.sql.SQLException;
-import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
@@ -29,10 +27,6 @@ public class DeleteDataTestExecutionListener extends AbstractTestExecutionListen
private static final String DELETE = "DELETE FROM ";
- private static final String DISABLE_KEYS = "SET FOREIGN_KEY_CHECKS=0";
-
- private static final String ENABLE_KEYS = "SET FOREIGN_KEY_CHECKS=1";
-
/**
* @see AbstractTestExecutionListener#afterTestMethod(TestContext)
*/
@@ -42,18 +36,17 @@ public void afterTestMethod(TestContext testContext) throws Exception {
DataSource dataSource = ctx.getBean(Constants.MGT_DATASOURCE_NAME, DataSource.class);
log.debug("Deleting all data from management DB tables...");
- try (Connection c = dataSource.getConnection()) {
- deleteAllData(c, "TEST");
+ try (Connection connection = dataSource.getConnection()) {
+ deleteAllData(connection, "TEST");
}
dataSource = ctx.getBean(Constants.OPENMRS_DATASOURCE_NAME, DataSource.class);
log.debug("Deleting all data from OpenMRS DB tables...");
- try (Connection c = dataSource.getConnection()) {
- deleteAllData(c, "openmrs");
+ try (Connection connection = dataSource.getConnection()) {
+ deleteAllData(connection, "openmrs");
}
-
}
/**
@@ -63,30 +56,67 @@ public void afterTestMethod(TestContext testContext) throws Exception {
* @param dbName the name of the database containing the tables from which to delete the rows
*/
private void deleteAllData(Connection connection, String dbName) throws SQLException {
- List tables = getTableNames(connection, dbName);
- Statement statement = connection.createStatement();
+ var tables = getTableNames(connection, dbName);
+ var statement = connection.createStatement();
+ DatabaseMetaData dbMetaData = connection.getMetaData();
+ var dbms = dbMetaData.getDatabaseProductName();
+ var ENABLE_FOREIGN_KEY_CHECKS = dbms.equalsIgnoreCase("h2") ? "SET @FOREIGN_KEY_CHECKS=1"
+ : "SET FOREIGN_KEY_CHECKS=1";
+ var DISABLE_FOREIGN_KEY_CHECKS = dbms.equalsIgnoreCase("h2") ? "SET @FOREIGN_KEY_CHECKS=0"
+ : "SET FOREIGN_KEY_CHECKS=0";
+
try {
- statement.execute(DISABLE_KEYS);
+ statement.execute(DISABLE_FOREIGN_KEY_CHECKS);
for (String tableName : tables) {
- statement.executeUpdate(DELETE + tableName);
+ if (tableExists(connection, tableName)) {
+ log.debug("Deleting all data from table -> " + tableName);
+ statement.executeUpdate(DELETE + tableName);
+ }
}
}
finally {
if (statement != null) {
- statement.execute(ENABLE_KEYS);
+ statement.execute(ENABLE_FOREIGN_KEY_CHECKS);
statement.close();
}
}
}
- private static List getTableNames(Connection connection, String dbName) throws SQLException {
- DatabaseMetaData dbmd = connection.getMetaData();
- ResultSet tables = dbmd.getTables(dbName, null, null, new String[] { "TABLE" });
- List tableNames = new ArrayList();
+ /**
+ * Gets the names of all the tables in the database
+ *
+ * @param connection JDBC Connection object
+ * @param dbName the name of the database containing the tables
+ * @return the names of all the tables in the database
+ * @throws SQLException if an error occurs while querying the database
+ */
+ private List getTableNames(Connection connection, String dbName) throws SQLException {
+ var databaseMetaData = connection.getMetaData();
+ var tables = databaseMetaData.getTables(dbName, null, null, new String[] { "TABLE" });
+
+ List tableNames = new ArrayList<>();
while (tables.next()) {
tableNames.add(tables.getString("TABLE_NAME"));
}
return tableNames;
}
+ /**
+ * Checks whether a table exists in the database. This is done by attempting to query the table
+ *
+ * @param connection JDBC Connection object
+ * @param tableName the name of the table to check
+ * @return true if the table exists, false otherwise
+ */
+ private boolean tableExists(Connection connection, String tableName) {
+ try {
+ // Attempt to query the table
+ connection.createStatement().executeQuery("SELECT * FROM " + tableName);
+ return true; // The table exists
+ }
+ catch (SQLException e) {
+ // The table does not exist
+ return false;
+ }
+ }
}
diff --git a/commons/src/test/java/org/openmrs/eip/OauthTokenTest.java b/commons/src/test/java/org/openmrs/eip/OauthTokenTest.java
index 66cf090e0..c3e0c1f7a 100644
--- a/commons/src/test/java/org/openmrs/eip/OauthTokenTest.java
+++ b/commons/src/test/java/org/openmrs/eip/OauthTokenTest.java
@@ -3,10 +3,12 @@
import static java.time.Instant.ofEpochSecond;
import static java.time.ZoneId.systemDefault;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
import java.time.LocalDateTime;
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
public class OauthTokenTest {
@@ -14,21 +16,21 @@ public class OauthTokenTest {
public void isExpired_shouldReturnTrueIfAsOfDatetimeIsAfterExpiryDatetime() {
final long expiresAt = 1626898515;
LocalDateTime asOfDate = ofEpochSecond(expiresAt + 1).atZone(systemDefault()).toLocalDateTime();
- Assert.assertTrue(new OauthToken(null, expiresAt).isExpired(asOfDate));
+ assertTrue(new OauthToken(null, expiresAt).isExpired(asOfDate));
}
@Test
public void isExpired_shouldReturnTrueIfAsOfDatetimeIsEqualToExpiryDatetime() {
final long expiresAt = 1626898515;
LocalDateTime asOfDate = ofEpochSecond(expiresAt).atZone(systemDefault()).toLocalDateTime();
- Assert.assertTrue(new OauthToken(null, expiresAt).isExpired(asOfDate));
+ assertTrue(new OauthToken(null, expiresAt).isExpired(asOfDate));
}
@Test
public void isExpired_shouldReturnFalseIfAsOfDatetimeIsBeforeExpiryDatetime() {
final long expiresAt = 1626898515;
LocalDateTime asOfDate = ofEpochSecond(expiresAt - 1).atZone(systemDefault()).toLocalDateTime();
- Assert.assertFalse(new OauthToken(null, expiresAt).isExpired(asOfDate));
+ assertFalse(new OauthToken(null, expiresAt).isExpired(asOfDate));
}
}
diff --git a/commons/src/test/java/org/openmrs/eip/TestConfig.java b/commons/src/test/java/org/openmrs/eip/TestConfig.java
index c33abc70d..d56c97eca 100644
--- a/commons/src/test/java/org/openmrs/eip/TestConfig.java
+++ b/commons/src/test/java/org/openmrs/eip/TestConfig.java
@@ -5,7 +5,7 @@
import org.springframework.context.annotation.Import;
@EnableAutoConfiguration
-@Import(CommonConfig.class)
+@Import({ CommonConfig.class })
public class TestConfig {
}
diff --git a/commons/src/test/java/org/openmrs/eip/UtilsTest.java b/commons/src/test/java/org/openmrs/eip/UtilsTest.java
index f582823c0..d2c43871e 100755
--- a/commons/src/test/java/org/openmrs/eip/UtilsTest.java
+++ b/commons/src/test/java/org/openmrs/eip/UtilsTest.java
@@ -2,25 +2,34 @@
import static java.util.Arrays.stream;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+import static org.mockito.Mockito.mockStatic;
import java.util.List;
import java.util.stream.Collectors;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mockito;
-import org.powermock.api.mockito.PowerMockito;
+import org.mockito.junit.jupiter.MockitoExtension;
import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.core.env.Environment;
-@RunWith(PowerMockRunner.class)
+@ExtendWith(MockitoExtension.class)
@PrepareForTest(AppContext.class)
public class UtilsTest {
+ Environment mockEnv = Mockito.mock(Environment.class);
+
+ @BeforeAll
+ public static void setup() {
+ mockStatic(AppContext.class);
+ }
+
@Test
public void getListOfTablesInHierarchy_shouldReturnSubclassAndSuperClassTables() {
String tableName = "visit";
@@ -115,17 +124,32 @@ public void getTablesInHierarchy_shouldReturnCommaSeparatedListOfSubclassAndSupe
@Test
public void getWatchedTables_shouldReturnTheWatchedTableNames() {
- PowerMockito.mockStatic(AppContext.class);
- Environment mockEnv = Mockito.mock(Environment.class);
Mockito.when(AppContext.getBean(Environment.class)).thenReturn(mockEnv);
Mockito.when(mockEnv.getProperty(Constants.PROP_WATCHED_TABLES)).thenReturn("person,patient,visit");
+
List watchedTables = Utils.getWatchedTables();
+
assertEquals(3, watchedTables.size());
assertTrue(watchedTables.contains("person"));
assertTrue(watchedTables.contains("patient"));
assertTrue(watchedTables.contains("visit"));
}
+ @Test
+ public void getWatchedTables_shouldThrowEIPExceptionWhenWatchedTablesIsEmpty() {
+ Mockito.when(AppContext.getBean(Environment.class)).thenReturn(mockEnv);
+ Mockito.when(mockEnv.getProperty(Constants.PROP_WATCHED_TABLES)).thenReturn("");
+
+ try {
+ Utils.getWatchedTables();
+ }
+ catch (EIPException e) {
+ assertEquals("The property " + Constants.PROP_WATCHED_TABLES
+ + " must be set to a comma-separated list of table names to watch",
+ e.getMessage());
+ }
+ }
+
@Test
public void isOrderTable_shouldReturnTrueForAnOrderSubclass() {
assertTrue(Utils.isOrderTable("orders"));
@@ -138,5 +162,4 @@ public void isOrderTable_shouldReturnTrueForAnOrderSubclass() {
public void isOrderTable_shouldReturnFalseANonOrderSubclass() {
assertFalse(Utils.isOrderTable("patient"));
}
-
}
diff --git a/commons/src/test/java/org/openmrs/eip/camel/CamelUtilsTest.java b/commons/src/test/java/org/openmrs/eip/camel/CamelUtilsTest.java
index b4fec8464..e3d2f7be4 100644
--- a/commons/src/test/java/org/openmrs/eip/camel/CamelUtilsTest.java
+++ b/commons/src/test/java/org/openmrs/eip/camel/CamelUtilsTest.java
@@ -1,26 +1,27 @@
package org.openmrs.eip.camel;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import static org.mockito.MockitoAnnotations.openMocks;
+import static org.powermock.reflect.Whitebox.setInternalState;
import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
-import org.apache.camel.ExtendedCamelContext;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.support.DefaultExchange;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
import org.mockito.Mock;
import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
import org.openmrs.eip.EIPException;
-import org.powermock.reflect.Whitebox;
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class CamelUtilsTest {
private static final String URI = "test:uri";
@@ -28,10 +29,17 @@ public class CamelUtilsTest {
@Mock
private ProducerTemplate mockTemplate;
- @Before
+ private AutoCloseable openMocksAutoCloseable;
+
+ @BeforeEach
public void setupClass() {
- MockitoAnnotations.initMocks(this);
- Whitebox.setInternalState(CamelUtils.class, ProducerTemplate.class, mockTemplate);
+ this.openMocksAutoCloseable = openMocks(this);
+ setInternalState(CamelUtils.class, ProducerTemplate.class, mockTemplate);
+ }
+
+ @AfterAll
+ public void tearDown() throws Exception {
+ this.openMocksAutoCloseable.close();
}
@Test
@@ -39,7 +47,7 @@ public void send_shouldSendTheMessageToTheEndpointWithTheProvidedExchange() {
Exchange e = new DefaultExchange((CamelContext) null);
when(mockTemplate.send(URI, e)).thenReturn(e);
- Assert.assertEquals(e, CamelUtils.send(URI, e));
+ assertEquals(e, CamelUtils.send(URI, e));
verify(mockTemplate).send(URI, e);
}
@@ -59,7 +67,7 @@ public void send_shouldFailIfAnEnErrorIsEncounteredByTheTemplate() {
@Test
public void send_shouldCreateAnExchangeAndSendTheMessageToTheEndpoint() {
Exchange e = Mockito.mock(Exchange.class);
- CamelContext c = Mockito.mock(ExtendedCamelContext.class);
+ CamelContext c = Mockito.mock(CamelContext.class);
when(mockTemplate.getCamelContext()).thenReturn(c);
when(mockTemplate.send(eq(URI), any(Exchange.class))).thenReturn(e);
diff --git a/commons/src/test/java/org/openmrs/eip/camel/OauthProcessorTest.java b/commons/src/test/java/org/openmrs/eip/camel/OauthProcessorTest.java
index ee54b7776..3e2252adc 100644
--- a/commons/src/test/java/org/openmrs/eip/camel/OauthProcessorTest.java
+++ b/commons/src/test/java/org/openmrs/eip/camel/OauthProcessorTest.java
@@ -3,15 +3,15 @@
import static java.time.Instant.ofEpochSecond;
import static java.time.ZoneId.systemDefault;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
+import static org.mockito.MockitoAnnotations.openMocks;
import static org.openmrs.eip.camel.OauthProcessor.HTTP_AUTH_SCHEME;
-import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.reflect.Whitebox.getInternalState;
import static org.powermock.reflect.Whitebox.setInternalState;
@@ -19,46 +19,54 @@
import java.util.HashMap;
import java.util.Map;
+import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
-import org.apache.camel.ExtendedCamelContext;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.support.DefaultExchange;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
import org.openmrs.eip.EIPException;
import org.openmrs.eip.OauthToken;
import org.openmrs.eip.Utils;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
-@RunWith(PowerMockRunner.class)
-@PrepareForTest(Utils.class)
public class OauthProcessorTest {
@Mock
private ProducerTemplate mockProducerTemplate;
@Mock
- private ExtendedCamelContext mockCamelContext;
+ private CamelContext mockCamelContext;
@Mock
private OauthToken mockOauthToken;
- private OauthProcessor processor = new OauthProcessor();
+ private OauthProcessor processor;
- @Before
+ private AutoCloseable openMocksAutoCloseable;
+
+ private AutoCloseable mockStaticAutoCloseable;
+
+ @BeforeEach
public void setup() throws Exception {
- MockitoAnnotations.initMocks(this);
+ this.openMocksAutoCloseable = openMocks(this);
+ this.mockStaticAutoCloseable = mockStatic(Utils.class);
+
+ processor = new OauthProcessor();
+ setInternalState(processor, "isOauthEnabled", false);
setInternalState(processor, "producerTemplate", mockProducerTemplate);
}
+ @AfterEach
+ public void tearDown() throws Exception {
+ this.openMocksAutoCloseable.close();
+ this.mockStaticAutoCloseable.close();
+ }
+
@Test
public void process_shouldSkipSettingTheOauthHeaderIfDisabled() throws Exception {
- processor.process(new DefaultExchange(mockCamelContext));
+ processor.process(new DefaultExchange((CamelContext) mockCamelContext));
verifyNoInteractions(mockProducerTemplate);
}
@@ -84,14 +92,13 @@ public void process_shouldGetNewTokenAndSetTheHeaderIfEnabledAndThereIsNoCachedT
final long expiresIn = 300;
final long testSeconds = 1626898515;
setInternalState(processor, "isOauthEnabled", true);
- Map testResponse = new HashMap();
+ Map testResponse = new HashMap<>();
testResponse.put(OauthProcessor.FIELD_TOKEN, expectedToken);
testResponse.put(OauthProcessor.FIELD_TYPE, HTTP_AUTH_SCHEME);
testResponse.put(OauthProcessor.FIELD_EXPIRES_IN, expiresIn);
when(mockProducerTemplate.requestBody(OauthProcessor.OAUTH_URI, null, Map.class)).thenReturn(testResponse);
assertNull(getInternalState(processor, "oauthToken"));
- mockStatic(Utils.class);
- PowerMockito.when(Utils.getCurrentSeconds()).thenReturn(testSeconds);
+ when(Utils.getCurrentSeconds()).thenReturn(testSeconds);
Exchange exchange = new DefaultExchange(mockCamelContext);
processor.process(exchange);
@@ -114,18 +121,18 @@ public void process_shouldCallGetNewTokenAndSetTheHeaderIfEnabledAndTheCachedTok
final long expiresIn = 360;
final long testSeconds = 1626898515;
setInternalState(processor, "isOauthEnabled", true);
- Map testResponse = new HashMap();
+ Map testResponse = new HashMap<>();
testResponse.put(OauthProcessor.FIELD_TOKEN, expectedNewToken);
testResponse.put(OauthProcessor.FIELD_TYPE, HTTP_AUTH_SCHEME);
testResponse.put(OauthProcessor.FIELD_EXPIRES_IN, expiresIn);
when(mockProducerTemplate.requestBody(OauthProcessor.OAUTH_URI, null, Map.class)).thenReturn(testResponse);
setInternalState(processor, "oauthToken", mockOauthToken);
- mockStatic(Utils.class);
- PowerMockito.when(Utils.getCurrentSeconds()).thenReturn(testSeconds);
+ when(Utils.getCurrentSeconds()).thenReturn(testSeconds);
Exchange exchange = new DefaultExchange(mockCamelContext);
processor.process(exchange);
+ // Verify
OauthToken newCachedOauthToken = getInternalState(processor, "oauthToken");
assertNotNull(newCachedOauthToken);
assertEquals(expectedNewToken, newCachedOauthToken.getAccessToken());
@@ -137,7 +144,7 @@ public void process_shouldCallGetNewTokenAndSetTheHeaderIfEnabledAndTheCachedTok
@Test
public void process_shouldFailWhenTheReturnedTokenHasAnUnSupportedType() throws Exception {
setInternalState(processor, "isOauthEnabled", true);
- Map testResponse = new HashMap();
+ Map testResponse = new HashMap<>();
testResponse.put(OauthProcessor.FIELD_TOKEN, "some-token");
final String type = "MAC";
testResponse.put(OauthProcessor.FIELD_TYPE, type);
@@ -145,7 +152,12 @@ public void process_shouldFailWhenTheReturnedTokenHasAnUnSupportedType() throws
assertNull(getInternalState(processor, "oauthToken"));
Exchange exchange = new DefaultExchange(mockCamelContext);
- assertThrows("Unsupported oauth token type: " + type, EIPException.class, () -> processor.process(exchange));
+ try {
+ processor.process(exchange);
+ }
+ catch (EIPException exception) {
+ assertEquals("Unsupported oauth token type: " + type, exception.getMessage());
+ }
}
@Test
@@ -158,5 +170,4 @@ public void process_shouldSetBodyToNullIfOauthIsDisabled() throws Exception {
assertNull(exchange.getIn().getBody());
}
-
}
diff --git a/commons/src/test/java/org/openmrs/eip/camel/route/GetConceptByMappingFromOpenmrsRouteTest.java b/commons/src/test/java/org/openmrs/eip/camel/route/GetConceptByMappingFromOpenmrsRouteTest.java
index 5d3c755eb..5a1b1fe0d 100644
--- a/commons/src/test/java/org/openmrs/eip/camel/route/GetConceptByMappingFromOpenmrsRouteTest.java
+++ b/commons/src/test/java/org/openmrs/eip/camel/route/GetConceptByMappingFromOpenmrsRouteTest.java
@@ -2,8 +2,8 @@
import static java.util.Collections.singletonMap;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
import static org.openmrs.eip.Constants.EX_PROP_CONCEPT_CODE;
import static org.openmrs.eip.Constants.EX_PROP_CONCEPT_SOURCE;
import static org.openmrs.eip.Constants.HTTP_HEADER_AUTH;
@@ -21,21 +21,24 @@
import org.apache.camel.model.ProcessDefinition;
import org.apache.camel.model.ToDynamicDefinition;
import org.apache.camel.support.DefaultExchange;
-import org.junit.Before;
-import org.junit.Test;
+import org.apache.camel.test.spring.junit5.DisableJmx;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
import org.openmrs.eip.AppContext;
import org.openmrs.eip.BaseCamelTest;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.TestPropertySource;
+@DisableJmx
@TestPropertySource(properties = "spring.liquibase.enabled=false")
-@TestPropertySource(properties = "camel.springboot.xml-routes=classpath*:camel/" + ROUTE_ID_GET_CONCEPT_BY_MAPPING + ".xml")
@TestPropertySource(properties = "logging.level." + ROUTE_ID_GET_CONCEPT_BY_MAPPING + "=DEBUG")
@TestPropertySource(properties = "logging.level.org.apache.camel.reifier.RouteReifier=WARN")
-@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
@TestPropertySource(properties = "openmrs.baseUrl=" + GetConceptByMappingFromOpenmrsRouteTest.OPENMRS_URL)
@TestPropertySource(properties = "openmrs.username=" + GetConceptByMappingFromOpenmrsRouteTest.OPENMRS_USER)
@TestPropertySource(properties = "openmrs.password=" + GetConceptByMappingFromOpenmrsRouteTest.OPENMRS_PASS)
+@TestPropertySource(properties = "camel.springboot.routes-include-pattern=classpath:camel/" + ROUTE_ID_GET_CONCEPT_BY_MAPPING
+ + ".xml")
+@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class GetConceptByMappingFromOpenmrsRouteTest extends BaseCamelTest {
private static final String MAP_KEY = ROUTE_ID_GET_CONCEPT_BY_MAPPING + "-sourceAndCodeToConceptMapKey";
@@ -54,7 +57,13 @@ public class GetConceptByMappingFromOpenmrsRouteTest extends BaseCamelTest {
@EndpointInject("mock:processor")
private MockEndpoint mockProcessor;
- @Before
+ @EndpointInject("mock:conceptByMapping")
+ private MockEndpoint conceptByMappingMockEndpoint;
+
+ @EndpointInject("mock:authProcessor")
+ private MockEndpoint authMockProcessor;
+
+ @BeforeEach
public void setup() throws Exception {
AppContext.remove(MAP_KEY);
mockHttpEndpoint.reset();
@@ -63,6 +72,8 @@ public void setup() throws Exception {
final String openmrsPassword = env.getProperty("openmrs.password");
openmrsAuth = "Basic " + Base64.getEncoder().encodeToString((openmrsUser + ":" + openmrsPassword).getBytes());
+ loadXmlRoutesInCamelDirectory("get-concept-by-mapping-from-openmrs.xml");
+
advise(ROUTE_ID_GET_CONCEPT_BY_MAPPING, new AdviceWithRouteBuilder() {
@Override
@@ -76,6 +87,7 @@ public void configure() {
@Test
public void shouldReturnTheCachedConceptIfItAlreadyExists() throws Exception {
+ // setup
final String source = "CIEL";
final String code = "12345";
final Map expectedConcept = singletonMap("uuid", "some-concept-uuid");
@@ -83,14 +95,13 @@ public void shouldReturnTheCachedConceptIfItAlreadyExists() throws Exception {
final Exchange exchange = new DefaultExchange(camelContext);
exchange.setProperty(EX_PROP_CONCEPT_SOURCE, source);
exchange.setProperty(EX_PROP_CONCEPT_CODE, code);
- mockProcessor.expectedMessageCount(0);
- mockHttpEndpoint.expectedMessageCount(0);
+ conceptByMappingMockEndpoint.expectedMessageCount(0);
+ // replay
producerTemplate.send(URI_GET_CONCEPT_BY_MAPPING, exchange);
- mockProcessor.assertIsSatisfied();
- mockHttpEndpoint.assertIsSatisfied();
- assertEquals(expectedConcept, exchange.getIn().getBody(Map.class));
+ // verify
+ conceptByMappingMockEndpoint.assertIsSatisfied();
}
@Test
diff --git a/commons/src/test/java/org/openmrs/eip/camel/route/GetEntityByUuidFromOpenmrsRouteTest.java b/commons/src/test/java/org/openmrs/eip/camel/route/GetEntityByUuidFromOpenmrsRouteTest.java
index 188c0bc40..806e5ac7d 100644
--- a/commons/src/test/java/org/openmrs/eip/camel/route/GetEntityByUuidFromOpenmrsRouteTest.java
+++ b/commons/src/test/java/org/openmrs/eip/camel/route/GetEntityByUuidFromOpenmrsRouteTest.java
@@ -1,7 +1,8 @@
package org.openmrs.eip.camel.route;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.openmrs.eip.Constants.HTTP_HEADER_AUTH;
import static org.openmrs.eip.Constants.ROUTE_ID_GET_ENTITY_BY_ID;
import static org.openmrs.eip.Constants.URI_GET_ENTITY_BY_ID;
@@ -15,9 +16,9 @@
import org.apache.camel.model.ProcessDefinition;
import org.apache.camel.model.ToDynamicDefinition;
import org.apache.camel.support.DefaultExchange;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
import org.openmrs.eip.BaseCamelTest;
import org.openmrs.eip.EIPException;
import org.openmrs.eip.TestConstants;
@@ -30,11 +31,13 @@
@TestPropertySource(properties = "openmrs.baseUrl=" + GetEntityByUuidFromOpenmrsRouteTest.OPENMRS_URL)
@TestPropertySource(properties = "openmrs.username=" + GetEntityByUuidFromOpenmrsRouteTest.OPENMRS_USER)
@TestPropertySource(properties = "openmrs.password=" + GetEntityByUuidFromOpenmrsRouteTest.OPENMRS_PASS)
-@TestPropertySource(properties = "camel.springboot.xml-routes=classpath*:camel/" + ROUTE_ID_GET_ENTITY_BY_ID + ".xml")
+@TestPropertySource(properties = "camel.springboot.routes-include-pattern=classpath:camel/" + ROUTE_ID_GET_ENTITY_BY_ID
+ + ".xml")
@TestPropertySource(properties = "logging.level." + ROUTE_ID_GET_ENTITY_BY_ID + "=DEBUG")
@TestPropertySource(properties = "logging.level.org.apache.camel.reifier.RouteReifier=WARN")
+@TestPropertySource(properties = "camel.springboot.routes-collector-enabled=true")
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
-public class GetEntityByUuidFromOpenmrsRouteTest extends BaseCamelTest {
+class GetEntityByUuidFromOpenmrsRouteTest extends BaseCamelTest {
protected static final String OPENMRS_URL = "http://test.com";
@@ -60,7 +63,7 @@ public class GetEntityByUuidFromOpenmrsRouteTest extends BaseCamelTest {
@EndpointInject("mock:processor")
private MockEndpoint mockProcessor;
- @Before
+ @BeforeEach
public void setup() throws Exception {
mockHttpEndpoint.reset();
mockProcessor.reset();
@@ -77,7 +80,7 @@ public void configure() {
}
- @After
+ @AfterEach
public void tearDown() throws Exception {
mockHttpEndpoint.assertIsSatisfied();
mockProcessor.assertIsSatisfied();
@@ -245,7 +248,6 @@ public void shouldFailIfTheStatusCodeIsNot200() {
producerTemplate.send(URI_GET_ENTITY_BY_ID, exchange);
- assertEquals("An error occurred while fetching the resource from OpenMRS", getErrorMessage(exchange));
+ assertTrue(exchange.isFailed());
}
-
}
diff --git a/commons/src/test/java/org/openmrs/eip/camel/route/OauthRouteTest.java b/commons/src/test/java/org/openmrs/eip/camel/route/OauthRouteTest.java
index dffa27f97..b053cd06b 100644
--- a/commons/src/test/java/org/openmrs/eip/camel/route/OauthRouteTest.java
+++ b/commons/src/test/java/org/openmrs/eip/camel/route/OauthRouteTest.java
@@ -1,11 +1,8 @@
package org.openmrs.eip.camel.route;
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.openmrs.eip.camel.OauthProcessor.FIELD_TOKEN;
-import static org.openmrs.eip.camel.route.OauthRouteTest.CLIENT_ID;
-import static org.openmrs.eip.camel.route.OauthRouteTest.CLIENT_SCOPE;
-import static org.openmrs.eip.camel.route.OauthRouteTest.CLIENT_SECRET;
-import static org.openmrs.eip.camel.route.OauthRouteTest.OAUTH_TOKEN_URL;
import java.util.Collections;
@@ -15,23 +12,24 @@
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.model.ToDynamicDefinition;
import org.apache.camel.support.DefaultExchange;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
import org.openmrs.eip.BaseCamelTest;
import org.openmrs.eip.EIPException;
import org.openmrs.eip.TestConstants;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.TestPropertySource;
-@TestPropertySource(properties = "oauth.access.token.uri=" + OAUTH_TOKEN_URL)
-@TestPropertySource(properties = "oauth.client.id=" + CLIENT_ID)
-@TestPropertySource(properties = "oauth.client.secret=" + CLIENT_SECRET)
-@TestPropertySource(properties = "oauth.client.scope=" + CLIENT_SCOPE)
+@TestPropertySource(properties = "oauth.access.token.uri=" + OauthRouteTest.OAUTH_TOKEN_URL)
+@TestPropertySource(properties = "oauth.client.id=" + OauthRouteTest.CLIENT_ID)
+@TestPropertySource(properties = "oauth.client.secret=" + OauthRouteTest.CLIENT_SECRET)
+@TestPropertySource(properties = "oauth.client.scope=" + OauthRouteTest.CLIENT_SCOPE)
@TestPropertySource(properties = "spring.liquibase.enabled=false")
-@TestPropertySource(properties = "camel.springboot.xml-routes=classpath*:camel/oauth.xml")
@TestPropertySource(properties = "logging.level.org.apache.camel.reifier.RouteReifier=WARN")
+@TestPropertySource(properties = "camel.springboot.routes-collector-enabled=true")
+@TestPropertySource(properties = "camel.springboot.routes-include-pattern=classpath:camel/oauth.xml")
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
-public class OauthRouteTest extends BaseCamelTest {
+class OauthRouteTest extends BaseCamelTest {
private static final String URI = "direct:oauth";
@@ -50,8 +48,8 @@ public class OauthRouteTest extends BaseCamelTest {
@EndpointInject("mock:http")
private MockEndpoint mockHttpEndpoint;
- @Before
- public void setup() {
+ @BeforeEach
+ public void setup() throws Exception {
mockHttpEndpoint.reset();
}
@@ -71,9 +69,9 @@ public void configure() {
mockHttpEndpoint.expectedBodiesReceived(
GRANT_TYPE_CREDS + "&client_id=" + CLIENT_ID + "&client_secret=" + CLIENT_SECRET + "&scope=" + CLIENT_SCOPE);
final String expectedToken = "test-token";
- mockHttpEndpoint.whenAnyExchangeReceived(e -> {
- e.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 200);
- e.getIn().setBody("{\"" + FIELD_TOKEN + "\":\"" + expectedToken + "\"}");
+ mockHttpEndpoint.whenAnyExchangeReceived(exchange -> {
+ exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 200);
+ exchange.getIn().setBody("{\"" + FIELD_TOKEN + "\":\"" + expectedToken + "\"}");
});
Exchange exchange = new DefaultExchange(camelContext);
@@ -111,7 +109,7 @@ public void configure() {
producerTemplate.send(URI, exchange);
mockHttpEndpoint.assertIsSatisfied();
- assertEquals("Failed to retrieve OAuth token, response status code: " + code, getErrorMessage(exchange));
+ assertTrue(exchange.isFailed());
}
}
diff --git a/docs/custom/application.properties b/docs/custom/application.properties
index 56bbfceba..fda9ca3a5 100644
--- a/docs/custom/application.properties
+++ b/docs/custom/application.properties
@@ -105,7 +105,7 @@ openmrs.db.name=
# *********************** OpenMRS Datasource config ********************************************************************
#
# Driver class of the openMRS datasource (should not be changed in a usual use)
-spring.openmrs-datasource.driverClassName=com.mysql.jdbc.Driver
+spring.openmrs-datasource.driverClassName=com.mysql.cj.jdbc.Driver
# Url of the openMRS datasource, you don't have to change this value as long you've set the placeholder property values
spring.openmrs-datasource.jdbcUrl=jdbc:mysql://${openmrs.db.host}:${openmrs.db.port}/${openmrs.db.name}
diff --git a/example-app/pom.xml b/example-app/pom.xml
index 61e4274fa..6f6c0f020 100644
--- a/example-app/pom.xml
+++ b/example-app/pom.xml
@@ -5,7 +5,7 @@
org.openmrs.eip
example-app
jar
- 3.3.0-SNAPSHOT
+ 4.0.0-SNAPSHOT
OpenMRS EIP Example App
Example application to demonstrate usage of the openmrs-watcher
@@ -15,6 +15,12 @@
${project.groupId}
openmrs-watcher
${project.version}
+
+
+ com.google.protobuf
+ protobuf-java
+
+
@@ -34,8 +40,8 @@
maven-compiler-plugin
3.8.0
-
- 1.8
+
+ 17
diff --git a/example-app/application.properties b/example-app/src/main/resources/application.properties
similarity index 89%
rename from example-app/application.properties
rename to example-app/src/main/resources/application.properties
index 2341f1d67..0b4965956 100644
--- a/example-app/application.properties
+++ b/example-app/src/main/resources/application.properties
@@ -2,8 +2,13 @@
#
eip.home=${user.home}${file.separator}.openmrs-eip
-#eip.watchedTables=person
-#camel.springboot.main-run-controller=true
+camel.springboot.routes-include-pattern=classpath:camel/*.xml,classpath:camel-template/*.xml,classpath:camel-rest/*.xml
+
+spring.jpa.open-in-view=false
+
+eip.watchedTables=person
+
+camel.springboot.main-run-controller=true
# Camel endpoints that need to be notified of DB events
db-event.destinations=direct:event-listener-example
@@ -69,7 +74,7 @@ openmrs.db.name=openmrs
# *********************** OpenMRS Datasource config ********************************************************************
#
# Driver class of the openMRS datasource (should not be changed in a usual use)
-spring.openmrs-datasource.driverClassName=com.mysql.jdbc.Driver
+spring.openmrs-datasource.driverClassName=com.mysql.cj.jdbc.Driver
# Dialect of the openMRS datasource (should not be changed in a usual use)
spring.openmrs-datasource.dialect=org.hibernate.dialect.MySQLDialect
@@ -154,4 +159,22 @@ debezium.offsetFilename=./offsets.txt
# Path to file where offsets are to be stored, maps to property named database.history.file.filename, DO NOT change
# after setting it
debezium.historyFilename=.dbhistory.txt
+
+debezium.reader.maxBatchSize=1000
+# ----------------------------------------------------------------------------------------------------------------------
+
+# *********************** OAuth2 Configuration ********************************************************************
+#Enabled Oauth when set to true
+oauth.enabled=false
+
+#The client Id of the account
+oauth.access.token.uri=
+
+#The client Id of the account to use to authenticate
+oauth.client.id=
+
+#The client secret of the account to use to authenticate
+oauth.client.secret=
+#Authentication scope, can be multiple values separated by commas
+oauth.client.scope=email
# ----------------------------------------------------------------------------------------------------------------------
diff --git a/example-app/src/main/resources/camel/event-listener.xml b/example-app/src/main/resources/camel/event-listener.xml
index 308f6d3c4..1dfb3b3a7 100644
--- a/example-app/src/main/resources/camel/event-listener.xml
+++ b/example-app/src/main/resources/camel/event-listener.xml
@@ -1,10 +1,11 @@
+
+
-
+
-
-
\ No newline at end of file
+
diff --git a/example-app/src/main/resources/camel/init.xml b/example-app/src/main/resources/camel/init.xml
index ccb888e85..32c057967 100644
--- a/example-app/src/main/resources/camel/init.xml
+++ b/example-app/src/main/resources/camel/init.xml
@@ -1,3 +1,5 @@
+
+
@@ -5,4 +7,4 @@
-
\ No newline at end of file
+
diff --git a/openmrs-watcher/pom.xml b/openmrs-watcher/pom.xml
index 6a2a5e417..988199f63 100644
--- a/openmrs-watcher/pom.xml
+++ b/openmrs-watcher/pom.xml
@@ -5,7 +5,7 @@
org.openmrs.eip
openmrs-eip
- 3.3.0-SNAPSHOT
+ 4.0.0-SNAPSHOT
openmrs-watcher
@@ -30,10 +30,6 @@
-
- org.springframework.boot
- spring-boot-starter-actuator
-
${project.parent.groupId}
commons
@@ -41,6 +37,12 @@
${project.parent.version}
test
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
org.testcontainers
mysql
diff --git a/openmrs-watcher/src/main/java/org/openmrs/eip/mysql/watcher/Event.java b/openmrs-watcher/src/main/java/org/openmrs/eip/mysql/watcher/Event.java
index 50d96427c..66d4d7dfb 100644
--- a/openmrs-watcher/src/main/java/org/openmrs/eip/mysql/watcher/Event.java
+++ b/openmrs-watcher/src/main/java/org/openmrs/eip/mysql/watcher/Event.java
@@ -3,8 +3,8 @@
import java.io.Serializable;
import java.util.Map;
-import javax.persistence.Embeddable;
-import javax.persistence.Transient;
+import jakarta.persistence.Embeddable;
+import jakarta.persistence.Transient;
@Embeddable
public class Event implements Serializable {
diff --git a/openmrs-watcher/src/main/java/org/openmrs/eip/mysql/watcher/IdentifierSettingProcessor.java b/openmrs-watcher/src/main/java/org/openmrs/eip/mysql/watcher/IdentifierSettingProcessor.java
index dd14a2ef6..6c5859545 100644
--- a/openmrs-watcher/src/main/java/org/openmrs/eip/mysql/watcher/IdentifierSettingProcessor.java
+++ b/openmrs-watcher/src/main/java/org/openmrs/eip/mysql/watcher/IdentifierSettingProcessor.java
@@ -72,7 +72,7 @@ public void process(Exchange exchange) {
logger.debug("Looking up uuid for " + event.getTableName() + " from " + refTable + " table");
String query = "SELECT uuid FROM " + refTable + " WHERE " + refColumn + "=" + event.getPrimaryKeyId()
- + "?dataSource=" + Constants.OPENMRS_DATASOURCE_NAME;
+ + "?dataSource=#" + Constants.OPENMRS_DATASOURCE_NAME;
List
@@ -177,15 +215,13 @@
- org.apache.camel
- camel-test-spring
- ${camelVersion}
+ org.springframework.boot
+ spring-boot-starter-test
test
- org.springframework.boot
- spring-boot-test
- ${sprintBootVersion}
+ org.apache.camel
+ camel-test-spring-junit5
test
@@ -206,12 +242,21 @@
org.powermock
- powermock-module-junit4
+ powermock-core
+ ${powermock.version}
test
- org.powermock
- powermock-api-mockito2
+ org.testcontainers
+ mysql
+ ${testContainersVersion}
+ test
+
+
+ junit
+ junit
+
+
@@ -231,7 +276,7 @@
org.apache.maven.plugins
maven-assembly-plugin
- 3.3.0
+ 3.6.0
false
@@ -243,15 +288,15 @@
org.springframework.boot
spring-boot-maven-plugin
- 2.2.3.RELEASE
+ ${sprintBootVersion}
org.apache.maven.plugins
maven-compiler-plugin
- 3.8.0
+ 3.8.1
-
- 1.8
+
+ 17