From 32c8be0df6a09420ba713d5099eeb37876e828e1 Mon Sep 17 00:00:00 2001 From: Zafar Date: Thu, 5 Dec 2024 15:57:55 +0100 Subject: [PATCH 1/2] chore(association-profile): add offline mode toast to event creation button --- .../android/unio/ui/association/AssociationProfile.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/android/unio/ui/association/AssociationProfile.kt b/app/src/main/java/com/android/unio/ui/association/AssociationProfile.kt index 4c008232f..3a342feeb 100644 --- a/app/src/main/java/com/android/unio/ui/association/AssociationProfile.kt +++ b/app/src/main/java/com/android/unio/ui/association/AssociationProfile.kt @@ -458,6 +458,7 @@ private fun AssociationEvents( eventViewModel: EventViewModel ) { val context = LocalContext.current + val isConnected = Utils.checkInternetConnection(context) var isSeeMoreClicked by remember { mutableStateOf(false) } @@ -496,7 +497,15 @@ private fun AssociationEvents( } if (isAdmin) { Button( - onClick = { navigationAction.navigateTo(Screen.EVENT_CREATION) }, + onClick = { + if (isConnected) { + navigationAction.navigateTo(Screen.EVENT_CREATION) + } else { + Toast.makeText( + context, context.getString(R.string.no_internet_connection), Toast.LENGTH_SHORT) + .show() + } + }, modifier = Modifier.testTag(AssociationProfileTestTags.ADD_EVENT_BUTTON), contentPadding = ButtonDefaults.ButtonWithIconContentPadding) { Icon( From af3ceb1c8307bb88c2f09f433aa6864d89b8030d Mon Sep 17 00:00:00 2001 From: Zafar Date: Thu, 5 Dec 2024 15:58:24 +0100 Subject: [PATCH 2/2] test(association-profile): add event creation button test for online/offline modes --- .../association/AssociationProfileTest.kt | 53 ++++++++++++++++--- 1 file changed, 45 insertions(+), 8 deletions(-) diff --git a/app/src/androidTest/java/com/android/unio/components/association/AssociationProfileTest.kt b/app/src/androidTest/java/com/android/unio/components/association/AssociationProfileTest.kt index 14958ab71..53ffa203f 100644 --- a/app/src/androidTest/java/com/android/unio/components/association/AssociationProfileTest.kt +++ b/app/src/androidTest/java/com/android/unio/components/association/AssociationProfileTest.kt @@ -9,9 +9,9 @@ import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performScrollTo import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat.getSystemService -import androidx.navigation.NavHostController import androidx.test.core.app.ApplicationProvider import com.android.unio.R import com.android.unio.TearDown @@ -35,6 +35,7 @@ import com.android.unio.model.user.UserViewModel import com.android.unio.ui.association.AssociationProfileScaffold import com.android.unio.ui.association.AssociationProfileScreen import com.android.unio.ui.navigation.NavigationAction +import com.android.unio.ui.navigation.Screen import com.google.android.gms.tasks.Task import com.google.firebase.Firebase import com.google.firebase.firestore.CollectionReference @@ -55,13 +56,13 @@ import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.mockk import io.mockk.mockkStatic +import io.mockk.verify import org.junit.Before import org.junit.Rule import org.junit.Test import org.mockito.Mockito.mock import org.mockito.Mockito.`when` import org.mockito.kotlin.any -import org.mockito.kotlin.verify @HiltAndroidTest @UninstallModules(FirebaseModule::class) @@ -70,7 +71,7 @@ class AssociationProfileTest : TearDown() { private lateinit var associations: List private lateinit var events: List - private lateinit var navigationAction: NavigationAction + @MockK private lateinit var navigationAction: NavigationAction private lateinit var eventViewModel: EventViewModel private lateinit var userViewModel: UserViewModel private lateinit var associationViewModel: AssociationViewModel @@ -110,6 +111,10 @@ class AssociationProfileTest : TearDown() { `when`(task.addOnSuccessListener(any())).thenReturn(task) `when`(task.addOnFailureListener(any())).thenReturn(task) + // Mock the navigation action to do nothing + every { navigationAction.navigateTo(any()) } returns Unit + every { navigationAction.goBack() } returns Unit + associations = listOf( MockAssociation.createMockAssociation(uid = "1"), @@ -132,8 +137,6 @@ class AssociationProfileTest : TearDown() { profilePicture = "", ) - navigationAction = NavigationAction(mock(NavHostController::class.java)) - every { eventRepository.init(any()) } answers { (args[0] as () -> Unit).invoke() } every { eventRepository.getEvents(any(), any()) } answers @@ -338,11 +341,9 @@ class AssociationProfileTest : TearDown() { navigationAction, userViewModel, eventViewModel, associationViewModel) {} } - `when`(navigationAction.navController.popBackStack()).thenReturn(true) - composeTestRule.onNodeWithTag(AssociationProfileTestTags.GO_BACK_BUTTON).performClick() - verify(navigationAction.navController).popBackStack() + verify { navigationAction.goBack() } } @Test @@ -371,6 +372,42 @@ class AssociationProfileTest : TearDown() { composeTestRule.onNodeWithTag(AssociationProfileTestTags.SCREEN).assertIsNotDisplayed() } + @Test + fun testAddEventButtonOnline() { + every { connectivityManager?.activeNetwork } returns mockk() + + composeTestRule.setContent { + AssociationProfileScaffold( + navigationAction, userViewModel, eventViewModel, associationViewModel) {} + } + + composeTestRule.onNodeWithTag(AssociationProfileTestTags.ADD_EVENT_BUTTON).assertIsDisplayed() + composeTestRule + .onNodeWithTag(AssociationProfileTestTags.ADD_EVENT_BUTTON) + .performScrollTo() + .performClick() + + verify { navigationAction.navigateTo(Screen.EVENT_CREATION) } + } + + @Test + fun testAddEventButtonOffline() { + every { connectivityManager?.activeNetwork } returns null + + composeTestRule.setContent { + AssociationProfileScaffold( + navigationAction, userViewModel, eventViewModel, associationViewModel) {} + } + + composeTestRule.onNodeWithTag(AssociationProfileTestTags.ADD_EVENT_BUTTON).assertIsDisplayed() + composeTestRule + .onNodeWithTag(AssociationProfileTestTags.ADD_EVENT_BUTTON) + .performScrollTo() + .performClick() + + verify(exactly = 0) { navigationAction.navigateTo(Screen.EVENT_CREATION) } + } + @Module @InstallIn(SingletonComponent::class) object FirebaseTestModule {