diff --git a/tofhir-engine/pom.xml b/tofhir-engine/pom.xml index 20527703..b8bc5a48 100644 --- a/tofhir-engine/pom.xml +++ b/tofhir-engine/pom.xml @@ -263,6 +263,12 @@ kafka test + + + org.testcontainers + mongodb + test + org.testcontainers diff --git a/tofhir-engine/src/test/scala/io/tofhir/OnFhirTestContainer.scala b/tofhir-engine/src/test/scala/io/tofhir/OnFhirTestContainer.scala index 1807b321..cdf1011c 100644 --- a/tofhir-engine/src/test/scala/io/tofhir/OnFhirTestContainer.scala +++ b/tofhir-engine/src/test/scala/io/tofhir/OnFhirTestContainer.scala @@ -2,7 +2,7 @@ package io.tofhir import io.onfhir.client.OnFhirNetworkClient import io.tofhir.engine.Execution.actorSystem -import org.testcontainers.containers.GenericContainer +import org.testcontainers.containers.{GenericContainer, MongoDBContainer, Network} import org.testcontainers.containers.wait.strategy.Wait import org.testcontainers.utility.DockerImageName @@ -18,8 +18,19 @@ object OnFhirTestContainer { private val TIMEOUT_SECONDS = 180 // Timeout in seconds for container startup private lazy val container: GenericContainer[_] = { + // initialize a Testcontainers network + val network = Network.newNetwork() + // Start a MongoDB container and attach it to the created network + new MongoDBContainer("mongo:7.0") + .withNetwork(network) + .withNetworkAliases("mongoDB") + .start() + // Create a generic container for onFHIR val container: GenericContainer[Nothing] = new GenericContainer(DockerImageName.parse("srdc/onfhir:r5")).withExposedPorts(ONFHIR_TESTCONTAINER_PORT) - container.addEnv("DB_EMBEDDED", "true") + container.withNetwork(network) // attach the onFHIR container to the same network + container.withNetworkAliases("onFhir") + container.addEnv("DB_EMBEDDED", "false") // disable embedded database + container.addEnv("DB_HOST", s"mongoDB:27017") // connect to MongoDB container.addEnv("SERVER_PORT", ONFHIR_TESTCONTAINER_PORT.toString) container.addEnv("SERVER_BASE_URI", "fhir") container.addEnv("FHIR_ROOT_URL", s"http://${container.getHost}:$ONFHIR_TESTCONTAINER_PORT/fhir") diff --git a/tofhir-server/pom.xml b/tofhir-server/pom.xml index ea87dcf6..a9af0b12 100644 --- a/tofhir-server/pom.xml +++ b/tofhir-server/pom.xml @@ -221,6 +221,12 @@ testcontainers test + + + org.testcontainers + mongodb + test + org.testcontainers junit-jupiter diff --git a/tofhir-server/src/test/scala/io/tofhir/server/BaseEndpointTest.scala b/tofhir-server/src/test/scala/io/tofhir/server/BaseEndpointTest.scala index 5043b999..16000642 100644 --- a/tofhir-server/src/test/scala/io/tofhir/server/BaseEndpointTest.scala +++ b/tofhir-server/src/test/scala/io/tofhir/server/BaseEndpointTest.scala @@ -18,9 +18,10 @@ import org.json4s.jackson.Serialization.writePretty import org.scalatest.BeforeAndAfterAll import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec -import org.testcontainers.containers.GenericContainer +import org.testcontainers.containers.{GenericContainer, MongoDBContainer} import org.testcontainers.containers.wait.strategy.Wait import org.testcontainers.junit.jupiter.Container +import org.testcontainers.containers.Network import org.testcontainers.utility.DockerImageName import java.io.File @@ -36,6 +37,8 @@ trait BaseEndpointTest extends AnyWordSpec with Matchers with ScalatestRouteTest // route endpoint var route: Route = _ + private val ONFHIR_TESTCONTAINER_PORT = 8081 // Port number of the OnFhir instance to be created for testing. + // Instance of OnFhirNetworkClient initialized with onFhir container lazy val onFhirClient: OnFhirNetworkClient = initializeOnFhirClient() @@ -44,11 +47,22 @@ trait BaseEndpointTest extends AnyWordSpec with Matchers with ScalatestRouteTest * */ def initializeOnFhirClient(): OnFhirNetworkClient = { @Container - val container: GenericContainer[Nothing] = new GenericContainer(DockerImageName.parse("srdc/onfhir:r5")).withExposedPorts(8081); - container.addEnv("DB_EMBEDDED", "true"); - container.addEnv("SERVER_PORT", "8081"); - container.addEnv("SERVER_BASE_URI", "fhir"); - container.addEnv("FHIR_ROOT_URL", s"http://${container.getHost}:8081/fhir") + // initialize a Testcontainers network + val network = Network.newNetwork() + // Start a MongoDB container and attach it to the created network + new MongoDBContainer("mongo:7.0") + .withNetwork(network) + .withNetworkAliases("mongoDB") + .start() + // Create a generic container for onFHIR + val container: GenericContainer[Nothing] = new GenericContainer(DockerImageName.parse("srdc/onfhir:r5")).withExposedPorts(ONFHIR_TESTCONTAINER_PORT) + container.withNetwork(network) // attach the onFHIR container to the same network + container.withNetworkAliases("onFhir") + container.addEnv("DB_EMBEDDED", "false") // disable embedded database + container.addEnv("DB_HOST", s"mongoDB:27017") // connect to MongoDB + container.addEnv("SERVER_PORT", ONFHIR_TESTCONTAINER_PORT.toString) + container.addEnv("SERVER_BASE_URI", "fhir") + container.addEnv("FHIR_ROOT_URL", s"http://${container.getHost}:$ONFHIR_TESTCONTAINER_PORT/fhir") // The default startup timeout of 60 seconds is not sufficient for OnFhir, as it utilizes an embedded // MongoDB, which requires additional initialization time. Therefore, we increase the timeout to 3 minutes (180 seconds). container.waitingFor(Wait.forHttp("/fhir/metadata").forStatusCode(200).withStartupTimeout(Duration.ofSeconds(180)))