Update readBy and unreadBy fields during message list fetch (#1452)

This commit is contained in:
Mikołaj Pich 2021-08-29 15:40:28 +02:00 committed by GitHub
parent 2f43b6e552
commit 57d11e825b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 205 additions and 34 deletions

View file

@ -8,19 +8,25 @@ import io.github.wulkanowy.data.db.dao.MessageAttachmentDao
import io.github.wulkanowy.data.db.dao.MessagesDao
import io.github.wulkanowy.data.db.entities.Message
import io.github.wulkanowy.data.db.entities.MessageWithAttachment
import io.github.wulkanowy.data.enums.MessageFolder
import io.github.wulkanowy.getSemesterEntity
import io.github.wulkanowy.getStudentEntity
import io.github.wulkanowy.sdk.Sdk
import io.github.wulkanowy.sdk.pojo.Folder
import io.github.wulkanowy.sdk.pojo.MessageDetails
import io.github.wulkanowy.sdk.pojo.Sender
import io.github.wulkanowy.utils.AutoRefreshHelper
import io.github.wulkanowy.utils.toFirstResult
import io.mockk.MockKAnnotations
import io.mockk.Runs
import io.mockk.checkEquals
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.impl.annotations.SpyK
import io.mockk.just
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.toList
import kotlinx.coroutines.runBlocking
@ -29,6 +35,7 @@ import org.junit.Before
import org.junit.Test
import java.net.UnknownHostException
import java.time.LocalDateTime
import kotlin.test.assertTrue
class MessageRepositoryTest {
@ -52,7 +59,9 @@ class MessageRepositoryTest {
private val student = getStudentEntity()
private lateinit var messageRepository: MessageRepository
private val semester = getSemesterEntity()
private lateinit var repository: MessageRepository
@MockK
private lateinit var moshi: Moshi
@ -62,15 +71,92 @@ class MessageRepositoryTest {
MockKAnnotations.init(this)
every { refreshHelper.isShouldBeRefreshed(any()) } returns false
messageRepository = MessageRepository(messageDb, messageAttachmentDao, sdk, context, refreshHelper, sharedPrefProvider, moshi)
repository = MessageRepository(
messagesDb = messageDb,
messageAttachmentDao = messageAttachmentDao,
sdk = sdk,
context = context,
refreshHelper = refreshHelper,
sharedPrefProvider = sharedPrefProvider,
moshi = moshi,
)
}
@Test
fun `get messages when read by values was changed on already read message`() = runBlocking {
every { messageDb.loadAll(any(), any()) } returns flow {
val dbMessage = getMessageEntity(3, "", false).apply {
unreadBy = 10
readBy = 5
isNotified = true
}
emit(listOf(dbMessage))
}
coEvery { sdk.getMessages(Folder.RECEIVED, any(), any()) } returns listOf(
getMessageDto(messageId = 3, content = "", unread = false).copy(
unreadBy = 5,
readBy = 10,
)
)
coEvery { messageDb.deleteAll(any()) } just Runs
coEvery { messageDb.insertAll(any()) } returns listOf()
repository.getMessages(
student = student,
semester = semester,
folder = MessageFolder.RECEIVED,
forceRefresh = true,
notify = true, // all new messages will be marked as not notified
).toFirstResult().data.orEmpty()
coVerify(exactly = 1) { messageDb.deleteAll(emptyList()) }
coVerify(exactly = 1) { messageDb.insertAll(emptyList()) }
coVerify(exactly = 1) {
messageDb.updateAll(withArg {
assertEquals(1, it.size)
assertEquals(5, it.single().unreadBy)
assertEquals(10, it.single().readBy)
})
}
}
@Test
fun `get messages when fetched completely new message without notify`() = runBlocking {
every { messageDb.loadAll(any(), any()) } returns flowOf(emptyList())
coEvery { sdk.getMessages(Folder.RECEIVED, any(), any()) } returns listOf(
getMessageDto(messageId = 4, content = "Test", unread = true).copy(
unreadBy = 5,
readBy = 10,
)
)
coEvery { messageDb.deleteAll(any()) } just Runs
coEvery { messageDb.insertAll(any()) } returns listOf()
repository.getMessages(
student = student,
semester = semester,
folder = MessageFolder.RECEIVED,
forceRefresh = true,
notify = false,
).toFirstResult().data.orEmpty()
coVerify(exactly = 1) { messageDb.deleteAll(withArg { checkEquals(emptyList<Message>()) }) }
coVerify {
messageDb.insertAll(withArg {
assertEquals(4, it.single().messageId)
assertTrue(it.single().isNotified)
})
}
}
@Test(expected = NoSuchElementException::class)
fun `throw error when message is not in the db`() {
val testMessage = getMessageEntity(1, "", false)
coEvery { messageDb.loadMessageWithAttachment(1, 1) } throws NoSuchElementException("No message in database")
coEvery {
messageDb.loadMessageWithAttachment(1, 1)
} throws NoSuchElementException("No message in database")
runBlocking { messageRepository.getMessage(student, testMessage).toFirstResult() }
runBlocking { repository.getMessage(student, testMessage).toFirstResult() }
}
@Test
@ -78,9 +164,11 @@ class MessageRepositoryTest {
val testMessage = getMessageEntity(123, "Test", false)
val messageWithAttachment = MessageWithAttachment(testMessage, emptyList())
coEvery { messageDb.loadMessageWithAttachment(1, testMessage.messageId) } returns flowOf(messageWithAttachment)
coEvery { messageDb.loadMessageWithAttachment(1, testMessage.messageId) } returns flowOf(
messageWithAttachment
)
val res = runBlocking { messageRepository.getMessage(student, testMessage).toFirstResult() }
val res = runBlocking { repository.getMessage(student, testMessage).toFirstResult() }
assertEquals(null, res.error)
assertEquals(Status.SUCCESS, res.status)
@ -95,12 +183,24 @@ class MessageRepositoryTest {
val mWa = MessageWithAttachment(testMessage, emptyList())
val mWaWithContent = MessageWithAttachment(testMessageWithContent, emptyList())
coEvery { messageDb.loadMessageWithAttachment(1, testMessage.messageId) } returnsMany listOf(flowOf(mWa), flowOf(mWaWithContent))
coEvery { sdk.getMessageDetails(testMessage.messageId, 1, false, testMessage.realId) } returns MessageDetails("Test", emptyList())
coEvery {
messageDb.loadMessageWithAttachment(
1,
testMessage.messageId
)
} returnsMany listOf(flowOf(mWa), flowOf(mWaWithContent))
coEvery {
sdk.getMessageDetails(
messageId = testMessage.messageId,
folderId = 1,
read = false,
id = testMessage.realId
)
} returns MessageDetails("Test", emptyList())
coEvery { messageDb.updateAll(any()) } just Runs
coEvery { messageAttachmentDao.insertAttachments(any()) } returns listOf(1)
val res = runBlocking { messageRepository.getMessage(student, testMessage).toFirstResult() }
val res = runBlocking { repository.getMessage(student, testMessage).toFirstResult() }
assertEquals(null, res.error)
assertEquals(Status.SUCCESS, res.status)
@ -112,18 +212,22 @@ class MessageRepositoryTest {
fun `get message when content in db is empty and there is no internet connection`() {
val testMessage = getMessageEntity(123, "", false)
coEvery { messageDb.loadMessageWithAttachment(1, testMessage.messageId) } throws UnknownHostException()
coEvery {
messageDb.loadMessageWithAttachment(1, testMessage.messageId)
} throws UnknownHostException()
runBlocking { messageRepository.getMessage(student, testMessage).toFirstResult() }
runBlocking { repository.getMessage(student, testMessage).toFirstResult() }
}
@Test(expected = UnknownHostException::class)
fun `get message when content in db is empty, unread and there is no internet connection`() {
val testMessage = getMessageEntity(123, "", true)
coEvery { messageDb.loadMessageWithAttachment(1, testMessage.messageId) } throws UnknownHostException()
coEvery {
messageDb.loadMessageWithAttachment(1, testMessage.messageId)
} throws UnknownHostException()
runBlocking { messageRepository.getMessage(student, testMessage).toList()[1] }
runBlocking { repository.getMessage(student, testMessage).toList()[1] }
}
private fun getMessageEntity(
@ -135,10 +239,10 @@ class MessageRepositoryTest {
realId = 1,
messageId = messageId,
sender = "",
senderId = 1,
recipient = "",
senderId = 0,
recipient = "Wielu adresatów",
subject = "",
date = LocalDateTime.now(),
date = LocalDateTime.MAX,
folderId = 1,
unread = unread,
removed = false,
@ -148,4 +252,24 @@ class MessageRepositoryTest {
unreadBy = 1
readBy = 1
}
private fun getMessageDto(
messageId: Int,
content: String,
unread: Boolean,
) = io.github.wulkanowy.sdk.pojo.Message(
id = 1,
messageId = messageId,
sender = Sender("", "", 0, 0, 0, ""),
recipients = listOf(),
subject = "",
content = content,
date = LocalDateTime.MAX,
folderId = 1,
unread = unread,
unreadBy = 0,
readBy = 0,
removed = false,
hasAttachments = false,
)
}