Add tests
This commit is contained in:
parent
b634db1772
commit
72e7d92571
3 changed files with 100 additions and 12 deletions
|
|
@ -23,7 +23,13 @@ import com.google.common.truth.Truth
|
||||||
import io.element.android.features.preferences.impl.notifications.edit.EditDefaultNotificationSettingPresenter
|
import io.element.android.features.preferences.impl.notifications.edit.EditDefaultNotificationSettingPresenter
|
||||||
import io.element.android.features.preferences.impl.notifications.edit.EditDefaultNotificationSettingStateEvents
|
import io.element.android.features.preferences.impl.notifications.edit.EditDefaultNotificationSettingStateEvents
|
||||||
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
|
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
|
||||||
|
import io.element.android.libraries.matrix.api.roomlist.RoomSummary
|
||||||
|
import io.element.android.libraries.matrix.test.A_ROOM_ID
|
||||||
|
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
||||||
import io.element.android.libraries.matrix.test.notificationsettings.FakeNotificationSettingsService
|
import io.element.android.libraries.matrix.test.notificationsettings.FakeNotificationSettingsService
|
||||||
|
import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
|
||||||
|
import io.element.android.libraries.matrix.test.room.aRoomSummaryDetail
|
||||||
|
import io.element.android.libraries.matrix.test.roomlist.FakeRoomListService
|
||||||
import io.element.android.tests.testutils.consumeItemsUntilPredicate
|
import io.element.android.tests.testutils.consumeItemsUntilPredicate
|
||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
@ -32,7 +38,7 @@ class EditDefaultNotificationSettingsPresenterTests {
|
||||||
@Test
|
@Test
|
||||||
fun `present - ensures initial state is correct`() = runTest {
|
fun `present - ensures initial state is correct`() = runTest {
|
||||||
val notificationSettingsService = FakeNotificationSettingsService()
|
val notificationSettingsService = FakeNotificationSettingsService()
|
||||||
val presenter = EditDefaultNotificationSettingPresenter(notificationSettingsService = notificationSettingsService, isOneToOne = false)
|
val presenter = createPresenter(notificationSettingsService)
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
presenter.present()
|
presenter.present()
|
||||||
}.test {
|
}.test {
|
||||||
|
|
@ -47,10 +53,32 @@ class EditDefaultNotificationSettingsPresenterTests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `present - ensure list of rooms with user defined mode`() = runTest {
|
||||||
|
val room = FakeMatrixRoom()
|
||||||
|
val notificationSettingsService = FakeNotificationSettingsService(
|
||||||
|
initialRoomMode = RoomNotificationMode.ALL_MESSAGES,
|
||||||
|
initialRoomModeIsDefault = false
|
||||||
|
)
|
||||||
|
val matrixClient = FakeMatrixClient(notificationSettingsService = notificationSettingsService).apply {
|
||||||
|
givenGetRoomResult(A_ROOM_ID, room)
|
||||||
|
}
|
||||||
|
val roomListService = FakeRoomListService()
|
||||||
|
val presenter = createPresenter(notificationSettingsService, roomListService, matrixClient)
|
||||||
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
|
presenter.present()
|
||||||
|
}.test {
|
||||||
|
roomListService.postAllRooms(listOf(RoomSummary.Filled(aRoomSummaryDetail(notificationMode = RoomNotificationMode.ALL_MESSAGES))))
|
||||||
|
val loadedState = consumeItemsUntilPredicate { state ->
|
||||||
|
state.roomsWithUserDefinedMode.any { it.details.notificationMode == RoomNotificationMode.ALL_MESSAGES }
|
||||||
|
}.last()
|
||||||
|
Truth.assertThat(loadedState.roomsWithUserDefinedMode.any { it.details.notificationMode == RoomNotificationMode.ALL_MESSAGES }).isTrue()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `present - edit default notification setting`() = runTest {
|
fun `present - edit default notification setting`() = runTest {
|
||||||
val notificationSettingsService = FakeNotificationSettingsService()
|
val presenter = createPresenter()
|
||||||
val presenter = EditDefaultNotificationSettingPresenter(notificationSettingsService = notificationSettingsService, isOneToOne = false)
|
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
presenter.present()
|
presenter.present()
|
||||||
}.test {
|
}.test {
|
||||||
|
|
@ -61,4 +89,18 @@ class EditDefaultNotificationSettingsPresenterTests {
|
||||||
Truth.assertThat(loadedState.mode).isEqualTo(RoomNotificationMode.ALL_MESSAGES)
|
Truth.assertThat(loadedState.mode).isEqualTo(RoomNotificationMode.ALL_MESSAGES)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun createPresenter(
|
||||||
|
notificationSettingsService: FakeNotificationSettingsService = FakeNotificationSettingsService(),
|
||||||
|
roomListService: FakeRoomListService = FakeRoomListService(),
|
||||||
|
matrixClient: FakeMatrixClient = FakeMatrixClient(notificationSettingsService = notificationSettingsService)
|
||||||
|
): EditDefaultNotificationSettingPresenter {
|
||||||
|
return EditDefaultNotificationSettingPresenter(
|
||||||
|
notificationSettingsService = notificationSettingsService,
|
||||||
|
isOneToOne = false,
|
||||||
|
roomListService = roomListService,
|
||||||
|
matrixClient = matrixClient
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,14 +24,17 @@ import io.element.android.features.roomdetails.aMatrixRoom
|
||||||
import io.element.android.features.roomdetails.impl.notificationsettings.RoomNotificationSettingsEvents
|
import io.element.android.features.roomdetails.impl.notificationsettings.RoomNotificationSettingsEvents
|
||||||
import io.element.android.features.roomdetails.impl.notificationsettings.RoomNotificationSettingsPresenter
|
import io.element.android.features.roomdetails.impl.notificationsettings.RoomNotificationSettingsPresenter
|
||||||
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
|
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
|
||||||
|
import io.element.android.libraries.matrix.test.A_ROOM_ID
|
||||||
|
import io.element.android.libraries.matrix.test.notificationsettings.FakeNotificationSettingsService
|
||||||
import io.element.android.tests.testutils.consumeItemsUntilPredicate
|
import io.element.android.tests.testutils.consumeItemsUntilPredicate
|
||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
import kotlin.time.Duration.Companion.milliseconds
|
||||||
|
|
||||||
class RoomNotificationSettingsPresenterTests {
|
class RoomNotificationSettingsPresenterTests {
|
||||||
@Test
|
@Test
|
||||||
fun `present - initial state is created from room info`() = runTest {
|
fun `present - initial state is created from room info`() = runTest {
|
||||||
val presenter = aNotificationPresenter
|
val presenter = aNotificationPresenter()
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
presenter.present()
|
presenter.present()
|
||||||
}.test {
|
}.test {
|
||||||
|
|
@ -44,7 +47,7 @@ class RoomNotificationSettingsPresenterTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `present - notification mode changed`() = runTest {
|
fun `present - notification mode changed`() = runTest {
|
||||||
val presenter = aNotificationPresenter
|
val presenter = aNotificationPresenter()
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
presenter.present()
|
presenter.present()
|
||||||
}.test {
|
}.test {
|
||||||
|
|
@ -56,27 +59,61 @@ class RoomNotificationSettingsPresenterTests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `present - observe notification mode changed`() = runTest {
|
||||||
|
val notificationSettingsService = FakeNotificationSettingsService()
|
||||||
|
val presenter = aNotificationPresenter(notificationSettingsService)
|
||||||
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
|
presenter.present()
|
||||||
|
}.test {
|
||||||
|
notificationSettingsService.setRoomNotificationMode(A_ROOM_ID, RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY)
|
||||||
|
val updatedState = consumeItemsUntilPredicate() {
|
||||||
|
it.roomNotificationSettings?.mode == RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY
|
||||||
|
}.last()
|
||||||
|
Truth.assertThat(updatedState.roomNotificationSettings?.mode).isEqualTo(RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `present - notification settings set custom`() = runTest {
|
||||||
|
val notificationSettingsService = FakeNotificationSettingsService()
|
||||||
|
val presenter = aNotificationPresenter(notificationSettingsService)
|
||||||
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
|
presenter.present()
|
||||||
|
}.test {
|
||||||
|
val initialState = awaitItem()
|
||||||
|
initialState.eventSink(RoomNotificationSettingsEvents.SetNotificationMode(false))
|
||||||
|
val defaultState = consumeItemsUntilPredicate(timeout = 8000.milliseconds) {
|
||||||
|
it.roomNotificationSettings?.isDefault == false
|
||||||
|
}.last()
|
||||||
|
Truth.assertThat(defaultState.roomNotificationSettings?.isDefault).isFalse()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `present - notification settings restore default`() = runTest {
|
fun `present - notification settings restore default`() = runTest {
|
||||||
val presenter = aNotificationPresenter
|
val presenter = aNotificationPresenter()
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
presenter.present()
|
presenter.present()
|
||||||
}.test {
|
}.test {
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
initialState.eventSink(RoomNotificationSettingsEvents.RoomNotificationModeChanged(RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY))
|
initialState.eventSink(RoomNotificationSettingsEvents.RoomNotificationModeChanged(RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY))
|
||||||
initialState.eventSink(RoomNotificationSettingsEvents.SetNotificationMode(true))
|
initialState.eventSink(RoomNotificationSettingsEvents.SetNotificationMode(true))
|
||||||
val defaultState = consumeItemsUntilPredicate {
|
val defaultState = consumeItemsUntilPredicate(timeout = 2000.milliseconds) {
|
||||||
it.roomNotificationSettings?.mode == RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY
|
it.roomNotificationSettings?.mode == RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY
|
||||||
}.last()
|
}.last()
|
||||||
Truth.assertThat(defaultState.roomNotificationSettings?.mode).isEqualTo(RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY)
|
Truth.assertThat(defaultState.roomNotificationSettings?.mode).isEqualTo(RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val aNotificationPresenter: RoomNotificationSettingsPresenter get() {
|
private fun aNotificationPresenter(
|
||||||
val room = aMatrixRoom()
|
notificationSettingsService: FakeNotificationSettingsService = FakeNotificationSettingsService()
|
||||||
|
): RoomNotificationSettingsPresenter{
|
||||||
|
val room = aMatrixRoom(notificationSettingsService = notificationSettingsService)
|
||||||
return RoomNotificationSettingsPresenter(
|
return RoomNotificationSettingsPresenter(
|
||||||
room = room,
|
room = room,
|
||||||
notificationSettingsService = room.notificationSettingsService
|
notificationSettingsService = notificationSettingsService
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,12 +20,14 @@ import io.element.android.libraries.matrix.api.core.RoomId
|
||||||
import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService
|
import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService
|
||||||
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
|
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
|
||||||
import io.element.android.libraries.matrix.api.room.RoomNotificationSettings
|
import io.element.android.libraries.matrix.api.room.RoomNotificationSettings
|
||||||
|
import io.element.android.libraries.matrix.test.A_ROOM_ID
|
||||||
import io.element.android.libraries.matrix.test.A_ROOM_NOTIFICATION_MODE
|
import io.element.android.libraries.matrix.test.A_ROOM_NOTIFICATION_MODE
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.SharedFlow
|
import kotlinx.coroutines.flow.SharedFlow
|
||||||
|
|
||||||
class FakeNotificationSettingsService(
|
class FakeNotificationSettingsService(
|
||||||
initialRoomMode: RoomNotificationMode = A_ROOM_NOTIFICATION_MODE,
|
initialRoomMode: RoomNotificationMode = A_ROOM_NOTIFICATION_MODE,
|
||||||
|
initialRoomModeIsDefault: Boolean = true,
|
||||||
initialGroupDefaultMode: RoomNotificationMode = RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY,
|
initialGroupDefaultMode: RoomNotificationMode = RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY,
|
||||||
initialEncryptedGroupDefaultMode: RoomNotificationMode = RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY,
|
initialEncryptedGroupDefaultMode: RoomNotificationMode = RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY,
|
||||||
initialOneToOneDefaultMode: RoomNotificationMode = RoomNotificationMode.ALL_MESSAGES,
|
initialOneToOneDefaultMode: RoomNotificationMode = RoomNotificationMode.ALL_MESSAGES,
|
||||||
|
|
@ -37,6 +39,7 @@ class FakeNotificationSettingsService(
|
||||||
private var defaultOneToOneRoomNotificationMode: RoomNotificationMode = initialOneToOneDefaultMode
|
private var defaultOneToOneRoomNotificationMode: RoomNotificationMode = initialOneToOneDefaultMode
|
||||||
private var defaultEncryptedOneToOneRoomNotificationMode: RoomNotificationMode = initialEncryptedOneToOneDefaultMode
|
private var defaultEncryptedOneToOneRoomNotificationMode: RoomNotificationMode = initialEncryptedOneToOneDefaultMode
|
||||||
private var roomNotificationMode: RoomNotificationMode = initialRoomMode
|
private var roomNotificationMode: RoomNotificationMode = initialRoomMode
|
||||||
|
private var roomNotificationModeIsDefault: Boolean = initialRoomModeIsDefault
|
||||||
private var callNotificationsEnabled = false
|
private var callNotificationsEnabled = false
|
||||||
private var atRoomNotificationsEnabled = false
|
private var atRoomNotificationsEnabled = false
|
||||||
override val notificationSettingsChangeFlow: SharedFlow<Unit>
|
override val notificationSettingsChangeFlow: SharedFlow<Unit>
|
||||||
|
|
@ -45,8 +48,8 @@ class FakeNotificationSettingsService(
|
||||||
override suspend fun getRoomNotificationSettings(roomId: RoomId, isEncrypted: Boolean, isOneToOne: Boolean): Result<RoomNotificationSettings> {
|
override suspend fun getRoomNotificationSettings(roomId: RoomId, isEncrypted: Boolean, isOneToOne: Boolean): Result<RoomNotificationSettings> {
|
||||||
return Result.success(
|
return Result.success(
|
||||||
RoomNotificationSettings(
|
RoomNotificationSettings(
|
||||||
mode = roomNotificationMode,
|
mode = if(roomNotificationModeIsDefault) defaultEncryptedGroupRoomNotificationMode else roomNotificationMode,
|
||||||
isDefault = roomNotificationMode == defaultEncryptedGroupRoomNotificationMode
|
isDefault = roomNotificationModeIsDefault
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -86,12 +89,14 @@ class FakeNotificationSettingsService(
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun setRoomNotificationMode(roomId: RoomId, mode: RoomNotificationMode): Result<Unit> {
|
override suspend fun setRoomNotificationMode(roomId: RoomId, mode: RoomNotificationMode): Result<Unit> {
|
||||||
|
roomNotificationModeIsDefault = false
|
||||||
roomNotificationMode = mode
|
roomNotificationMode = mode
|
||||||
_notificationSettingsStateFlow.emit(Unit)
|
_notificationSettingsStateFlow.emit(Unit)
|
||||||
return Result.success(Unit)
|
return Result.success(Unit)
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun restoreDefaultRoomNotificationMode(roomId: RoomId): Result<Unit> {
|
override suspend fun restoreDefaultRoomNotificationMode(roomId: RoomId): Result<Unit> {
|
||||||
|
roomNotificationModeIsDefault = true
|
||||||
roomNotificationMode = defaultEncryptedGroupRoomNotificationMode
|
roomNotificationMode = defaultEncryptedGroupRoomNotificationMode
|
||||||
_notificationSettingsStateFlow.emit(Unit)
|
_notificationSettingsStateFlow.emit(Unit)
|
||||||
return Result.success(Unit)
|
return Result.success(Unit)
|
||||||
|
|
@ -122,4 +127,8 @@ class FakeNotificationSettingsService(
|
||||||
callNotificationsEnabled = enabled
|
callNotificationsEnabled = enabled
|
||||||
return Result.success(Unit)
|
return Result.success(Unit)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun getRoomsWithUserDefinedRules(): Result<List<String>> {
|
||||||
|
return Result.success(if (roomNotificationModeIsDefault) listOf() else listOf(A_ROOM_ID.value))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue