/
CoreSpec.scala
114 lines (98 loc) · 3.58 KB
/
CoreSpec.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
114
/*
* Copyright © 2021 - 2022 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
import akka.actor
import akka.testkit.ImplicitSender
import akka.testkit.TestKitBase
import com.typesafe.scalalogging.Logger
import org.knora.webapi.config.AppConfig
import org.knora.webapi.core.AppRouter
import org.knora.webapi.core.AppServer
import org.knora.webapi.core.TestStartupUtils
import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject
import org.knora.webapi.messages.util.ResponderData
import org.knora.webapi.store.cache.settings.CacheServiceSettings
import org.knora.webapi.util.LogAspect
import org.scalatest.BeforeAndAfterAll
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
import zio._
import zio.logging.backend.SLF4J
import scala.concurrent.ExecutionContext
abstract class CoreSpec
extends AnyWordSpec
with TestKitBase
with TestStartupUtils
with Matchers
with BeforeAndAfterAll
with ImplicitSender {
/**
* The `Environment` that we require to exist at startup.
* Can be overriden in specs that need other implementations.
*/
type Environment = core.LayersTest.DefaultTestEnvironmentWithoutSipi
/**
* The effect layers from which the App is built.
* Can be overriden in specs that need other implementations.
*/
lazy val effectLayers = core.LayersTest.integrationTestsWithFusekiTestcontainers()
/**
* `Bootstrap` will ensure that everything is instantiated when the Runtime is created
* and cleaned up when the Runtime is shutdown.
*/
private val bootstrap: ZLayer[
Any,
Any,
Environment
] = ZLayer.empty ++ Runtime.removeDefaultLoggers ++ SLF4J.slf4j ++ effectLayers
// create a configured runtime
val runtime = Unsafe.unsafe { implicit u =>
Runtime.unsafe
.fromLayer(bootstrap)
}
// An effect for getting stuff out, so that we can pass them
// to some legacy code
private val routerAndConfig = for {
router <- ZIO.service[core.AppRouter]
config <- ZIO.service[AppConfig]
} yield (router, config)
/**
* Create router and config by unsafe running them.
*/
private val (router: AppRouter, config: AppConfig) =
Unsafe.unsafe { implicit u =>
runtime.unsafe
.run(
routerAndConfig
)
.getOrThrowFiberFailure()
}
implicit lazy val system: actor.ActorSystem = router.system
implicit lazy val executionContext: ExecutionContext = system.dispatcher
lazy val rdfDataObjects = List.empty[RdfDataObject]
val log: Logger = Logger(this.getClass())
val appActor = router.ref
// needed by some tests
val appConfig = config
val cacheServiceSettings = new CacheServiceSettings(appConfig)
val responderData = ResponderData(system, appActor, appConfig, cacheServiceSettings)
final override def beforeAll(): Unit =
/* Here we start our app and initialize the repository before each suit runs */
Unsafe.unsafe { implicit u =>
runtime.unsafe
.run(
(for {
_ <- AppServer.testWithoutSipi
_ <- prepareRepository(rdfDataObjects) @@ LogAspect.logSpan("prepare-repo")
} yield ())
)
.getOrThrow()
}
final override def afterAll(): Unit =
/* Stop ZIO runtime and release resources (e.g., running docker containers) */
Unsafe.unsafe { implicit u =>
runtime.unsafe.shutdown()
}
}