Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bugfix: Fix adding members to conversation #167

Merged
merged 6 commits into from
Dec 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,10 @@ internal class login_moduleTest : BaseComposeTest() {
}
}


/**
* Test if a ViewModel can be initialized without errors.
* @param parameters The parameters to pass to the ViewModel constructor
*/
@OptIn(KoinInternalApi::class)
private inline fun <reified T: ViewModel> ComposeContentTestRule.testViewModelInitialization(
noinline parameters: ParametersDefinition? = null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ val manageConversationsModule = module {
viewModel { params ->
ConversationAddMembersViewModel(
params[0],
get(),
params[1],
get(),
get(),
get(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,11 @@ fun NavGraphBuilder.conversationAddMembersScreen(
conversationNavGraphBuilderExtension(
route = "course/{courseId}/conversations/{conversationId}/settings/add_members",
deepLink = "artemis://courses/{courseId}/conversations/{conversationId}/settings/add_members"
) { courseId, _ ->
) { courseId, conversationId ->
ConversationAddMembersScreen(
modifier = Modifier.fillMaxSize(),
courseId = courseId,
conversationId = conversationId,
onNavigateBack = onNavigateBack
)
}
Expand All @@ -58,11 +59,12 @@ fun NavGraphBuilder.conversationAddMembersScreen(
fun ConversationAddMembersScreen(
modifier: Modifier,
courseId: Long,
conversationId: Long,
onNavigateBack: () -> Unit
) {
ConversationAddMembersScreen(
modifier = modifier,
viewModel = koinViewModel { parametersOf(courseId) },
viewModel = koinViewModel { parametersOf(courseId, conversationId) },
onNavigateBack
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package de.tum.informatics.www1.artemis.native_app.feature.metis.manageconversations

import android.app.Application
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import androidx.lifecycle.ViewModel
import androidx.test.platform.app.InstrumentationRegistry
import de.tum.informatics.www1.artemis.native_app.core.common.test.DefaultTestTimeoutMillis
import de.tum.informatics.www1.artemis.native_app.core.common.test.UnitTest
import de.tum.informatics.www1.artemis.native_app.core.test.BaseComposeTest
import de.tum.informatics.www1.artemis.native_app.core.test.coreTestModules
import de.tum.informatics.www1.artemis.native_app.feature.metis.manageconversations.ui.conversation.browse_channels.BrowseChannelsViewModel
import de.tum.informatics.www1.artemis.native_app.feature.metis.manageconversations.ui.conversation.create_channel.CreateChannelViewModel
import de.tum.informatics.www1.artemis.native_app.feature.metis.manageconversations.ui.conversation.create_personal_conversation.CreatePersonalConversationViewModel
import de.tum.informatics.www1.artemis.native_app.feature.metis.manageconversations.ui.conversation.overview.ConversationOverviewViewModel
import de.tum.informatics.www1.artemis.native_app.feature.metis.manageconversations.ui.conversation.settings.add_members.ConversationAddMembersViewModel
import de.tum.informatics.www1.artemis.native_app.feature.metis.manageconversations.ui.conversation.settings.members.ConversationMembersViewModel
import de.tum.informatics.www1.artemis.native_app.feature.metis.manageconversations.ui.conversation.settings.overview.ConversationSettingsViewModel
import de.tum.informatics.www1.artemis.native_app.feature.metis.shared.sharedConversationModule
import org.junit.Rule
import org.junit.experimental.categories.Category
import org.junit.runner.RunWith
import org.koin.android.ext.koin.androidContext
import org.koin.androidx.compose.koinViewModel
import org.koin.compose.LocalKoinApplication
import org.koin.compose.LocalKoinScope
import org.koin.core.annotation.KoinInternalApi
import org.koin.core.parameter.ParametersDefinition
import org.koin.core.parameter.parametersOf
import org.koin.mp.KoinPlatformTools
import org.koin.test.KoinTestRule
import org.robolectric.RobolectricTestRunner
import kotlin.test.Test


@RunWith(RobolectricTestRunner::class)
@Category(UnitTest::class)
internal class manage_conversations_moduleTest : BaseComposeTest() {

@get:Rule
val koinTestRule = KoinTestRule.create {
androidContext(InstrumentationRegistry.getInstrumentation().context)

modules(coreTestModules)
modules(manageConversationsModule, sharedConversationModule)
}

private val courseId = 1L
private val conversationId = 22L
private val testContext = context.applicationContext as Application

@Test(timeout = DefaultTestTimeoutMillis)
fun `the manage_conversations_module initializes ConversationOverviewViewModel without errors`() {
composeTestRule.testViewModelInitialization<ConversationOverviewViewModel>() {
parametersOf(testContext, courseId)
}
}

@Test(timeout = DefaultTestTimeoutMillis)
fun `the manage_conversations_module initializes CreatePersonalConversationViewModel without errors`() {
composeTestRule.testViewModelInitialization<CreatePersonalConversationViewModel>() {
parametersOf(courseId)
}
}

@Test(timeout = DefaultTestTimeoutMillis)
fun `the manage_conversations_module initializes CreateChannelViewModel without errors`() {
composeTestRule.testViewModelInitialization<CreateChannelViewModel>() {
parametersOf(courseId)
}
}

@Test(timeout = DefaultTestTimeoutMillis)
fun `the manage_conversations_module initializes BrowseChannelsViewModel without errors`() {
composeTestRule.testViewModelInitialization<BrowseChannelsViewModel>() {
parametersOf(courseId)
}
}

@Test(timeout = DefaultTestTimeoutMillis)
fun `the manage_conversations_module initializes ConversationSettingsViewModel without errors`() {
composeTestRule.testViewModelInitialization<ConversationSettingsViewModel> {
parametersOf(courseId, conversationId)
}
}

@Test(timeout = DefaultTestTimeoutMillis)
fun `the manage_conversations_module initializes ConversationMembersViewModel without errors`() {
composeTestRule.testViewModelInitialization<ConversationMembersViewModel> {
parametersOf(courseId, conversationId)
}
}

@Test(timeout = DefaultTestTimeoutMillis)
fun `the manage_conversations_module initializes ConversationAddMembersViewModel without errors`() {
composeTestRule.testViewModelInitialization<ConversationAddMembersViewModel> {
parametersOf(courseId, conversationId)
}
}

/**
* Test if a ViewModel can be initialized without errors.
* @param parameters The parameters to pass to the ViewModel constructor
*/
@OptIn(KoinInternalApi::class)
private inline fun <reified T: ViewModel> ComposeContentTestRule.testViewModelInitialization(
noinline parameters: ParametersDefinition? = null
) {
setContent {
// This is a workaround to make koin work in tests.
// See: https://github.com/InsertKoinIO/koin/issues/1557#issue-1660665501
CompositionLocalProvider(
LocalKoinScope provides KoinPlatformTools.defaultContext()
.get().scopeRegistry.rootScope,
LocalKoinApplication provides KoinPlatformTools.defaultContext().get()
) {
koinViewModel<T>(parameters = parameters)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ internal fun SinglePageConversationBody(
ConversationAddMembersScreen(
modifier = modifier,
courseId = courseId,
conversationId = config.conversationId,
onNavigateBack = { configuration = config.prevConfiguration }
)
}
Expand Down
Loading