LeoColman
06/06/2021, 12:35 PMdave08
06/06/2021, 12:45 PMenum class KoinLifecycleMode {
Root, Container, Test
}
typealias KoinListener = KoinExtension
class KoinExtension(
private val modules: List<Module>,
private val mockProvider: Provider<*>? = null,
private val mode: KoinLifecycleMode
) : TestListener {
constructor(
module: Module,
mockProvider: Provider<*>? = null,
) : this(listOf(module), mockProvider, KoinLifecycleMode.Test)
constructor(
module: Module,
mockProvider: Provider<*>? = null,
mode: KoinLifecycleMode
) : this(listOf(module), mockProvider, mode)
constructor(
modules: List<Module>,
mockProvider: Provider<*>? = null,
) : this(modules, mockProvider, KoinLifecycleMode.Test)
private fun TestCase.isApplicable() = (mode == KoinLifecycleMode.Root && description.isRootTest())
|| (mode == KoinLifecycleMode.Test && type == TestType.Test)
|| (mode == KoinLifecycleMode.Container && type == TestType.Container)
override suspend fun beforeAny(testCase: TestCase) {
if (testCase.isApplicable()) {
if (KoinPlatformTools.defaultContext().getOrNull() == null)
startKoin {
if (mockProvider != null) MockProvider.register(mockProvider)
modules(modules)
}
}
}
override suspend fun afterAny(testCase: TestCase, result: TestResult) {
if (testCase.isApplicable()) {
if (KoinPlatformTools.defaultContext().getOrNull() != null)
stopKoin()
}
}
}