Add test on DefaultEntryPoints

This commit is contained in:
Benoit Marty 2025-09-12 21:32:24 +02:00
parent a575019760
commit a1aeb24f23
93 changed files with 2426 additions and 418 deletions

View file

@ -0,0 +1,121 @@
/*
* Copyright 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.messages.impl
import androidx.compose.runtime.Composable
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
import com.google.common.truth.Truth.assertThat
import io.element.android.features.call.api.CallType
import io.element.android.features.call.api.ElementCallEntryPoint
import io.element.android.features.knockrequests.api.list.KnockRequestsListEntryPoint
import io.element.android.features.location.api.SendLocationEntryPoint
import io.element.android.features.location.api.ShowLocationEntryPoint
import io.element.android.features.location.test.FakeLocationService
import io.element.android.features.messages.api.MessagesEntryPoint
import io.element.android.features.messages.impl.pinned.banner.createPinnedEventsTimelineProvider
import io.element.android.features.messages.impl.timeline.createTimelineController
import io.element.android.features.poll.api.create.CreatePollEntryPoint
import io.element.android.libraries.dateformatter.test.FakeDateFormatter
import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.permalink.PermalinkData
import io.element.android.libraries.matrix.api.timeline.Timeline
import io.element.android.libraries.matrix.test.AN_EVENT_ID
import io.element.android.libraries.matrix.test.A_USER_ID
import io.element.android.libraries.matrix.test.FakeMatrixClient
import io.element.android.libraries.matrix.test.room.FakeBaseRoom
import io.element.android.libraries.matrix.ui.messages.RoomMemberProfilesCache
import io.element.android.libraries.matrix.ui.messages.RoomNamesCache
import io.element.android.libraries.mediaviewer.api.MediaViewerEntryPoint
import io.element.android.libraries.textcomposer.mentions.MentionSpanTheme
import io.element.android.libraries.textcomposer.mentions.MentionSpanUpdater
import io.element.android.services.analytics.test.FakeAnalyticsService
import io.element.android.tests.testutils.lambda.lambdaError
import io.element.android.tests.testutils.node.TestParentNode
import io.element.android.tests.testutils.testCoroutineDispatchers
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class DefaultMessagesEntryPointTest {
@Test
fun `test node builder`() = runTest {
val entryPoint = DefaultMessagesEntryPoint()
val parentNode = TestParentNode.create { buildContext, plugins ->
MessagesFlowNode(
buildContext = buildContext,
plugins = plugins,
matrixClient = FakeMatrixClient(),
sendLocationEntryPoint = object : SendLocationEntryPoint {
override fun builder(timelineMode: Timeline.Mode) = lambdaError()
},
showLocationEntryPoint = object : ShowLocationEntryPoint {
override fun createNode(parentNode: Node, buildContext: BuildContext, inputs: ShowLocationEntryPoint.Inputs) = lambdaError()
},
createPollEntryPoint = object : CreatePollEntryPoint {
override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError()
},
elementCallEntryPoint = object : ElementCallEntryPoint {
override fun startCall(callType: CallType) = lambdaError()
override suspend fun handleIncomingCall(
callType: CallType.RoomCall,
eventId: EventId,
senderId: UserId,
roomName: String?,
senderName: String?,
avatarUrl: String?,
timestamp: Long,
notificationChannelId: String,
textContent: String?,
) = lambdaError()
},
mediaViewerEntryPoint = object : MediaViewerEntryPoint {
override fun nodeBuilder(parentNode: Node, buildContext: BuildContext) = lambdaError()
},
analyticsService = FakeAnalyticsService(),
locationService = FakeLocationService(),
room = FakeBaseRoom(),
roomMemberProfilesCache = RoomMemberProfilesCache(),
roomNamesCache = RoomNamesCache(),
mentionSpanUpdater = object : MentionSpanUpdater {
override fun updateMentionSpans(text: CharSequence) = text
@Composable
override fun rememberMentionSpans(text: CharSequence) = text
},
mentionSpanTheme = MentionSpanTheme(A_USER_ID),
pinnedEventsTimelineProvider = createPinnedEventsTimelineProvider(),
timelineController = createTimelineController(),
knockRequestsListEntryPoint = object : KnockRequestsListEntryPoint {
override fun createNode(parentNode: Node, buildContext: BuildContext) = lambdaError()
},
dateFormatter = FakeDateFormatter(),
coroutineDispatchers = testCoroutineDispatchers(),
)
}
val callback = object : MessagesEntryPoint.Callback {
override fun onRoomDetailsClick() = lambdaError()
override fun onUserDataClick(userId: UserId) = lambdaError()
override fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean) = lambdaError()
override fun onForwardedToSingleRoom(roomId: RoomId) = lambdaError()
}
val initialTarget = MessagesEntryPoint.InitialTarget.Messages(focusedEventId = AN_EVENT_ID)
val params = MessagesEntryPoint.Params(initialTarget)
val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null))
.params(params)
.callback(callback)
.build()
assertThat(result).isInstanceOf(MessagesFlowNode::class.java)
assertThat(result.plugins).contains(MessagesEntryPoint.Params(initialTarget))
assertThat(result.plugins).contains(callback)
}
}

View file

@ -178,10 +178,9 @@ class PinnedMessagesBannerPresenterTest {
),
syncService: SyncService = FakeSyncService(),
): PinnedMessagesBannerPresenter {
val timelineProvider = PinnedEventsTimelineProvider(
val timelineProvider = createPinnedEventsTimelineProvider(
room = room,
syncService = syncService,
dispatchers = testCoroutineDispatchers(),
)
timelineProvider.launchIn(backgroundScope)
@ -192,3 +191,12 @@ class PinnedMessagesBannerPresenterTest {
)
}
}
internal fun TestScope.createPinnedEventsTimelineProvider(
room: JoinedRoom = FakeJoinedRoom(),
syncService: SyncService = FakeSyncService(),
) = PinnedEventsTimelineProvider(
room = room,
syncService = syncService,
dispatchers = testCoroutineDispatchers(),
)

View file

@ -217,3 +217,13 @@ class TimelineControllerTest {
}
}
}
internal fun createTimelineController(
room: FakeJoinedRoom = FakeJoinedRoom(liveTimeline = FakeTimeline()),
liveTimeline: Timeline = FakeTimeline(name = "live"),
): TimelineController {
return TimelineController(
room = room,
liveTimeline = liveTimeline
)
}