99package no .ndla .scalatestsuite
1010
1111import com .zaxxer .hikari .HikariConfig
12+ import io .circe .Codec
13+ import io .circe .generic .semiauto .deriveCodec
1214import no .ndla .common .configuration .BaseProps
1315import no .ndla .database .{DataSource , DatabaseProps }
1416
1517import java .sql .DriverManager
1618import scala .util .Try
1719import sys .env
1820
19- trait DatabaseIntegrationSuite extends UnitTestSuite with ContainerSuite {
21+ trait DatabaseIntegrationSuite extends UnitTestSuite {
22+ case class PgConnectionInfo (host : String , port : Int , username : String , password : String , databaseName : String )
23+
2024 lazy val props : BaseProps & DatabaseProps
2125
2226 val PostgresqlVersion : String = " 17.5"
@@ -26,74 +30,38 @@ trait DatabaseIntegrationSuite extends UnitTestSuite with ContainerSuite {
2630 private val defaultDatabaseName : String = " postgres"
2731 private val defaultPassword : String = " hemmelig"
2832
29- private var standalonePgContainer : Option [PgContainer ] = None
30-
31- case class PgConnectionInfo (host : String , port : Int , username : String , password : String , databaseName : String )
33+ private given Codec [PgConnectionInfo ] = deriveCodec
34+
35+ protected object postgresContainer extends ContainerIntegrationSuiteBase [PgContainer , PgConnectionInfo ] {
36+ override protected val containerName : String = " postgres"
37+
38+ override protected def createContainer (): PgContainer =
39+ PgContainer (PostgresqlVersion , defaultUsername, defaultPassword, defaultDatabaseName)
40+
41+ override protected def fromContainer (c : PgContainer ): PgConnectionInfo = PgConnectionInfo (
42+ host = c.getHost,
43+ port = c.getMappedPort(5432 ).intValue(),
44+ username = c.getUsername,
45+ password = c.getPassword,
46+ databaseName = c.getDatabaseName,
47+ )
48+
49+ override protected def fromEnv (): PgConnectionInfo = PgConnectionInfo (
50+ host = env.getOrElse(" META_SERVER" , " localhost" ),
51+ port = env.getOrElse(" META_PORT" , " 5432" ).toInt,
52+ username = env.getOrElse(" META_USERNAME" , defaultUsername),
53+ password = env.getOrElse(" META_PASSWORD" , defaultPassword),
54+ databaseName = env.getOrElse(" META_RESOURCE" , defaultDatabaseName),
55+ )
56+
57+ override protected def healthCheck (info : PgConnectionInfo ): Boolean = Try {
58+ val url = s " jdbc:postgresql:// ${info.host}: ${info.port}/ ${info.databaseName}"
59+ val conn = DriverManager .getConnection(url, info.username, info.password)
60+ conn.close()
61+ }.isSuccess
62+ }
3263
33- private def startPgContainer (): PgContainer =
34- PgContainer (PostgresqlVersion , defaultUsername, defaultPassword, defaultDatabaseName)
35-
36- val pgConnectionInfo : Try [PgConnectionInfo ] =
37- if (skipContainerSpawn) {
38- Try {
39- PgConnectionInfo (
40- host = env.getOrElse(" META_SERVER" , " localhost" ),
41- port = env.getOrElse(" META_PORT" , " 5432" ).toInt,
42- username = env.getOrElse(" META_USERNAME" , defaultUsername),
43- password = env.getOrElse(" META_PASSWORD" , defaultPassword),
44- databaseName = env.getOrElse(" META_RESOURCE" , defaultDatabaseName),
45- )
46- }
47- } else if (disableSharedContainers) {
48- Try {
49- val c = startPgContainer()
50- c.start()
51- standalonePgContainer = Some (c)
52- PgConnectionInfo (
53- host = c.getHost,
54- port = c.getMappedPort(5432 ),
55- username = c.getUsername,
56- password = c.getPassword,
57- databaseName = c.getDatabaseName,
58- )
59- }
60- } else {
61- Try {
62- val info = SharedContainer .acquire(
63- name = " postgres" ,
64- healthCheckPort = 5432 ,
65- healthCheck = info => {
66- Try {
67- val url = s " jdbc:postgresql:// ${info.data(" host" )}: ${info.data(" port" )}/ ${info.data(" databaseName" )}"
68- val conn = DriverManager .getConnection(url, info.data(" username" ), info.data(" password" ))
69- conn.close()
70- }.isSuccess
71- },
72- startContainer = () => {
73- val c = startPgContainer()
74- c.withReuse(true ): Unit
75- c.start()
76- SharedContainerInfo (
77- containerId = c.getContainerId,
78- data = Map (
79- " host" -> c.getHost,
80- " port" -> c.getMappedPort(5432 ).toString,
81- " username" -> c.getUsername,
82- " password" -> c.getPassword,
83- " databaseName" -> c.getDatabaseName,
84- ),
85- )
86- },
87- )
88- PgConnectionInfo (
89- host = info.data(" host" ),
90- port = info.data(" port" ).toInt,
91- username = info.data(" username" ),
92- password = info.data(" password" ),
93- databaseName = info.data(" databaseName" ),
94- )
95- }
96- }
64+ lazy val pgConnectionInfo : Try [PgConnectionInfo ] = postgresContainer.output
9765
9866 def testDataSource : Try [DataSource ] = pgConnectionInfo.flatMap(pgc =>
9967 Try {
@@ -143,8 +111,6 @@ trait DatabaseIntegrationSuite extends UnitTestSuite with ContainerSuite {
143111 override def afterAll (): Unit = {
144112 super .afterAll()
145113 restoreDatabaseEnv()
146- if (! skipContainerSpawn && disableSharedContainers) {
147- standalonePgContainer.foreach(_.stop())
148- }
114+ postgresContainer.close()
149115 }
150116}
0 commit comments