Skip to content

Commit 6fa585f

Browse files
committed
Add unit test on RustNotificationService
And fix mapping error.
1 parent 145c40d commit 6fa585f

File tree

15 files changed

+242
-50
lines changed

15 files changed

+242
-50
lines changed

libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/notification/NotificationData.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ sealed interface NotificationContent {
9494
data object RoomHistoryVisibility : StateEvent
9595
data object RoomJoinRules : StateEvent
9696
data class RoomMemberContent(
97-
val userId: String,
97+
val userId: UserId,
9898
val membershipState: RoomMembershipState
9999
) : StateEvent
100100

@@ -108,6 +108,10 @@ sealed interface NotificationContent {
108108
data object SpaceChild : StateEvent
109109
data object SpaceParent : StateEvent
110110
}
111+
112+
data class Invite(
113+
val senderId: UserId,
114+
) : NotificationContent
111115
}
112116

113117
enum class CallNotifyType {

libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/notification/NotificationService.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ package io.element.android.libraries.matrix.api.notification
99

1010
import io.element.android.libraries.matrix.api.core.EventId
1111
import io.element.android.libraries.matrix.api.core.RoomId
12-
import io.element.android.libraries.matrix.api.core.SessionId
1312

1413
interface NotificationService {
15-
suspend fun getNotification(userId: SessionId, roomId: RoomId, eventId: EventId): Result<NotificationData?>
14+
suspend fun getNotification(roomId: RoomId, eventId: EventId): Result<NotificationData?>
1615
}

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ class RustMatrixClient(
140140
)
141141
private val notificationProcessSetup = NotificationProcessSetup.SingleProcess(syncService)
142142
private val notificationClient = runBlocking { client.notificationClient(notificationProcessSetup) }
143-
private val notificationService = RustNotificationService(sessionId, notificationClient, dispatchers, clock)
143+
private val notificationService = RustNotificationService(notificationClient, dispatchers, clock)
144144
private val notificationSettingsService = RustNotificationSettingsService(client, dispatchers)
145145
.apply { start() }
146146
private val encryptionService = RustEncryptionService(

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,19 @@ package io.element.android.libraries.matrix.impl.notification
1010
import io.element.android.libraries.core.bool.orFalse
1111
import io.element.android.libraries.matrix.api.core.EventId
1212
import io.element.android.libraries.matrix.api.core.RoomId
13-
import io.element.android.libraries.matrix.api.core.SessionId
13+
import io.element.android.libraries.matrix.api.core.UserId
1414
import io.element.android.libraries.matrix.api.notification.NotificationContent
1515
import io.element.android.libraries.matrix.api.notification.NotificationData
16-
import io.element.android.libraries.matrix.api.room.RoomMembershipState
1716
import io.element.android.libraries.matrix.api.room.isDm
1817
import io.element.android.services.toolbox.api.systemclock.SystemClock
1918
import org.matrix.rustcomponents.sdk.NotificationEvent
2019
import org.matrix.rustcomponents.sdk.NotificationItem
2120
import org.matrix.rustcomponents.sdk.use
2221

2322
class NotificationMapper(
24-
sessionId: SessionId,
2523
private val clock: SystemClock,
2624
) {
27-
private val notificationContentMapper = NotificationContentMapper(sessionId)
25+
private val notificationContentMapper = NotificationContentMapper()
2826

2927
fun map(
3028
eventId: EventId,
@@ -56,15 +54,14 @@ class NotificationMapper(
5654
}
5755
}
5856

59-
class NotificationContentMapper(private val sessionId: SessionId) {
57+
class NotificationContentMapper {
6058
private val timelineEventToNotificationContentMapper = TimelineEventToNotificationContentMapper()
6159

6260
fun map(notificationEvent: NotificationEvent): NotificationContent =
6361
when (notificationEvent) {
6462
is NotificationEvent.Timeline -> timelineEventToNotificationContentMapper.map(notificationEvent.event)
65-
is NotificationEvent.Invite -> NotificationContent.StateEvent.RoomMemberContent(
66-
userId = sessionId.value,
67-
membershipState = RoomMembershipState.INVITE,
63+
is NotificationEvent.Invite -> NotificationContent.Invite(
64+
senderId = UserId(notificationEvent.sender),
6865
)
6966
}
7067
}

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/RustNotificationService.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ package io.element.android.libraries.matrix.impl.notification
1010
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
1111
import io.element.android.libraries.matrix.api.core.EventId
1212
import io.element.android.libraries.matrix.api.core.RoomId
13-
import io.element.android.libraries.matrix.api.core.SessionId
1413
import io.element.android.libraries.matrix.api.notification.NotificationData
1514
import io.element.android.libraries.matrix.api.notification.NotificationService
1615
import io.element.android.services.toolbox.api.systemclock.SystemClock
@@ -19,15 +18,13 @@ import org.matrix.rustcomponents.sdk.NotificationClient
1918
import org.matrix.rustcomponents.sdk.use
2019

2120
class RustNotificationService(
22-
sessionId: SessionId,
2321
private val notificationClient: NotificationClient,
2422
private val dispatchers: CoroutineDispatchers,
2523
clock: SystemClock,
2624
) : NotificationService {
27-
private val notificationMapper: NotificationMapper = NotificationMapper(sessionId, clock)
25+
private val notificationMapper: NotificationMapper = NotificationMapper(clock)
2826

2927
override suspend fun getNotification(
30-
userId: SessionId,
3128
roomId: RoomId,
3229
eventId: EventId,
3330
): Result<NotificationData?> = withContext(dispatchers.io) {

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/TimelineEventToNotificationContentMapper.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,10 @@ private fun StateEventContent.toContent(): NotificationContent.StateEvent {
5151
StateEventContent.RoomHistoryVisibility -> NotificationContent.StateEvent.RoomHistoryVisibility
5252
StateEventContent.RoomJoinRules -> NotificationContent.StateEvent.RoomJoinRules
5353
is StateEventContent.RoomMemberContent -> {
54-
NotificationContent.StateEvent.RoomMemberContent(userId, RoomMemberMapper.mapMembership(membershipState))
54+
NotificationContent.StateEvent.RoomMemberContent(
55+
userId = UserId(userId),
56+
membershipState = RoomMemberMapper.mapMembership(membershipState),
57+
)
5558
}
5659
StateEventContent.RoomName -> NotificationContent.StateEvent.RoomName
5760
StateEventContent.RoomPinnedEvents -> NotificationContent.StateEvent.RoomPinnedEvents
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/*
2+
* Copyright 2024 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only
5+
* Please see LICENSE in the repository root for full details.
6+
*/
7+
8+
package io.element.android.libraries.matrix.impl.fixtures.factories
9+
10+
import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeRustTimelineEvent
11+
import io.element.android.libraries.matrix.test.A_ROOM_NAME
12+
import io.element.android.libraries.matrix.test.A_USER_NAME
13+
import org.matrix.rustcomponents.sdk.NotificationEvent
14+
import org.matrix.rustcomponents.sdk.NotificationItem
15+
import org.matrix.rustcomponents.sdk.NotificationRoomInfo
16+
import org.matrix.rustcomponents.sdk.NotificationSenderInfo
17+
import org.matrix.rustcomponents.sdk.TimelineEvent
18+
19+
fun aRustNotificationItem(
20+
event: NotificationEvent = aRustNotificationEventTimeline(),
21+
senderInfo: NotificationSenderInfo = aRustNotificationSenderInfo(),
22+
roomInfo: NotificationRoomInfo = aRustNotificationRoomInfo(),
23+
isNoisy: Boolean? = false,
24+
hasMention: Boolean? = false,
25+
) = NotificationItem(
26+
event = event,
27+
senderInfo = senderInfo,
28+
roomInfo = roomInfo,
29+
isNoisy = isNoisy,
30+
hasMention = hasMention,
31+
)
32+
33+
fun aRustNotificationSenderInfo(
34+
displayName: String? = A_USER_NAME,
35+
avatarUrl: String? = null,
36+
isNameAmbiguous: Boolean = false,
37+
) = NotificationSenderInfo(
38+
displayName = displayName,
39+
avatarUrl = avatarUrl,
40+
isNameAmbiguous = isNameAmbiguous,
41+
)
42+
43+
fun aRustNotificationRoomInfo(
44+
displayName: String = A_ROOM_NAME,
45+
avatarUrl: String? = null,
46+
canonicalAlias: String? = null,
47+
joinedMembersCount: ULong = 2u,
48+
isEncrypted: Boolean? = true,
49+
isDirect: Boolean = false,
50+
) = NotificationRoomInfo(
51+
displayName = displayName,
52+
avatarUrl = avatarUrl,
53+
canonicalAlias = canonicalAlias,
54+
joinedMembersCount = joinedMembersCount,
55+
isEncrypted = isEncrypted,
56+
isDirect = isDirect,
57+
)
58+
59+
fun aRustNotificationEventTimeline(
60+
event: TimelineEvent = FakeRustTimelineEvent(),
61+
) = NotificationEvent.Timeline(
62+
event = event,
63+
)
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Copyright 2024 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only
5+
* Please see LICENSE in the repository root for full details.
6+
*/
7+
8+
package io.element.android.libraries.matrix.impl.fixtures.factories
9+
10+
import io.element.android.libraries.matrix.test.A_MESSAGE
11+
import org.matrix.rustcomponents.sdk.FormattedBody
12+
import org.matrix.rustcomponents.sdk.MessageLikeEventContent
13+
import org.matrix.rustcomponents.sdk.MessageType
14+
import org.matrix.rustcomponents.sdk.TextMessageContent
15+
import org.matrix.rustcomponents.sdk.TimelineEventType
16+
17+
fun aRustTimelineEventTypeMessageLike(
18+
content: MessageLikeEventContent = aRustMessageLikeEventContentRoomMessage(),
19+
): TimelineEventType.MessageLike {
20+
return TimelineEventType.MessageLike(
21+
content = content,
22+
)
23+
}
24+
25+
fun aRustMessageLikeEventContentRoomMessage(
26+
messageType: MessageType = aRustMessageTypeText(),
27+
inReplyToEventId: String? = null,
28+
) = MessageLikeEventContent.RoomMessage(
29+
messageType = messageType,
30+
inReplyToEventId = inReplyToEventId,
31+
)
32+
33+
fun aRustMessageTypeText(
34+
content: TextMessageContent = aRustTextMessageContent(),
35+
) = MessageType.Text(
36+
content = content,
37+
)
38+
39+
fun aRustTextMessageContent(
40+
body: String = A_MESSAGE,
41+
formatted: FormattedBody? = null,
42+
) = TextMessageContent(
43+
body = body,
44+
formatted = formatted,
45+
)

libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeRustNotificationClient.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,15 @@
77

88
package io.element.android.libraries.matrix.impl.fixtures.fakes
99

10+
import io.element.android.tests.testutils.simulateLongTask
1011
import org.matrix.rustcomponents.sdk.NoPointer
1112
import org.matrix.rustcomponents.sdk.NotificationClient
13+
import org.matrix.rustcomponents.sdk.NotificationItem
1214

13-
class FakeRustNotificationClient : NotificationClient(NoPointer)
15+
class FakeRustNotificationClient(
16+
var notificationItemResult: NotificationItem? = null
17+
) : NotificationClient(NoPointer) {
18+
override suspend fun getNotification(roomId: String, eventId: String): NotificationItem? = simulateLongTask {
19+
notificationItemResult
20+
}
21+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* Copyright 2024 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only
5+
* Please see LICENSE in the repository root for full details.
6+
*/
7+
8+
package io.element.android.libraries.matrix.impl.fixtures.fakes
9+
10+
import io.element.android.libraries.matrix.impl.fixtures.factories.aRustTimelineEventTypeMessageLike
11+
import io.element.android.libraries.matrix.test.A_USER_ID_2
12+
import io.element.android.services.toolbox.test.systemclock.A_FAKE_TIMESTAMP
13+
import org.matrix.rustcomponents.sdk.NoPointer
14+
import org.matrix.rustcomponents.sdk.TimelineEvent
15+
import org.matrix.rustcomponents.sdk.TimelineEventType
16+
17+
class FakeRustTimelineEvent(
18+
val timestamp: ULong = A_FAKE_TIMESTAMP.toULong(),
19+
val timelineEventType: TimelineEventType = aRustTimelineEventTypeMessageLike(),
20+
val senderId: String = A_USER_ID_2.value,
21+
) : TimelineEvent(NoPointer) {
22+
override fun timestamp(): ULong = timestamp
23+
override fun eventType(): TimelineEventType = timelineEventType
24+
override fun senderId(): String = senderId
25+
}

0 commit comments

Comments
 (0)