View test reports →

Coverage Summary for Class: SseRepositoryImpl (dev.skymansandy.wiretap.data.repository)

Class Method, % Branch, % Line, % Instruction, %
SseRepositoryImpl 84.6% (11/13) 50% (2/4) 87.2% (41/47) 91.7% (253/276)
SseRepositoryImpl$clearAll$1
SseRepositoryImpl$clearClosed$1
SseRepositoryImpl$flowAll$$inlined$map$1 0% (0/2)
SseRepositoryImpl$flowAll$$inlined$map$1$2 0% (0/1)
SseRepositoryImpl$flowAll$$inlined$map$1$2$1
SseRepositoryImpl$flowById$$inlined$map$1 0% (0/2)
SseRepositoryImpl$flowById$$inlined$map$1$2 0% (0/1)
SseRepositoryImpl$flowById$$inlined$map$1$2$1
SseRepositoryImpl$flowById$1 100% (1/1) 100% (1/1) 100% (26/26)
SseRepositoryImpl$flowEventsForId$$inlined$map$1 0% (0/2)
SseRepositoryImpl$flowEventsForId$$inlined$map$1$2 0% (0/1)
SseRepositoryImpl$flowEventsForId$$inlined$map$1$2$1
SseRepositoryImpl$getById$1
SseRepositoryImpl$logEvent$1
SseRepositoryImpl$logNew$1
SseRepositoryImpl$markReopened$1
SseRepositoryImpl$update$1
Total 52.2% (12/23) 50% (2/4) 87.5% (42/48) 92.4% (279/302)


 /*
  * Copyright (c) 2026 skymansandy. All rights reserved.
  */
 
 package dev.skymansandy.wiretap.data.repository
 
 import androidx.paging.Pager
 import androidx.paging.PagingData
 import dev.skymansandy.wiretap.data.db.room.dao.SseLogsDao
 import dev.skymansandy.wiretap.data.db.room.entity.SseEventEntity
 import dev.skymansandy.wiretap.data.mappers.toDomain
 import dev.skymansandy.wiretap.data.mappers.toRoomEntity
 import dev.skymansandy.wiretap.domain.model.SseConnection
 import dev.skymansandy.wiretap.domain.model.SseEvent
 import dev.skymansandy.wiretap.domain.repository.SseRepository
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.onStart
 
 internal class SseRepositoryImpl(
     private val sseLogsDao: SseLogsDao,
 ) : SseRepository {
 
     internal val invalidationSignal = MutableSharedFlow<Unit>(extraBufferCapacity = 1)
 
     override fun flowById(id: Long): Flow<SseConnection?> =
         invalidationSignal
             .onStart { emit(Unit) }
             .map { sseLogsDao.getSseLogById(id)?.toDomain() }
 
     override fun flowEventsForId(connectionId: Long): Flow<List<SseEvent>> =
         sseLogsDao.getSseEventsByConnectionId(connectionId)
             .map { entities -> entities.map { it.toDomain() } }
 
     override fun flowAll(): Flow<List<SseConnection>> =
         sseLogsDao.getAllSseLogs()
             .map { entities -> entities.map { it.toDomain() } }
 
     override fun flowForSearchQuery(query: String): Flow<PagingData<SseConnection>> =
         Pager(config = defaultPagingConfig) {
             SseLogPagingSource(
                 roomDao = sseLogsDao,
                 query = query,
                 invalidationSignal = invalidationSignal,
             )
         }.flow
 
     override suspend fun logNew(connection: SseConnection): Long {
         val id = sseLogsDao.insertSseLog(connection.toRoomEntity())
         invalidationSignal.tryEmit(Unit)
         return id
     }
 
     override suspend fun markReopened(connection: SseConnection) {
         sseLogsDao.insertSseLogWithId(connection.toRoomEntity())
         invalidationSignal.tryEmit(Unit)
     }
 
     override suspend fun update(connection: SseConnection) {
         sseLogsDao.updateSseLog(
             status = connection.status.name,
             failureMessage = connection.failureMessage,
             closedAt = connection.closedAt,
             lastEventId = connection.lastEventId,
             retryMs = connection.retryMs,
             id = connection.id,
         )
         invalidationSignal.tryEmit(Unit)
     }
 
     override suspend fun logEvent(event: SseEvent) {
         sseLogsDao.insertSseEvent(
             SseEventEntity(
                 connectionId = event.connectionId,
                 eventType = event.eventType,
                 data = event.data,
                 eventId = event.eventId,
                 retryMs = event.retryMs,
                 byteCount = event.byteCount,
                 timestamp = event.timestamp,
             ),
         )
         sseLogsDao.incrementSseEventCount(event.connectionId)
         invalidationSignal.tryEmit(Unit)
     }
 
     override suspend fun getById(id: Long): SseConnection? =
         sseLogsDao.getSseLogById(id)?.toDomain()
 
     override suspend fun clearAll() {
         sseLogsDao.deleteAllSseEvents()
         sseLogsDao.deleteAllSseLogs()
         invalidationSignal.tryEmit(Unit)
     }
 
     override suspend fun clearClosed() {
         sseLogsDao.deleteClosedSseEvents()
         sseLogsDao.deleteClosedSseLogs()
         invalidationSignal.tryEmit(Unit)
     }
 }