Add test for NotificationCreator

This commit is contained in:
Benoit Marty
2023-11-24 19:26:47 +01:00
committed by Benoit Marty
parent 3316f840f1
commit 97c764cd79
2 changed files with 343 additions and 0 deletions

View File

@@ -0,0 +1,29 @@
/*
* Copyright (c) 2023 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.libraries.push.impl.notifications.factories
import android.content.Intent
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.matrix.api.core.ThreadId
import io.element.android.libraries.push.impl.intent.IntentProvider
class FakeIntentProvider : IntentProvider {
override fun getViewRoomIntent(sessionId: SessionId, roomId: RoomId?, threadId: ThreadId?) = Intent()
override fun getInviteListIntent(sessionId: SessionId) = Intent()
}

View File

@@ -0,0 +1,314 @@
/*
* Copyright (c) 2023 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.libraries.push.impl.notifications.factories
import android.app.Notification
import android.content.Context
import androidx.core.app.NotificationCompat
import androidx.core.app.Person
import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.matrix.test.AN_EVENT_ID
import io.element.android.libraries.matrix.test.A_ROOM_ID
import io.element.android.libraries.matrix.test.A_SESSION_ID
import io.element.android.libraries.matrix.test.A_THREAD_ID
import io.element.android.libraries.matrix.test.core.aBuildMeta
import io.element.android.libraries.matrix.ui.components.aMatrixUser
import io.element.android.libraries.push.impl.notifications.NotificationActionIds
import io.element.android.libraries.push.impl.notifications.RoomEventGroupInfo
import io.element.android.libraries.push.impl.notifications.channels.NotificationChannels
import io.element.android.libraries.push.impl.notifications.factories.action.MarkAsReadActionFactory
import io.element.android.libraries.push.impl.notifications.factories.action.QuickReplyActionFactory
import io.element.android.libraries.push.impl.notifications.model.FallbackNotifiableEvent
import io.element.android.libraries.push.impl.notifications.model.InviteNotifiableEvent
import io.element.android.libraries.push.impl.notifications.model.SimpleNotifiableEvent
import io.element.android.services.toolbox.test.strings.FakeStringProvider
import io.element.android.services.toolbox.test.systemclock.A_FAKE_TIMESTAMP
import io.element.android.services.toolbox.test.systemclock.FakeSystemClock
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
@RunWith(RobolectricTestRunner::class)
class NotificationCreatorTest {
@Test
fun `test createDiagnosticNotification`() {
val sut = createNotificationCreator()
val result = sut.createDiagnosticNotification()
result.commonAssertions(
expectedGroup = null,
expectedCategory = NotificationCompat.CATEGORY_STATUS,
)
}
@Test
fun `test createFallbackNotification`() {
val sut = createNotificationCreator()
val result = sut.createFallbackNotification(
FallbackNotifiableEvent(
sessionId = A_SESSION_ID,
roomId = A_ROOM_ID,
eventId = AN_EVENT_ID,
editedEventId = null,
description = "description",
canBeReplaced = false,
isRedacted = false,
isUpdated = false,
timestamp = A_FAKE_TIMESTAMP,
)
)
result.commonAssertions(
expectedCategory = null,
)
}
@Test
fun `test createSimpleEventNotification`() {
val sut = createNotificationCreator()
val result = sut.createSimpleEventNotification(
SimpleNotifiableEvent(
sessionId = A_SESSION_ID,
roomId = A_ROOM_ID,
eventId = AN_EVENT_ID,
editedEventId = null,
noisy = false,
title = "title",
description = "description",
type = null,
timestamp = A_FAKE_TIMESTAMP,
soundName = null,
canBeReplaced = false,
isRedacted = false,
isUpdated = false,
)
)
result.commonAssertions(
expectedCategory = null,
)
}
@Test
fun `test createSimpleEventNotification noisy`() {
val sut = createNotificationCreator()
val result = sut.createSimpleEventNotification(
SimpleNotifiableEvent(
sessionId = A_SESSION_ID,
roomId = A_ROOM_ID,
eventId = AN_EVENT_ID,
editedEventId = null,
noisy = true,
title = "title",
description = "description",
type = null,
timestamp = A_FAKE_TIMESTAMP,
soundName = null,
canBeReplaced = false,
isRedacted = false,
isUpdated = false,
)
)
result.commonAssertions(
expectedCategory = null,
)
}
@Test
fun `test createRoomInvitationNotification`() {
val sut = createNotificationCreator()
val result = sut.createRoomInvitationNotification(
InviteNotifiableEvent(
sessionId = A_SESSION_ID,
roomId = A_ROOM_ID,
eventId = AN_EVENT_ID,
editedEventId = null,
noisy = false,
title = "title",
description = "description",
type = null,
timestamp = A_FAKE_TIMESTAMP,
soundName = null,
canBeReplaced = false,
isRedacted = false,
isUpdated = false,
roomName = "roomName",
)
)
result.commonAssertions(
expectedCategory = null,
)
}
@Test
fun `test createRoomInvitationNotification noisy`() {
val sut = createNotificationCreator()
val result = sut.createRoomInvitationNotification(
InviteNotifiableEvent(
sessionId = A_SESSION_ID,
roomId = A_ROOM_ID,
eventId = AN_EVENT_ID,
editedEventId = null,
noisy = true,
title = "title",
description = "description",
type = null,
timestamp = A_FAKE_TIMESTAMP,
soundName = null,
canBeReplaced = false,
isRedacted = false,
isUpdated = false,
roomName = "roomName",
)
)
result.commonAssertions(
expectedCategory = null,
)
}
@Test
fun `test createSummaryListNotification`() {
val sut = createNotificationCreator()
val matrixUser = aMatrixUser()
val result = sut.createSummaryListNotification(
currentUser = matrixUser,
style = null,
compatSummary = "compatSummary",
noisy = false,
lastMessageTimestamp = 123456L,
)
result.commonAssertions(
expectedGroup = matrixUser.userId.value,
)
}
@Test
fun `test createSummaryListNotification noisy`() {
val sut = createNotificationCreator()
val matrixUser = aMatrixUser()
val result = sut.createSummaryListNotification(
currentUser = matrixUser,
style = null,
compatSummary = "compatSummary",
noisy = true,
lastMessageTimestamp = 123456L,
)
result.commonAssertions(
expectedGroup = matrixUser.userId.value,
)
}
@Test
fun `test createMessagesListNotification`() {
val sut = createNotificationCreator()
aMatrixUser()
val result = sut.createMessagesListNotification(
messageStyle = NotificationCompat.MessagingStyle(
Person.Builder()
.setName("name")
.build()
),
roomInfo = RoomEventGroupInfo(
sessionId = A_SESSION_ID,
roomId = A_ROOM_ID,
roomDisplayName = "roomDisplayName",
isDirect = false,
hasSmartReplyError = false,
shouldBing = false,
customSound = null,
isUpdated = false,
),
threadId = null,
largeIcon = null,
lastMessageTimestamp = 123456L,
tickerText = "tickerText",
)
result.commonAssertions()
}
@Test
fun `test createMessagesListNotification should bing and thread`() {
val sut = createNotificationCreator()
aMatrixUser()
val result = sut.createMessagesListNotification(
messageStyle = NotificationCompat.MessagingStyle(
Person.Builder()
.setName("name")
.build()
),
roomInfo = RoomEventGroupInfo(
sessionId = A_SESSION_ID,
roomId = A_ROOM_ID,
roomDisplayName = "roomDisplayName",
isDirect = false,
hasSmartReplyError = false,
shouldBing = true,
customSound = null,
isUpdated = false,
),
threadId = A_THREAD_ID,
largeIcon = null,
lastMessageTimestamp = 123456L,
tickerText = "tickerText",
)
result.commonAssertions()
}
private fun createNotificationCreator(
context: Context = RuntimeEnvironment.getApplication(),
buildMeta: BuildMeta = aBuildMeta(),
notificationChannels: NotificationChannels = createNotificationChannels()
): NotificationCreator {
return NotificationCreator(
context = context,
notificationChannels = notificationChannels,
stringProvider = FakeStringProvider("test"),
buildMeta = buildMeta,
pendingIntentFactory = PendingIntentFactory(
context,
FakeIntentProvider(),
FakeSystemClock(),
NotificationActionIds(buildMeta),
),
markAsReadActionFactory = MarkAsReadActionFactory(
context = context,
actionIds = NotificationActionIds(buildMeta),
stringProvider = FakeStringProvider("MarkAsReadActionFactory"),
clock = FakeSystemClock(),
),
quickReplyActionFactory = QuickReplyActionFactory(
context = context,
actionIds = NotificationActionIds(buildMeta),
stringProvider = FakeStringProvider("QuickReplyActionFactory"),
clock = FakeSystemClock(),
),
)
}
private fun createNotificationChannels(): NotificationChannels {
val context = RuntimeEnvironment.getApplication()
return NotificationChannels(context, FakeStringProvider(""))
}
private fun Notification.commonAssertions(
expectedGroup: String? = A_SESSION_ID.value,
expectedCategory: String? = NotificationCompat.CATEGORY_MESSAGE,
) {
assertThat(contentIntent).isNotNull()
assertThat(group).isEqualTo(expectedGroup)
assertThat(category).isEqualTo(expectedCategory)
}
}