From 7abb4a479d433bd301661e9cbb6404f3c70884cc Mon Sep 17 00:00:00 2001 From: Nik Clayton Date: Sat, 25 Jan 2025 15:12:41 +0100 Subject: [PATCH] refactor: Create StatusDao for operations that act on individual statuses TimelineDao contained operations on timelines and statuses which made it large and confusing. Factor out the status-specific operations in to the new StatusDao class to make things more understandable. --- .../java/app/pachli/appstore/CacheUpdater.kt | 14 ++- .../timeline/CachedTimelineRepository.kt | 5 +- .../viewmodel/CachedTimelineRemoteMediator.kt | 4 +- .../CachedTimelineRemoteMediatorTest.kt | 8 +- .../NotificationsRemoteMediator.kt | 4 +- .../notifications/NotificationsRepository.kt | 17 +-- .../app/pachli/core/database/AppDatabase.kt | 2 + .../app/pachli/core/database/dao/StatusDao.kt | 111 ++++++++++++++++++ .../pachli/core/database/dao/TimelineDao.kt | 79 ------------- .../pachli/core/database/di/DatabaseModule.kt | 3 + .../core/database/dao/TimelineDaoTest.kt | 17 +-- .../core/testing/fakes/FakeDatabaseModule.kt | 3 + 12 files changed, 164 insertions(+), 103 deletions(-) create mode 100644 core/database/src/main/kotlin/app/pachli/core/database/dao/StatusDao.kt diff --git a/app/src/main/java/app/pachli/appstore/CacheUpdater.kt b/app/src/main/java/app/pachli/appstore/CacheUpdater.kt index 7beb25d47..3df7107e2 100644 --- a/app/src/main/java/app/pachli/appstore/CacheUpdater.kt +++ b/app/src/main/java/app/pachli/appstore/CacheUpdater.kt @@ -1,6 +1,7 @@ package app.pachli.appstore import app.pachli.core.data.repository.AccountManager +import app.pachli.core.database.dao.StatusDao import app.pachli.core.database.dao.TimelineDao import app.pachli.core.eventhub.BookmarkEvent import app.pachli.core.eventhub.EventHub @@ -21,6 +22,7 @@ class CacheUpdater @Inject constructor( eventHub: EventHub, accountManager: AccountManager, timelineDao: TimelineDao, + statusDao: StatusDao, ) { private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) @@ -30,20 +32,20 @@ class CacheUpdater @Inject constructor( val accountId = accountManager.activeAccount?.id ?: return@collect when (event) { is FavoriteEvent -> - timelineDao.setFavourited(accountId, event.statusId, event.favourite) + statusDao.setFavourited(accountId, event.statusId, event.favourite) is ReblogEvent -> - timelineDao.setReblogged(accountId, event.statusId, event.reblog) + statusDao.setReblogged(accountId, event.statusId, event.reblog) is BookmarkEvent -> - timelineDao.setBookmarked(accountId, event.statusId, event.bookmark) + statusDao.setBookmarked(accountId, event.statusId, event.bookmark) is UnfollowEvent -> timelineDao.removeAllByUser(accountId, event.accountId) is StatusDeletedEvent -> - timelineDao.delete(accountId, event.statusId) + statusDao.delete(accountId, event.statusId) is PollVoteEvent -> { - timelineDao.setVoted(accountId, event.statusId, event.poll) + statusDao.setVoted(accountId, event.statusId, event.poll) } is PinEvent -> - timelineDao.setPinned(accountId, event.statusId, event.pinned) + statusDao.setPinned(accountId, event.statusId, event.pinned) } } } diff --git a/app/src/main/java/app/pachli/components/timeline/CachedTimelineRepository.kt b/app/src/main/java/app/pachli/components/timeline/CachedTimelineRepository.kt index fed369970..3996fe33d 100644 --- a/app/src/main/java/app/pachli/components/timeline/CachedTimelineRepository.kt +++ b/app/src/main/java/app/pachli/components/timeline/CachedTimelineRepository.kt @@ -28,6 +28,7 @@ import app.pachli.components.timeline.viewmodel.CachedTimelineRemoteMediator.Com import app.pachli.core.common.di.ApplicationScope import app.pachli.core.data.model.StatusViewData import app.pachli.core.database.dao.RemoteKeyDao +import app.pachli.core.database.dao.StatusDao import app.pachli.core.database.dao.TimelineDao import app.pachli.core.database.dao.TranslatedStatusDao import app.pachli.core.database.di.TransactionProvider @@ -66,6 +67,7 @@ class CachedTimelineRepository @Inject constructor( val timelineDao: TimelineDao, private val remoteKeyDao: RemoteKeyDao, private val translatedStatusDao: TranslatedStatusDao, + private val statusDao: StatusDao, @ApplicationScope private val externalScope: CoroutineScope, ) : TimelineRepository { private var factory: InvalidatingPagingSourceFactory? = null @@ -97,6 +99,7 @@ class CachedTimelineRepository @Inject constructor( transactionProvider, timelineDao, remoteKeyDao, + statusDao, ), pagingSourceFactory = factory!!, ).flow @@ -152,7 +155,7 @@ class CachedTimelineRepository @Inject constructor( /** Clear the warning (remove the "filtered" setting) for the given status, for the active account */ suspend fun clearStatusWarning(pachliAccountId: Long, statusId: String) = externalScope.launch { - timelineDao.clearWarning(pachliAccountId, statusId) + statusDao.clearWarning(pachliAccountId, statusId) }.join() suspend fun translate(statusViewData: StatusViewData): NetworkResult { diff --git a/app/src/main/java/app/pachli/components/timeline/viewmodel/CachedTimelineRemoteMediator.kt b/app/src/main/java/app/pachli/components/timeline/viewmodel/CachedTimelineRemoteMediator.kt index 520aa8a75..768f846d6 100644 --- a/app/src/main/java/app/pachli/components/timeline/viewmodel/CachedTimelineRemoteMediator.kt +++ b/app/src/main/java/app/pachli/components/timeline/viewmodel/CachedTimelineRemoteMediator.kt @@ -22,6 +22,7 @@ import androidx.paging.LoadType import androidx.paging.PagingState import androidx.paging.RemoteMediator import app.pachli.core.database.dao.RemoteKeyDao +import app.pachli.core.database.dao.StatusDao import app.pachli.core.database.dao.TimelineDao import app.pachli.core.database.di.TransactionProvider import app.pachli.core.database.model.RemoteKeyEntity @@ -48,6 +49,7 @@ class CachedTimelineRemoteMediator( private val transactionProvider: TransactionProvider, private val timelineDao: TimelineDao, private val remoteKeyDao: RemoteKeyDao, + private val statusDao: StatusDao, ) : RemoteMediator() { override suspend fun load( loadType: LoadType, @@ -259,7 +261,7 @@ class CachedTimelineRemoteMediator( } timelineDao.upsertAccounts(accounts.map { TimelineAccountEntity.from(it, pachliAccountId) }) - timelineDao.upsertStatuses(statuses.map { StatusEntity.from(it, pachliAccountId) }) + statusDao.upsertStatuses(statuses.map { StatusEntity.from(it, pachliAccountId) }) } companion object { diff --git a/app/src/test/java/app/pachli/components/timeline/CachedTimelineRemoteMediatorTest.kt b/app/src/test/java/app/pachli/components/timeline/CachedTimelineRemoteMediatorTest.kt index 336eb8307..b96b20f71 100644 --- a/app/src/test/java/app/pachli/components/timeline/CachedTimelineRemoteMediatorTest.kt +++ b/app/src/test/java/app/pachli/components/timeline/CachedTimelineRemoteMediatorTest.kt @@ -103,6 +103,7 @@ class CachedTimelineRemoteMediatorTest { transactionProvider = transactionProvider, timelineDao = db.timelineDao(), remoteKeyDao = db.remoteKeyDao(), + statusDao = db.statusDao(), ) val result = runBlocking { remoteMediator.load(LoadType.REFRESH, state()) } @@ -123,6 +124,7 @@ class CachedTimelineRemoteMediatorTest { transactionProvider = transactionProvider, timelineDao = db.timelineDao(), remoteKeyDao = db.remoteKeyDao(), + statusDao = db.statusDao(), ) val result = runBlocking { remoteMediator.load(LoadType.REFRESH, state()) } @@ -140,6 +142,7 @@ class CachedTimelineRemoteMediatorTest { transactionProvider = transactionProvider, timelineDao = db.timelineDao(), remoteKeyDao = db.remoteKeyDao(), + statusDao = db.statusDao(), ) val state = state( @@ -177,6 +180,7 @@ class CachedTimelineRemoteMediatorTest { transactionProvider = transactionProvider, timelineDao = db.timelineDao(), remoteKeyDao = db.remoteKeyDao(), + statusDao = db.statusDao(), ) val state = state( @@ -228,6 +232,7 @@ class CachedTimelineRemoteMediatorTest { transactionProvider = transactionProvider, timelineDao = db.timelineDao(), remoteKeyDao = db.remoteKeyDao(), + statusDao = db.statusDao(), ) val state = state( @@ -286,6 +291,7 @@ class CachedTimelineRemoteMediatorTest { transactionProvider = transactionProvider, timelineDao = db.timelineDao(), remoteKeyDao = db.remoteKeyDao(), + statusDao = db.statusDao(), ) val state = state( @@ -335,7 +341,7 @@ class CachedTimelineRemoteMediatorTest { statusWithAccount.reblogAccount?.let { account -> timelineDao().insertAccount(account) } - timelineDao().insertStatus(statusWithAccount.status) + statusDao().insertStatus(statusWithAccount.status) } } } diff --git a/core/data/src/main/kotlin/app/pachli/core/data/repository/notifications/NotificationsRemoteMediator.kt b/core/data/src/main/kotlin/app/pachli/core/data/repository/notifications/NotificationsRemoteMediator.kt index 613120c47..85e646159 100644 --- a/core/data/src/main/kotlin/app/pachli/core/data/repository/notifications/NotificationsRemoteMediator.kt +++ b/core/data/src/main/kotlin/app/pachli/core/data/repository/notifications/NotificationsRemoteMediator.kt @@ -24,6 +24,7 @@ import androidx.paging.RemoteMediator import app.pachli.core.data.repository.notifications.NotificationsRepository.Companion.RKE_TIMELINE_ID import app.pachli.core.database.dao.NotificationDao import app.pachli.core.database.dao.RemoteKeyDao +import app.pachli.core.database.dao.StatusDao import app.pachli.core.database.dao.TimelineDao import app.pachli.core.database.di.TransactionProvider import app.pachli.core.database.model.NotificationData @@ -59,6 +60,7 @@ class NotificationsRemoteMediator( private val timelineDao: TimelineDao, private val remoteKeyDao: RemoteKeyDao, private val notificationDao: NotificationDao, + private val statusDao: StatusDao, ) : RemoteMediator() { override suspend fun load(loadType: LoadType, state: PagingState): MediatorResult { @@ -282,7 +284,7 @@ class NotificationsRemoteMediator( // Bulk upsert the discovered items. timelineDao.upsertAccounts(accounts.map { TimelineAccountEntity.from(it, pachliAccountId) }) - timelineDao.upsertStatuses(statuses.map { StatusEntity.from(it, pachliAccountId) }) + statusDao.upsertStatuses(statuses.map { StatusEntity.from(it, pachliAccountId) }) notificationDao.upsertReports(reports.mapNotNull { NotificationReportEntity.from(pachliAccountId, it) }) notificationDao.upsertEvents( severanceEvents.mapNotNull { diff --git a/core/data/src/main/kotlin/app/pachli/core/data/repository/notifications/NotificationsRepository.kt b/core/data/src/main/kotlin/app/pachli/core/data/repository/notifications/NotificationsRepository.kt index 445f63673..38cbb6445 100644 --- a/core/data/src/main/kotlin/app/pachli/core/data/repository/notifications/NotificationsRepository.kt +++ b/core/data/src/main/kotlin/app/pachli/core/data/repository/notifications/NotificationsRepository.kt @@ -28,6 +28,7 @@ import app.pachli.core.common.di.ApplicationScope import app.pachli.core.data.model.StatusViewData import app.pachli.core.database.dao.NotificationDao import app.pachli.core.database.dao.RemoteKeyDao +import app.pachli.core.database.dao.StatusDao import app.pachli.core.database.dao.TimelineDao import app.pachli.core.database.di.TransactionProvider import app.pachli.core.database.model.AccountFilterDecisionUpdate @@ -97,6 +98,7 @@ class NotificationsRepository @Inject constructor( private val timelineDao: TimelineDao, private val notificationDao: NotificationDao, private val remoteKeyDao: RemoteKeyDao, + private val statusDao: StatusDao, private val eventHub: EventHub, ) { private var factory: InvalidatingPagingSourceFactory? = null @@ -126,6 +128,7 @@ class NotificationsRepository @Inject constructor( timelineDao, remoteKeyDao, notificationDao, + statusDao, ), pagingSourceFactory = factory!!, ).flow @@ -262,12 +265,12 @@ class NotificationsRepository @Inject constructor( } } - timelineDao.setBookmarked(pachliAccountId, statusId, bookmarked) + statusDao.setBookmarked(pachliAccountId, statusId, bookmarked) val result = deferred.await() result.onFailure { throwable -> - timelineDao.setBookmarked(pachliAccountId, statusId, !bookmarked) + statusDao.setBookmarked(pachliAccountId, statusId, !bookmarked) return@async Err(StatusActionError.Bookmark(throwable)) } @@ -298,12 +301,12 @@ class NotificationsRepository @Inject constructor( } } - timelineDao.setFavourited(pachliAccountId, statusId, favourited) + statusDao.setFavourited(pachliAccountId, statusId, favourited) val result = deferred.await() result.onFailure { throwable -> - timelineDao.setFavourited(pachliAccountId, statusId, !favourited) + statusDao.setFavourited(pachliAccountId, statusId, !favourited) return@async Err(StatusActionError.Favourite(throwable)) } @@ -334,12 +337,12 @@ class NotificationsRepository @Inject constructor( } } - timelineDao.setReblogged(pachliAccountId, statusId, reblogged) + statusDao.setReblogged(pachliAccountId, statusId, reblogged) val result = deferred.await() result.onFailure { throwable -> - timelineDao.setReblogged(pachliAccountId, statusId, !reblogged) + statusDao.setReblogged(pachliAccountId, statusId, !reblogged) return@async Err(StatusActionError.Reblog(throwable)) } @@ -370,7 +373,7 @@ class NotificationsRepository @Inject constructor( mastodonApi.voteInPoll(pollId, choices) .onSuccess { poll -> - timelineDao.setVoted(pachliAccountId, statusId, poll) + statusDao.setVoted(pachliAccountId, statusId, poll) eventHub.dispatch(PollVoteEvent(statusId, poll)) } .onFailure { throwable -> return@async Err(StatusActionError.VoteInPoll(throwable)) } diff --git a/core/database/src/main/kotlin/app/pachli/core/database/AppDatabase.kt b/core/database/src/main/kotlin/app/pachli/core/database/AppDatabase.kt index c8233199d..15d9957b6 100644 --- a/core/database/src/main/kotlin/app/pachli/core/database/AppDatabase.kt +++ b/core/database/src/main/kotlin/app/pachli/core/database/AppDatabase.kt @@ -42,6 +42,7 @@ import app.pachli.core.database.dao.ListsDao import app.pachli.core.database.dao.LogEntryDao import app.pachli.core.database.dao.NotificationDao import app.pachli.core.database.dao.RemoteKeyDao +import app.pachli.core.database.dao.StatusDao import app.pachli.core.database.dao.TimelineDao import app.pachli.core.database.dao.TranslatedStatusDao import app.pachli.core.database.model.AccountEntity @@ -125,6 +126,7 @@ abstract class AppDatabase : RoomDatabase() { abstract fun announcementsDao(): AnnouncementsDao abstract fun followingAccountDao(): FollowingAccountDao abstract fun notificationDao(): NotificationDao + abstract fun statusDao(): StatusDao @DeleteColumn("TimelineStatusEntity", "expanded") @DeleteColumn("TimelineStatusEntity", "contentCollapsed") diff --git a/core/database/src/main/kotlin/app/pachli/core/database/dao/StatusDao.kt b/core/database/src/main/kotlin/app/pachli/core/database/dao/StatusDao.kt new file mode 100644 index 000000000..2d52fdb0a --- /dev/null +++ b/core/database/src/main/kotlin/app/pachli/core/database/dao/StatusDao.kt @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2025 Pachli Association + * + * This file is a part of Pachli. + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Pachli is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Pachli; if not, + * see . + */ + +package app.pachli.core.database.dao + +import androidx.room.Dao +import androidx.room.Query +import androidx.room.TypeConverters +import androidx.room.Upsert +import app.pachli.core.database.Converters +import app.pachli.core.database.model.StatusEntity +import app.pachli.core.network.model.Poll + +/** + * Operations on individual statuses, irrespective of the timeline they are + * part of. + */ +@Dao +@TypeConverters(Converters::class) +abstract class StatusDao { + @Upsert + abstract suspend fun upsertStatuses(statuses: Collection) + + @Upsert + abstract suspend fun insertStatus(statusEntity: StatusEntity): Long + + @Query( + """ +UPDATE StatusEntity +SET + favourited = :favourited +WHERE timelineUserId = :pachliAccountId AND (serverId = :statusId OR reblogServerId = :statusId) +""", + ) + abstract suspend fun setFavourited(pachliAccountId: Long, statusId: String, favourited: Boolean) + + @Query( + """ +UPDATE StatusEntity +SET + bookmarked = :bookmarked +WHERE timelineUserId = :pachliAccountId AND (serverId = :statusId OR reblogServerId = :statusId) +""", + ) + abstract suspend fun setBookmarked(pachliAccountId: Long, statusId: String, bookmarked: Boolean) + + @Query( + """ +UPDATE StatusEntity +SET + reblogged = :reblogged +WHERE timelineUserId = :pachliAccountId AND (serverId = :statusId OR reblogServerId = :statusId) +""", + ) + abstract suspend fun setReblogged(pachliAccountId: Long, statusId: String, reblogged: Boolean) + + @Query( + """ +DELETE +FROM StatusEntity +WHERE + timelineUserId = :accountId + AND serverId = :statusId +""", + ) + abstract suspend fun delete(accountId: Long, statusId: String) + + @Query( + """ +UPDATE StatusEntity +SET + poll = :poll +WHERE timelineUserId = :accountId AND (serverId = :statusId OR reblogServerId = :statusId) +""", + ) + abstract suspend fun setVoted(accountId: Long, statusId: String, poll: Poll) + + @Query( + """ +UPDATE StatusEntity +SET + pinned = :pinned +WHERE timelineUserId = :accountId AND (serverId = :statusId OR reblogServerId = :statusId) +""", + ) + abstract suspend fun setPinned(accountId: Long, statusId: String, pinned: Boolean) + + @Query( + """ +UPDATE StatusEntity +SET + filtered = NULL +WHERE timelineUserId = :accountId AND (serverId = :statusId OR reblogServerId = :statusId) +""", + ) + abstract suspend fun clearWarning(accountId: Long, statusId: String): Int +} diff --git a/core/database/src/main/kotlin/app/pachli/core/database/dao/TimelineDao.kt b/core/database/src/main/kotlin/app/pachli/core/database/dao/TimelineDao.kt index 9a7b90b0a..1642b2af8 100644 --- a/core/database/src/main/kotlin/app/pachli/core/database/dao/TimelineDao.kt +++ b/core/database/src/main/kotlin/app/pachli/core/database/dao/TimelineDao.kt @@ -31,24 +31,16 @@ import app.pachli.core.database.model.StatusEntity import app.pachli.core.database.model.StatusViewDataEntity import app.pachli.core.database.model.TimelineAccountEntity import app.pachli.core.database.model.TimelineStatusWithAccount -import app.pachli.core.network.model.Poll @Dao @TypeConverters(Converters::class) abstract class TimelineDao { - @Insert(onConflict = REPLACE) abstract suspend fun insertAccount(timelineAccountEntity: TimelineAccountEntity): Long @Upsert abstract suspend fun upsertAccounts(accounts: Collection) - @Upsert - abstract suspend fun upsertStatuses(statuses: Collection) - - @Upsert - abstract suspend fun insertStatus(statusEntity: StatusEntity): Long - @Query( """ SELECT @@ -261,36 +253,6 @@ WHERE timelineUserId = :accountId ) abstract suspend fun deleteRange(accountId: Long, minId: String, maxId: String): Int - @Query( - """ -UPDATE StatusEntity -SET - favourited = :favourited -WHERE timelineUserId = :pachliAccountId AND (serverId = :statusId OR reblogServerId = :statusId) -""", - ) - abstract suspend fun setFavourited(pachliAccountId: Long, statusId: String, favourited: Boolean) - - @Query( - """ -UPDATE StatusEntity -SET - bookmarked = :bookmarked -WHERE timelineUserId = :pachliAccountId AND (serverId = :statusId OR reblogServerId = :statusId) -""", - ) - abstract suspend fun setBookmarked(pachliAccountId: Long, statusId: String, bookmarked: Boolean) - - @Query( - """ -UPDATE StatusEntity -SET - reblogged = :reblogged -WHERE timelineUserId = :pachliAccountId AND (serverId = :statusId OR reblogServerId = :statusId) -""", - ) - abstract suspend fun setReblogged(pachliAccountId: Long, statusId: String, reblogged: Boolean) - @Query( """ DELETE @@ -341,17 +303,6 @@ WHERE timelineUserId = :accountId ) abstract suspend fun removeAllTranslatedStatus(accountId: Long) - @Query( - """ -DELETE -FROM StatusEntity -WHERE - timelineUserId = :accountId - AND serverId = :statusId -""", - ) - abstract suspend fun delete(accountId: Long, statusId: String) - /** * Cleans the StatusEntity and TimelineAccountEntity tables from old entries. * @param accountId id of the account for which to clean tables @@ -481,16 +432,6 @@ WHERE ) abstract suspend fun cleanupTranslatedStatus(accountId: Long, limit: Int) - @Query( - """ -UPDATE StatusEntity -SET - poll = :poll -WHERE timelineUserId = :accountId AND (serverId = :statusId OR reblogServerId = :statusId) -""", - ) - abstract suspend fun setVoted(accountId: Long, statusId: String, poll: Poll) - @Upsert abstract suspend fun upsertStatusViewData(svd: StatusViewDataEntity) @@ -517,16 +458,6 @@ WHERE StatusViewDataEntity, > - @Query( - """ -UPDATE StatusEntity -SET - pinned = :pinned -WHERE timelineUserId = :accountId AND (serverId = :statusId OR reblogServerId = :statusId) -""", - ) - abstract suspend fun setPinned(accountId: Long, statusId: String, pinned: Boolean) - @Query( """ DELETE @@ -542,16 +473,6 @@ WHERE timelineUserId = :accountId AND authorServerId IN ( ) abstract suspend fun deleteAllFromInstance(accountId: Long, instanceDomain: String) - @Query( - """ -UPDATE StatusEntity -SET - filtered = NULL -WHERE timelineUserId = :accountId AND (serverId = :statusId OR reblogServerId = :statusId) -""", - ) - abstract suspend fun clearWarning(accountId: Long, statusId: String): Int - @Query( """ SELECT COUNT(*) diff --git a/core/database/src/main/kotlin/app/pachli/core/database/di/DatabaseModule.kt b/core/database/src/main/kotlin/app/pachli/core/database/di/DatabaseModule.kt index 8eb7e9093..09412d557 100644 --- a/core/database/src/main/kotlin/app/pachli/core/database/di/DatabaseModule.kt +++ b/core/database/src/main/kotlin/app/pachli/core/database/di/DatabaseModule.kt @@ -90,6 +90,9 @@ object DatabaseModule { @Provides fun providesNotificationDao(appDatabase: AppDatabase) = appDatabase.notificationDao() + + @Provides + fun providesStatusDao(appDatabase: AppDatabase) = appDatabase.statusDao() } /** diff --git a/core/database/src/test/kotlin/app/pachli/core/database/dao/TimelineDaoTest.kt b/core/database/src/test/kotlin/app/pachli/core/database/dao/TimelineDaoTest.kt index 258aa6c87..a29287df2 100644 --- a/core/database/src/test/kotlin/app/pachli/core/database/dao/TimelineDaoTest.kt +++ b/core/database/src/test/kotlin/app/pachli/core/database/dao/TimelineDaoTest.kt @@ -54,6 +54,9 @@ class TimelineDaoTest { @Inject lateinit var timelineDao: TimelineDao + @Inject + lateinit var statusDao: StatusDao + @Before fun setup() { hilt.inject() @@ -101,7 +104,7 @@ class TimelineDaoTest { reblogger?.let { timelineDao.insertAccount(it) } - timelineDao.insertStatus(status) + statusDao.insertStatus(status) } val pagingSource = timelineDao.getStatuses(setOne.first.timelineUserId) @@ -131,7 +134,7 @@ class TimelineDaoTest { reblogAuthor?.let { timelineDao.insertAccount(it) } - timelineDao.insertStatus(status) + statusDao.insertStatus(status) } timelineDao.cleanup(accountId = 1, limit = 3) @@ -190,7 +193,7 @@ class TimelineDaoTest { reblogAuthor?.let { timelineDao.insertAccount(it) } - timelineDao.insertStatus(status) + statusDao.insertStatus(status) } // status 2 gets deleted, newly loaded status contain only 1 + 3 @@ -207,7 +210,7 @@ class TimelineDaoTest { reblogAuthor?.let { timelineDao.insertAccount(it) } - timelineDao.insertStatus(status) + statusDao.insertStatus(status) } // make sure status 2 is no longer in db @@ -240,7 +243,7 @@ class TimelineDaoTest { reblogAuthor?.let { timelineDao.insertAccount(it) } - timelineDao.insertStatus(status) + statusDao.insertStatus(status) } assertEquals(3, timelineDao.deleteRange(1, "12", "14")) @@ -314,7 +317,7 @@ class TimelineDaoTest { reblogAuthor?.let { timelineDao.insertAccount(it) } - timelineDao.insertStatus(status) + statusDao.insertStatus(status) } timelineDao.deleteAllFromInstance(1, "mastodon.red") @@ -339,7 +342,7 @@ class TimelineDaoTest { reblogger?.let { timelineDao.insertAccount(it) } - timelineDao.insertStatus(status) + statusDao.insertStatus(status) } val pagingSource = timelineDao.getStatuses(setOne.first.timelineUserId) diff --git a/core/testing/src/main/kotlin/app/pachli/core/testing/fakes/FakeDatabaseModule.kt b/core/testing/src/main/kotlin/app/pachli/core/testing/fakes/FakeDatabaseModule.kt index df34ce0b3..2a310172e 100644 --- a/core/testing/src/main/kotlin/app/pachli/core/testing/fakes/FakeDatabaseModule.kt +++ b/core/testing/src/main/kotlin/app/pachli/core/testing/fakes/FakeDatabaseModule.kt @@ -88,4 +88,7 @@ object FakeDatabaseModule { @Provides fun providesNotificationDao(appDatabase: AppDatabase) = appDatabase.notificationDao() + + @Provides + fun providesStatusDao(appDatabase: AppDatabase) = appDatabase.statusDao() }