diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/DevViewModel.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/DevViewModel.kt index 72297405f1..7a2f7aae97 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/DevViewModel.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/DevViewModel.kt @@ -88,7 +88,10 @@ constructor( log = "${log}Id,${group.key},Date" + "\n" + - group.value.joinToString(separator = "\n") { "${it.id},${it.version},${it.date}" } + + group.value.joinToString(separator = "\n") @ExcludeFromJacocoGeneratedReport + { + "${it.id},${it.version},${it.date}" + } + "" + "\n-----------------------------------------------------\n" } @@ -115,7 +118,8 @@ constructor( fun fetchDetails() { try { - viewModelScope.launch { + viewModelScope.launch @ExcludeFromJacocoGeneratedReport + { val userInfo = keycloakService.fetchUserInfo().body() if (userInfo != null && !userInfo.keycloakUuid.isNullOrEmpty()) { val bundle = diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/SettingsScreen.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/SettingsScreen.kt index 276b8abf8a..e2b5bf160a 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/SettingsScreen.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/SettingsScreen.kt @@ -84,24 +84,29 @@ fun SettingsScreen( ) { ModalBottomSheetLayout( sheetState = devMenuSheetState, - sheetContent = { - DevMenu(viewModel = devViewModel) { - scope.launch { - devMenuSheetState.hide() - viewResSheetState.show() + sheetContent = + @ExcludeFromJacocoGeneratedReport + { + DevMenu(viewModel = devViewModel) { + scope.launch @ExcludeFromJacocoGeneratedReport + { + devMenuSheetState.hide() + viewResSheetState.show() + } } } - } ) { Scaffold( topBar = { TopAppBar( title = {}, - navigationIcon = { - IconButton(onClick = { navController?.popBackStack() }) { - Icon(Icons.Default.ArrowBack, "") + navigationIcon = + @ExcludeFromJacocoGeneratedReport + { + IconButton(onClick = { navController?.popBackStack() }) { + Icon(Icons.Default.ArrowBack, "") + } } - } ) } ) { paddingValues -> @@ -129,14 +134,19 @@ fun SettingsScreen( UserProfileRow( icon = Icons.Rounded.BugReport, text = "Dev Menu", - clickListener = { scope.launch { devMenuSheetState.show() } }, + clickListener = + @ExcludeFromJacocoGeneratedReport + { + scope.launch @ExcludeFromJacocoGeneratedReport { devMenuSheetState.show() } + }, modifier = modifier ) UserProfileRow( icon = Icons.Rounded.Logout, text = stringResource(id = R.string.logout), - clickListener = { settingsViewModel.logoutUser(context) }, + clickListener = + @ExcludeFromJacocoGeneratedReport { settingsViewModel.logoutUser(context) }, modifier = modifier ) } @@ -157,7 +167,7 @@ fun UserProfileRow( modifier = modifier .fillMaxWidth() - .clickable { clickListener() } + .clickable @ExcludeFromJacocoGeneratedReport { clickListener() } .padding(vertical = 16.dp, horizontal = 20.dp), horizontalArrangement = Arrangement.SpaceBetween ) { diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/SettingsViewModel.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/SettingsViewModel.kt index 53e434b2bb..ad11a4a9a2 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/SettingsViewModel.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/SettingsViewModel.kt @@ -69,7 +69,7 @@ constructor( val data = MutableLiveData() init { - viewModelScope.launch { fetchData() } + viewModelScope.launch @ExcludeFromJacocoGeneratedReport { fetchData() } } private suspend fun fetchData() { @@ -123,7 +123,8 @@ constructor( fun logoutUser(context: Context) { onLogout.postValue(true) - accountAuthenticator.logout { + accountAuthenticator.logout @ExcludeFromJacocoGeneratedReport + { context.getActivity()?.launchActivityWithNoBackStackHistory() } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/views/DevMenu.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/views/DevMenu.kt index 74f95777f2..6059bdfdfb 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/views/DevMenu.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/views/DevMenu.kt @@ -42,13 +42,18 @@ fun DevMenu(viewModel: DevViewModel, viewRes: () -> Unit) { ) { Button( modifier = Modifier.fillMaxWidth(), - onClick = { scope.launch { viewModel.createResourceReport(context) } } + onClick = + @ExcludeFromJacocoGeneratedReport + { + scope.launch @ExcludeFromJacocoGeneratedReport { viewModel.createResourceReport(context) } + } ) { Text(text = "Export Report Resources") } Button(modifier = Modifier.fillMaxWidth(), onClick = viewRes) { Text(text = "View Report Resources") } - Button(modifier = Modifier.fillMaxWidth(), onClick = { viewModel.fetchDetails() }) { - Text(text = "Test Fetch") - } + Button( + modifier = Modifier.fillMaxWidth(), + onClick = @ExcludeFromJacocoGeneratedReport { viewModel.fetchDetails() } + ) { Text(text = "Test Fetch") } } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/views/ViewResources.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/views/ViewResources.kt index 2129b1b6c7..c477b645d9 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/views/ViewResources.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/views/ViewResources.kt @@ -47,16 +47,23 @@ import org.smartregister.fhircore.engine.util.annotation.ExcludeFromJacocoGenera fun ViewResourceReport(viewModel: DevViewModel) { var data by remember { mutableStateOf(mapOf>()) } - LaunchedEffect(viewModel) { data = viewModel.getResourcesToReport() } + LaunchedEffect(viewModel) @ExcludeFromJacocoGeneratedReport + { + data = viewModel.getResourcesToReport() + } Scaffold { paddingValues -> LazyColumn( verticalArrangement = Arrangement.spacedBy(8.dp), modifier = Modifier.padding(paddingValues).padding(horizontal = 12.dp) - ) { + ) @ExcludeFromJacocoGeneratedReport + { data.entries.forEach { group -> run { - stickyHeader { Text(text = group.key, style = MaterialTheme.typography.h5) } + stickyHeader @ExcludeFromJacocoGeneratedReport + { + Text(text = group.key, style = MaterialTheme.typography.h5) + } items(group.value) { item -> Card(Modifier.fillMaxWidth()) { Column( diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/login/LoginViewModelTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/login/LoginViewModelTest.kt index 3eb139854a..af9a96265a 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/login/LoginViewModelTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/login/LoginViewModelTest.kt @@ -114,7 +114,7 @@ internal class LoginViewModelTest : RobolectricTest() { } @Test - fun testSuccessfulOfflineLogin() { + fun testSuccessfulOfflineLogin() = runTest { val activity = mockedActivity() updateCredentials() @@ -134,7 +134,7 @@ internal class LoginViewModelTest : RobolectricTest() { Assert.assertTrue(loginViewModel.navigateToHome.value!!) } @Test - fun testUnSuccessfulOfflineLogin() { + fun testUnSuccessfulOfflineLogin() = runTest { val activity = mockedActivity() updateCredentials() @@ -155,7 +155,7 @@ internal class LoginViewModelTest : RobolectricTest() { } @Test - fun testSuccessfulOnlineLoginWithActiveSessionWithSavedPractitionerDetails() { + fun testSuccessfulOnlineLoginWithActiveSessionWithSavedPractitionerDetails() = runTest { updateCredentials() sharedPreferencesHelper.write( SharedPreferenceKey.PRACTITIONER_DETAILS.name, @@ -187,16 +187,28 @@ internal class LoginViewModelTest : RobolectricTest() { } @Test - fun testSuccessfulOnlineLoginWithActiveSessionWithNoPractitionerDetailsSaved() { + fun testSuccessfulOnlineLoginWithActiveSessionWithNoPractitionerDetailsSaved() = runTest { updateCredentials() every { tokenAuthenticator.sessionActive() } returns true + coEvery { + tokenAuthenticator.fetchAccessToken(thisUsername, thisPassword.toCharArray()) + } returns + Result.success( + OAuthResponse( + accessToken = "very_new_top_of_the_class_access_token", + tokenType = "you_guess_it", + refreshToken = "another_very_refreshing_token", + refreshExpiresIn = 540000, + scope = "open_my_guy" + ) + ) loginViewModel.login(mockedActivity(isDeviceOnline = true)) val toHome = loginViewModel.navigateToHome.value!! Assert.assertFalse(toHome) } @Test - fun testUnSuccessfulOnlineLoginUsingDifferentUsername() { + fun testUnSuccessfulOnlineLoginUsingDifferentUsername() = runTest { updateCredentials() secureSharedPreference.saveCredentials("nativeUser", "n4t1veP5wd".toCharArray()) every { tokenAuthenticator.sessionActive() } returns false @@ -209,7 +221,7 @@ internal class LoginViewModelTest : RobolectricTest() { } @Test - fun testSuccessfulNewOnlineLoginShouldFetchUserInfoAndPractitioner() { + fun testSuccessfulNewOnlineLoginShouldFetchUserInfoAndPractitioner() = runTest { updateCredentials() secureSharedPreference.saveCredentials(thisUsername, thisPassword.toCharArray()) every { tokenAuthenticator.sessionActive() } returns false @@ -250,7 +262,7 @@ internal class LoginViewModelTest : RobolectricTest() { } @Test - fun testUnSuccessfulOnlineLoginUserInfoNotFetched() { + fun testUnSuccessfulOnlineLoginUserInfoNotFetched() = runTest { updateCredentials() secureSharedPreference.saveCredentials(thisUsername, thisPassword.toCharArray()) every { tokenAuthenticator.sessionActive() } returns false @@ -281,7 +293,7 @@ internal class LoginViewModelTest : RobolectricTest() { } @Test - fun testUnSuccessfulOnlineLoginPractitionerDetailsNotFetchedException() { + fun testUnSuccessfulOnlineLoginPractitionerDetailsNotFetchedException() = runTest { updateCredentials() secureSharedPreference.saveCredentials(thisUsername, thisPassword.toCharArray()) every { tokenAuthenticator.sessionActive() } returns false @@ -312,7 +324,7 @@ internal class LoginViewModelTest : RobolectricTest() { } @Test - fun testUnSuccessfulOnlineLoginWhenAccessTokenNotReceived() { + fun testUnSuccessfulOnlineLoginWhenAccessTokenNotReceived() = runTest { updateCredentials() secureSharedPreference.saveCredentials(thisUsername, thisPassword.toCharArray()) every { tokenAuthenticator.sessionActive() } returns false @@ -360,14 +372,14 @@ internal class LoginViewModelTest : RobolectricTest() { } @Test - fun testUpdateNavigateShouldUpdateLiveData() { + fun testUpdateNavigateShouldUpdateLiveData() = runTest { loginViewModel.updateNavigateHome(true) Assert.assertNotNull(loginViewModel.navigateToHome.value) Assert.assertTrue(loginViewModel.navigateToHome.value!!) } @Test - fun testForgotPasswordLoadsContact() { + fun testForgotPasswordLoadsContact() = runTest { loginViewModel.forgotPassword() Assert.assertEquals("tel:0123456789", loginViewModel.launchDialPad.value) }