proton-mail-android/app/src/androidTest/java/ch/protonmail/android/mailbox/data/local/UnreadCounterDaoTest.kt

182 lines
5.4 KiB
Kotlin

/*
* Copyright (c) 2022 Proton AG
*
* This file is part of Proton Mail.
*
* Proton Mail 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.
*
* Proton Mail 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 Proton Mail. If not, see https://www.gnu.org/licenses/.
*/
package ch.protonmail.android.mailbox.data.local
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import ch.protonmail.android.data.local.MessageDatabase
import ch.protonmail.android.mailbox.data.local.model.UnreadCounterEntity
import kotlinx.coroutines.flow.first
import me.proton.core.domain.entity.UserId
import me.proton.core.test.android.runBlockingWithTimeout
import org.junit.runner.RunWith
import kotlin.random.Random
import kotlin.test.AfterTest
import kotlin.test.BeforeTest
import kotlin.test.Test
import kotlin.test.assertEquals
@RunWith(AndroidJUnit4::class)
class UnreadCounterDaoTest {
// region Test data
private val oneUserId = UserId("one")
private val twoUserId = UserId("two")
private val inboxLabelId = "inbox"
private val sentLabelId = "sent"
private val oneMessagesInboxCounter = UnreadCounterEntity(
userId = oneUserId,
type = UnreadCounterEntity.Type.MESSAGES,
labelId = inboxLabelId,
unreadCount = Random.nextInt()
)
private val oneMessagesSendCounter = UnreadCounterEntity(
userId = oneUserId,
type = UnreadCounterEntity.Type.MESSAGES,
labelId = sentLabelId,
unreadCount = Random.nextInt()
)
private val oneConversationsInboxCounter = UnreadCounterEntity(
userId = oneUserId,
type = UnreadCounterEntity.Type.CONVERSATIONS,
labelId = inboxLabelId,
unreadCount = Random.nextInt()
)
private val twoMessagesInboxCounter = UnreadCounterEntity(
userId = twoUserId,
type = UnreadCounterEntity.Type.MESSAGES,
labelId = inboxLabelId,
unreadCount = Random.nextInt()
)
// endregion
private lateinit var database: MessageDatabase
private lateinit var dao: UnreadCounterDao
@BeforeTest
fun setup() {
database = MessageDatabase.buildInMemoryDatabase(ApplicationProvider.getApplicationContext())
dao = database.getUnreadCounterDao()
}
@AfterTest
fun tearDown() {
database.close()
}
@Test
fun canInsertAndRetrieveMessagesCounter() = runBlockingWithTimeout {
// given
val input = oneMessagesInboxCounter
// when
dao.insertOrUpdate(input)
val result = dao.observeMessagesUnreadCounters(input.userId)
.first()
// then
assertEquals(listOf(input), result)
}
@Test
fun canInsertAndRetrieveConversationsCounter() = runBlockingWithTimeout {
// given
val input = oneConversationsInboxCounter
// when
dao.insertOrUpdate(input)
val result = dao.observeConversationsUnreadCounters(input.userId)
.first()
// then
assertEquals(listOf(input), result)
}
@Test
fun insertIfDifferentUserId() = runBlockingWithTimeout {
// given
val first = oneMessagesInboxCounter
val second = twoMessagesInboxCounter
// when
dao.insertOrUpdate(first, second)
val firstResult = dao.observeUnreadCounters(first.userId, first.type)
.first()
val secondResult = dao.observeUnreadCounters(second.userId, second.type)
.first()
// then
assertEquals(listOf(first), firstResult)
assertEquals(listOf(second), secondResult)
}
@Test
fun insertIfDifferentType() = runBlockingWithTimeout {
// given
val first = oneMessagesInboxCounter
val second = oneConversationsInboxCounter
// when
dao.insertOrUpdate(first, second)
val firstResult = dao.observeUnreadCounters(first.userId, first.type)
.first()
val secondResult = dao.observeUnreadCounters(second.userId, second.type)
.first()
// then
assertEquals(listOf(first), firstResult)
assertEquals(listOf(second), secondResult)
}
@Test
fun insertIfDifferentLabelId() = runBlockingWithTimeout {
// given
val first = oneMessagesInboxCounter
val second = oneMessagesSendCounter
// when
dao.insertOrUpdate(first, second)
val result = dao.observeUnreadCounters(first.userId, first.type)
.first()
// then
assertEquals(2, result.size)
assert(first in result)
assert(second in result)
}
@Test
fun updateIfSameUserIdTypeAndLabelId() = runBlockingWithTimeout {
// given
val first = oneMessagesInboxCounter
val second = first.copy(unreadCount = 15)
// when
dao.insertOrUpdate(first)
dao.insertOrUpdate(second)
val result = dao.observeUnreadCounters(first.userId, first.type)
.first()
// then
assertEquals(listOf(second), result)
}
}