From 930669e4192d9cfad0ad47ff6fbbeedb9ca1461d Mon Sep 17 00:00:00 2001 From: Niamh Date: Wed, 11 Jun 2025 18:07:04 +0100 Subject: [PATCH] #158: Use abstraction for send messages --- .../sendmessages/SendMessagePresenter.kt | 5 +++-- .../chatroom/sendmessages/SendMessages.kt | 2 ++ .../kotlin/chatserver/ChatRepositories.kt | 2 ++ .../chatserver/messages/LocalChatMessages.kt | 7 ++++++- .../messages/LocalChatMessagesTest.kt | 19 +++++++++++++++++++ 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/chatroom/sendmessages/SendMessagePresenter.kt b/src/main/kotlin/chatroom/sendmessages/SendMessagePresenter.kt index 80942e7..6a19378 100644 --- a/src/main/kotlin/chatroom/sendmessages/SendMessagePresenter.kt +++ b/src/main/kotlin/chatroom/sendmessages/SendMessagePresenter.kt @@ -4,13 +4,14 @@ import arch.Presenter import arch.RokyDispatchers import chatroom.sendmessages.SendMessageEvent.SendMessage import chatroom.sendmessages.SendMessageViewState.Clear +import chatserver.WriteChatRepository import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import kotlinx.coroutines.withContext class SendMessagePresenter( private val windowScope: CoroutineScope, - private val send: (String) -> Unit = ::println, + private val message: WriteChatRepository, dispatchers: RokyDispatchers, ) : Presenter(dispatchers) { override fun onAttach(view: SendMessagesView) { @@ -24,7 +25,7 @@ class SendMessagePresenter( fun onEvent(event: SendMessageEvent) { if (event is SendMessage) { windowScope.launch(dispatchers.io) { - send(event.message) + message.write(event.message) withContext(dispatchers.main) { withView { it.show(Clear) } } diff --git a/src/main/kotlin/chatroom/sendmessages/SendMessages.kt b/src/main/kotlin/chatroom/sendmessages/SendMessages.kt index 8a22ad7..ac96e75 100644 --- a/src/main/kotlin/chatroom/sendmessages/SendMessages.kt +++ b/src/main/kotlin/chatroom/sendmessages/SendMessages.kt @@ -1,6 +1,7 @@ package chatroom.sendmessages import chatroom.ChatroomWindow +import chatserver.ChatRepositories import org.koin.dsl.module val sendMessagesModule = @@ -9,6 +10,7 @@ val sendMessagesModule = scoped { SendMessagePresenter( dispatchers = get(), + message = get().writeMessages(), windowScope = get().windowScope, ) } diff --git a/src/main/kotlin/chatserver/ChatRepositories.kt b/src/main/kotlin/chatserver/ChatRepositories.kt index df27581..4d1ab04 100644 --- a/src/main/kotlin/chatserver/ChatRepositories.kt +++ b/src/main/kotlin/chatserver/ChatRepositories.kt @@ -16,4 +16,6 @@ class ChatRepositories( fun readMessages(): ReadChatRepository = messages fun subscribeMessages(): SubscribeChatRepository = messages + + fun writeMessages(): WriteChatRepository = messages } diff --git a/src/main/kotlin/chatserver/messages/LocalChatMessages.kt b/src/main/kotlin/chatserver/messages/LocalChatMessages.kt index d8bf52c..f454044 100644 --- a/src/main/kotlin/chatserver/messages/LocalChatMessages.kt +++ b/src/main/kotlin/chatserver/messages/LocalChatMessages.kt @@ -4,6 +4,7 @@ import arch.RokyDispatchers import chatserver.ChatMessageResult import chatserver.ReadChatRepository import chatserver.SubscribeChatRepository +import chatserver.WriteChatRepository import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.delay @@ -15,7 +16,7 @@ class LocalChatMessages( private val dispatchers: RokyDispatchers, private val scope: CoroutineScope = CoroutineScope(dispatchers.default + Job()), private val source: () -> Flow = { emitEveryThreeSeconds(sampleUsers, sampleMessages) }, -) : ReadChatRepository, SubscribeChatRepository { +) : ReadChatRepository, SubscribeChatRepository, WriteChatRepository { private var samples: Job? = null private val _events = MutableStateFlow("") private val events = _events.asStateFlow() @@ -89,4 +90,8 @@ class LocalChatMessages( } } } + + override fun write(item: String) { + _events.value = "Me: $item" + } } diff --git a/src/test/kotlin/chatserver/messages/LocalChatMessagesTest.kt b/src/test/kotlin/chatserver/messages/LocalChatMessagesTest.kt index 62a9df3..b124303 100644 --- a/src/test/kotlin/chatserver/messages/LocalChatMessagesTest.kt +++ b/src/test/kotlin/chatserver/messages/LocalChatMessagesTest.kt @@ -82,6 +82,25 @@ class LocalChatMessagesTest { messages.unsubscribe() } + @Test + fun `when writing message, then receive same message`() = + runTest(dispatcher) { + messages = LocalChatMessages(dispatchers, scope) { flowOf() } + + val emissions = mutableListOf() + backgroundScope.launch { + messages.observe().map { it.item }.collect(emissions::add) + } + messages.subscribe() + advanceTimeBy(10.seconds) + messages.write("Barry is the best.") + + advanceTimeBy(10.seconds) + + emissions.shouldContainInOrder("", "Me: Barry is the best.") + messages.unsubscribe() + } + companion object { private val dispatcher = StandardTestDispatcher() private val dispatchers: RokyDispatchers