Coverage Summary for Class: MonitoringRepositoryImpl (cloud.mindbox.mobile_sdk.monitoring.data.repositories)

Class Method, % Branch, % Line, % Instruction, %
MonitoringRepositoryImpl 33.3% (3/9) 0% (0/4) 34.2% (13/38) 23.8% (58/244)
MonitoringRepositoryImpl$getFirstLog$1
MonitoringRepositoryImpl$getLastLog$1
MonitoringRepositoryImpl$getLogs$1
MonitoringRepositoryImpl$getRequestIds$1 100% (1/1) 75% (3/4) 83.3% (5/6) 84.6% (22/26)
MonitoringRepositoryImpl$getRequestIds$1$1 100% (1/1) 100% (1/1) 100% (2/2)
MonitoringRepositoryImpl$saveLog$1
MonitoringRepositoryImpl$saveRequestId$1 100% (1/1) 100% (1/1) 100% (2/2)
MonitoringRepositoryImpl$sendLogs$1
Total 50% (6/12) 37.5% (3/8) 43.5% (20/46) 30.7% (84/274)


 package cloud.mindbox.mobile_sdk.monitoring.data.repositories
 
 import cloud.mindbox.mobile_sdk.convertToString
 import cloud.mindbox.mobile_sdk.managers.DbManager
 import cloud.mindbox.mobile_sdk.managers.GatewayManager
 import cloud.mindbox.mobile_sdk.monitoring.data.checkers.LogStoringDataCheckerImpl
 import cloud.mindbox.mobile_sdk.monitoring.data.mappers.MonitoringMapper
 import cloud.mindbox.mobile_sdk.monitoring.data.room.dao.MonitoringDao
 import cloud.mindbox.mobile_sdk.monitoring.data.validators.MonitoringValidator
 import cloud.mindbox.mobile_sdk.monitoring.domain.interfaces.LogStoringDataChecker
 import cloud.mindbox.mobile_sdk.monitoring.domain.interfaces.MonitoringRepository
 import cloud.mindbox.mobile_sdk.monitoring.domain.models.LogResponse
 import cloud.mindbox.mobile_sdk.repository.MindboxPreferences
 import cloud.mindbox.mobile_sdk.utils.LoggingExceptionHandler
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
 import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.sync.Mutex
 import kotlinx.coroutines.sync.withLock
 import org.threeten.bp.ZonedDateTime
 
 internal class MonitoringRepositoryImpl(
     private val monitoringDao: MonitoringDao,
     private val monitoringMapper: MonitoringMapper,
     private val gson: Gson,
     private val logStoringDataChecker: LogStoringDataChecker,
     private val monitoringValidator: MonitoringValidator,
     private val gatewayManager: GatewayManager
 ) : MonitoringRepository {
     override suspend fun deleteFirstLog() {
         monitoringDao.deleteFirstLog()
     }
 
     override fun getRequestIds(): HashSet<String> {
         return LoggingExceptionHandler.runCatching(HashSet()) {
             if (MindboxPreferences.logsRequestIds.isBlank()) {
                 HashSet()
             } else {
                 gson.fromJson(
                     MindboxPreferences.logsRequestIds,
                     object : TypeToken<HashSet<String>>() {}.type
                 ) ?: HashSet()
             }
         }
     }
 
     override fun saveRequestId(id: String) {
         val logRequestIds = getRequestIds().apply {
             add(id)
         }
         MindboxPreferences.logsRequestIds =
             gson.toJson(logRequestIds, object : TypeToken<HashSet<String>>() {}.type)
     }
 
     override suspend fun getFirstLog(): LogResponse {
         return monitoringMapper.mapMonitoringEntityToLogResponse(monitoringDao.getFirstLog())
     }
 
     override suspend fun getLastLog(): LogResponse {
         return monitoringMapper.mapMonitoringEntityToLogResponse(monitoringDao.getLastLog())
     }
 
     override suspend fun saveLog(zonedDateTime: ZonedDateTime, message: String) {
         monitoringDao.insertLog(
             monitoringMapper.mapLogInfoToMonitoringEntity(
                 zonedDateTime.convertToString(),
                 message
             )
         )
         if (logStoringDataChecker.isDatabaseMemorySizeExceeded()) {
             LogStoringDataCheckerImpl.needCleanLog.set(true)
             try {
                 Mutex().withLock {
                     if (LogStoringDataCheckerImpl.deletionIsInProgress.get().not()) {
                         LogStoringDataCheckerImpl.deletionIsInProgress.set(true)
                         monitoringDao.deleteFirstTenPercentOfLogs()
                     }
                 }
             } catch (_: Exception) {
             }
         }
     }
 
     override suspend fun getLogs(
         startTime: ZonedDateTime,
         endTime: ZonedDateTime,
     ): List<LogResponse> {
         return monitoringMapper.mapMonitoringEntityListToLogResponseList(
             monitoringDao.getLogs(startTime.convertToString(), endTime.convertToString())
                 .filter { monitoringEntity ->
                     monitoringValidator.validateMonitoring(monitoringEntity)
                 }
         )
     }
 
     override suspend fun sendLogs(
         monitoringStatus: String,
         requestId: String,
         logs: List<LogResponse>,
     ) {
         val configuration = DbManager.listenConfigurations().first()
         gatewayManager.sendLogEvent(
             logs = monitoringMapper.mapMonitoringEntityToLogInfo(
                 monitoringStatus = monitoringStatus,
                 requestId = requestId,
                 monitoringEntityList = logs
             ),
             configuration = configuration
         )
     }
 }