-
Notifications
You must be signed in to change notification settings - Fork 18
/
AppConfigForTestContainers.scala
113 lines (93 loc) · 3.97 KB
/
AppConfigForTestContainers.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
* Copyright © 2021 - 2024 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors.
* SPDX-License-Identifier: Apache-2.0
*/
package org.knora.webapi.config
import com.typesafe.config.ConfigFactory
import zio.*
import zio.config.*
import zio.config.typesafe.TypesafeConfigProvider
import org.knora.webapi.config.AppConfig.AppConfigurations
import org.knora.webapi.testcontainers.DspIngestTestContainer
import org.knora.webapi.testcontainers.FusekiTestContainer
import org.knora.webapi.testcontainers.SipiTestContainer
/**
* Alters the AppConfig with the TestContainer ports for Fuseki and Sipi.
*/
object AppConfigForTestContainers {
private def alterFusekiAndSipiPort(
oldConfig: AppConfig,
fusekiContainer: FusekiTestContainer,
sipiContainer: SipiTestContainer,
dspIngestContainer: DspIngestTestContainer
): UIO[AppConfig] = {
val newFusekiPort = fusekiContainer.getFirstMappedPort
val newSipiPort = sipiContainer.getFirstMappedPort
val newDspIngestPort = dspIngestContainer.getFirstMappedPort
val alteredFuseki = oldConfig.triplestore.fuseki.copy(port = newFusekiPort)
val alteredTriplestore = oldConfig.triplestore.copy(fuseki = alteredFuseki)
val alteredSipi = oldConfig.sipi.copy(internalPort = newSipiPort)
val alteredDspIngest = oldConfig.dspIngest.copy(baseUrl = s"http://localhost:$newDspIngestPort")
val newConfig: AppConfig =
oldConfig.copy(
allowReloadOverHttp = true,
triplestore = alteredTriplestore,
sipi = alteredSipi,
dspIngest = alteredDspIngest
)
ZIO.succeed(newConfig)
}
private def alterFusekiPort(
oldConfig: AppConfig,
fusekiContainer: FusekiTestContainer
): UIO[AppConfig] = {
val newFusekiPort = fusekiContainer.getFirstMappedPort
val alteredFuseki = oldConfig.triplestore.fuseki.copy(port = newFusekiPort)
val alteredTriplestore = oldConfig.triplestore.copy(fuseki = alteredFuseki)
val newConfig: AppConfig = oldConfig.copy(triplestore = alteredTriplestore)
ZIO.succeed(newConfig)
}
/**
* Reads in the application configuration using ZIO-Config. ZIO-Config is capable of loading
* the Typesafe-Config format. Reads the 'app' configuration from 'application.conf'.
*/
private val source: ConfigProvider =
TypesafeConfigProvider.fromTypesafeConfig(ConfigFactory.load().getConfig("app").resolve)
/**
* Instantiates our config class hierarchy using the data from the 'app' configuration from 'application.conf'.
*/
private val config: UIO[AppConfig] = read(AppConfig.descriptor from source).orDie
/**
* Altered AppConfig with ports from TestContainers for DSP-Ingest, Fuseki and Sipi.
*/
val testcontainers
: ZLayer[DspIngestTestContainer & FusekiTestContainer & SipiTestContainer, Nothing, AppConfigurations] = {
val appConfigLayer = ZLayer {
for {
appConfig <- config
fusekiContainer <- ZIO.service[FusekiTestContainer]
sipiContainer <- ZIO.service[SipiTestContainer]
dspIngestContainer <- ZIO.service[DspIngestTestContainer]
alteredConfig <- alterFusekiAndSipiPort(appConfig, fusekiContainer, sipiContainer, dspIngestContainer)
} yield alteredConfig
}
AppConfig
.projectAppConfigurations(appConfigLayer)
.tap(_ => ZIO.logInfo(">>> AppConfig for Fuseki and Sipi Testcontainers Initialized <<<"))
}
/**
* Altered AppConfig with ports from TestContainers for Fuseki.
*/
val fusekiOnlyTestcontainer: ZLayer[FusekiTestContainer, Nothing, AppConfigurations] = {
val appConfigLayer = ZLayer {
for {
appConfig <- config
fusekiContainer <- ZIO.service[FusekiTestContainer]
alteredConfig <- alterFusekiPort(appConfig, fusekiContainer)
} yield alteredConfig
}
AppConfig
.projectAppConfigurations(appConfigLayer)
.tap(_ => ZIO.logInfo(">>> AppConfig for Fuseki only Testcontainers Initialized <<<"))
}
}