Coverage Summary for Class: AppVersionGateImpl (com.georgeci.moneysurfer.data.repository)

Class Method, % Branch, % Line, % Instruction, %
AppVersionGateImpl 100% (4/4) 93.8% (15/16) 100% (22/22) 100% (104/104)
AppVersionGateImpl$refresh$1
Total 100% (4/4) 93.8% (15/16) 100% (22/22) 100% (104/104)


 package com.georgeci.moneysurfer.data.repository
 
 import com.georgeci.moneysurfer.domain.AppInfo
 import com.georgeci.moneysurfer.domain.model.AppVersionStatus
 import com.georgeci.moneysurfer.domain.model.RemoteAppConfig
 import com.georgeci.moneysurfer.domain.repositories.AppConfigRepository
 import com.georgeci.moneysurfer.domain.repositories.AppVersionGate
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.asStateFlow
 import org.koin.core.annotation.Single
 
 private const val DEFAULT_UNSUPPORTED_MESSAGE: String =
     "This app version is no longer supported. Please update."
 
 @Single(binds = [AppVersionGate::class])
 class AppVersionGateImpl(
     private val appConfigRepository: AppConfigRepository,
     private val appInfo: AppInfo,
 ) : AppVersionGate {
 
     private val _status = MutableStateFlow<AppVersionStatus?>(null)
     override val status: StateFlow<AppVersionStatus?> = _status.asStateFlow()
 
     override suspend fun refresh(): AppVersionStatus {
         val config = appConfigRepository.fetch()
         val resolved = if (config == null) AppVersionStatus.Supported else evaluate(config)
         _status.value = resolved
         return resolved
     }
 
     override fun isSyncAllowed(): Boolean = when (status.value) {
         null,
         AppVersionStatus.Supported,
         is AppVersionStatus.UpdateAvailable,
         -> true
         is AppVersionStatus.Unsupported -> false
     }
 
     private fun evaluate(config: RemoteAppConfig): AppVersionStatus = when {
         appInfo.versionCode < config.minSupportedAppVersionCode || config.forceUpdate ->
             AppVersionStatus.Unsupported(
                 message = config.message ?: DEFAULT_UNSUPPORTED_MESSAGE,
             )
         appInfo.versionCode < config.latestAppVersionCode ->
             AppVersionStatus.UpdateAvailable(message = config.message)
         else -> AppVersionStatus.Supported
     }
 }