From a4248d7e3ce54b25a93bde98496a8415e1880095 Mon Sep 17 00:00:00 2001 From: fikrimilano Date: Fri, 19 Aug 2022 19:04:46 +0700 Subject: [PATCH] Add test --- .../engine/ui/login/LoginViewModelTest.kt | 223 ++++++++++++++++++ .../util/PractitionerDetailsUtilTest.kt | 31 +++ .../util/SharedPreferencesHelperTest.kt | 30 ++- 3 files changed, 282 insertions(+), 2 deletions(-) create mode 100644 android/engine/src/test/java/org/smartregister/fhircore/engine/util/PractitionerDetailsUtilTest.kt 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 d52d30b0a0..a923f7c35e 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 @@ -20,8 +20,12 @@ import android.accounts.Account import android.app.Application import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.test.core.app.ApplicationProvider +import com.google.android.fhir.FhirEngine +import com.google.gson.Gson import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest +import io.mockk.coEvery +import io.mockk.coVerify import io.mockk.every import io.mockk.just import io.mockk.mockk @@ -32,6 +36,12 @@ import java.io.IOException import java.net.UnknownHostException import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.runBlocking +import org.hl7.fhir.r4.model.Bundle +import org.hl7.fhir.r4.model.CareTeam +import org.hl7.fhir.r4.model.Location +import org.hl7.fhir.r4.model.Organization +import org.hl7.fhir.r4.model.StringType import org.junit.After import org.junit.Assert import org.junit.Before @@ -48,8 +58,15 @@ import org.smartregister.fhircore.engine.data.remote.model.response.OAuthRespons import org.smartregister.fhircore.engine.robolectric.AccountManagerShadow import org.smartregister.fhircore.engine.robolectric.RobolectricTest import org.smartregister.fhircore.engine.rule.CoroutineTestRule +import org.smartregister.fhircore.engine.util.DefaultDispatcherProvider import org.smartregister.fhircore.engine.util.SecureSharedPreference +import org.smartregister.fhircore.engine.util.SharedPreferenceKey import org.smartregister.fhircore.engine.util.SharedPreferencesHelper +import org.smartregister.model.location.LocationHierarchy +import org.smartregister.model.practitioner.FhirPractitionerDetails +import org.smartregister.model.practitioner.KeycloakUserDetails +import org.smartregister.model.practitioner.PractitionerDetails +import org.smartregister.model.practitioner.UserBioData import retrofit2.Call import retrofit2.Response @@ -72,6 +89,8 @@ internal class LoginViewModelTest : RobolectricTest() { @Inject lateinit var configurationRegistry: ConfigurationRegistry + @Inject lateinit var gson: Gson + private lateinit var loginViewModel: LoginViewModel private lateinit var accountAuthenticatorSpy: AccountAuthenticator @@ -80,6 +99,8 @@ internal class LoginViewModelTest : RobolectricTest() { private lateinit var fhirResourceDataSource: FhirResourceDataSource + private val application = ApplicationProvider.getApplicationContext() + @Before fun setUp() { hiltRule.inject() @@ -235,4 +256,206 @@ internal class LoginViewModelTest : RobolectricTest() { ) Assert.assertEquals(LoginErrorState.INVALID_CREDENTIALS, loginViewModel.loginErrorState.value) } + + @Test + fun savePractitionerDetailsWithProperPayload() { + val fhirEngine = mockk() + val configurationRegistry = mockk() + val accountAuthenticator = mockk() + val dispatcher = DefaultDispatcherProvider() + val sharedPreferences = SharedPreferencesHelper(application, gson) + + val viewModel = + LoginViewModel( + fhirEngine = fhirEngine, + configurationRegistry = configurationRegistry, + accountAuthenticator = accountAuthenticator, + dispatcher = dispatcher, + sharedPreferences = sharedPreferences + ) + + val sampleKeycloakUserDetails = + KeycloakUserDetails().apply { + id = "12345" + userBioData = UserBioData().apply { givenName = StringType("John") } + } + val sampleCareTeam = CareTeam().apply { id = "1" } + val sampleOrganization = Organization().apply { id = "12" } + val sampleLocation = Location().apply { id = "123" } + val sampleLocationHierarchy = LocationHierarchy().apply { id = "1234" } + + val samplePractitionerDetails = + PractitionerDetails().apply { + id = "94859" + userDetail = sampleKeycloakUserDetails + fhirPractitionerDetails = + FhirPractitionerDetails().apply { + careTeams = listOf(sampleCareTeam) + organizations = listOf(sampleOrganization) + locations = listOf(sampleLocation) + locationHierarchyList = listOf(sampleLocationHierarchy) + } + } + + val bundle = + Bundle().apply { + entry = listOf(Bundle.BundleEntryComponent().apply { resource = samplePractitionerDetails }) + } + + coEvery { + fhirEngine.create(*samplePractitionerDetails.fhirPractitionerDetails.careTeams.toTypedArray()) + } returns listOf("1") + + coEvery { + fhirEngine.create( + *samplePractitionerDetails.fhirPractitionerDetails.organizations.toTypedArray() + ) + } returns listOf("12") + + coEvery { + fhirEngine.create(*samplePractitionerDetails.fhirPractitionerDetails.locations.toTypedArray()) + } returns listOf("123") + + runBlocking { viewModel.savePractitionerDetails(bundle) } + + Assert.assertEquals( + "John", + sharedPreferences.read( + SharedPreferenceKey.PRACTITIONER_DETAILS_USER_DETAIL.name + ) + ?.userBioData + ?.givenName + ?.value + ) + + Assert.assertEquals( + 1, + sharedPreferences.read>( + SharedPreferenceKey.PRACTITIONER_DETAILS_CARE_TEAM_IDS.name + ) + ?.size + ) + + Assert.assertEquals( + 1, + sharedPreferences.read>( + SharedPreferenceKey.PRACTITIONER_DETAILS_ORGANIZATION_IDS.name + ) + ?.size + ) + + Assert.assertEquals( + 1, + sharedPreferences.read>( + SharedPreferenceKey.PRACTITIONER_DETAILS_LOCATION_IDS.name + ) + ?.size + ) + + Assert.assertEquals( + 1, + sharedPreferences.read>( + SharedPreferenceKey.PRACTITIONER_DETAILS_LOCATION_HIERARCHIES.name + ) + ?.size + ) + + coVerify { + fhirEngine.create(*samplePractitionerDetails.fhirPractitionerDetails.careTeams.toTypedArray()) + } + + coVerify { + fhirEngine.create( + *samplePractitionerDetails.fhirPractitionerDetails.organizations.toTypedArray() + ) + } + + coVerify { + fhirEngine.create(*samplePractitionerDetails.fhirPractitionerDetails.locations.toTypedArray()) + } + } + + @Test + fun savePractitionerDetailsWhenFhirPractitionerDetailsIsNull() { + val fhirEngine = mockk() + val configurationRegistry = mockk() + val accountAuthenticator = mockk() + val dispatcher = DefaultDispatcherProvider() + val sharedPreferences = SharedPreferencesHelper(application, gson) + + val viewModel = + LoginViewModel( + fhirEngine = fhirEngine, + configurationRegistry = configurationRegistry, + accountAuthenticator = accountAuthenticator, + dispatcher = dispatcher, + sharedPreferences = sharedPreferences + ) + + val sampleKeycloakUserDetails = + KeycloakUserDetails().apply { + id = "12345" + userBioData = UserBioData().apply { givenName = StringType("John") } + } + + val samplePractitionerDetails = + PractitionerDetails().apply { + id = "94859" + userDetail = sampleKeycloakUserDetails + fhirPractitionerDetails = FhirPractitionerDetails() + } + + val bundle = + Bundle().apply { + entry = listOf(Bundle.BundleEntryComponent().apply { resource = samplePractitionerDetails }) + } + + coEvery { fhirEngine.create(*emptyArray()) } returns listOf() + + runBlocking { viewModel.savePractitionerDetails(bundle) } + + Assert.assertEquals( + "John", + sharedPreferences.read( + SharedPreferenceKey.PRACTITIONER_DETAILS_USER_DETAIL.name + ) + ?.userBioData + ?.givenName + ?.value + ) + + Assert.assertEquals( + 0, + sharedPreferences.read>( + SharedPreferenceKey.PRACTITIONER_DETAILS_CARE_TEAM_IDS.name + ) + ?.size + ) + + Assert.assertEquals( + 0, + sharedPreferences.read>( + SharedPreferenceKey.PRACTITIONER_DETAILS_ORGANIZATION_IDS.name + ) + ?.size + ) + + Assert.assertEquals( + 0, + sharedPreferences.read>( + SharedPreferenceKey.PRACTITIONER_DETAILS_LOCATION_IDS.name + ) + ?.size + ) + + Assert.assertEquals( + 0, + sharedPreferences.read>( + SharedPreferenceKey.PRACTITIONER_DETAILS_LOCATION_HIERARCHIES.name + ) + ?.size + ) + + coVerify(exactly = 3) { fhirEngine.create(*emptyArray()) } + } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/PractitionerDetailsUtilTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/PractitionerDetailsUtilTest.kt new file mode 100644 index 0000000000..5a5dd206d2 --- /dev/null +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/PractitionerDetailsUtilTest.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2021 Ona Systems, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.smartregister.fhircore.engine.util + +import org.junit.Assert +import org.junit.Test + +class PractitionerDetailsUtilTest { + + @Test + fun getUrl() { + Assert.assertEquals( + "practitioner-details?keycloak-uuid=my-keycloak-id", + PractitionerDetailsUtil.getUrl("my-keycloak-id") + ) + } +} diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SharedPreferencesHelperTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SharedPreferencesHelperTest.kt index a07ff43f14..6de2bb1da7 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SharedPreferencesHelperTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SharedPreferencesHelperTest.kt @@ -19,14 +19,17 @@ package org.smartregister.fhircore.engine.util import android.app.Application import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.test.core.app.ApplicationProvider +import com.google.gson.Gson import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest -import io.mockk.mockk +import javax.inject.Inject import org.junit.Assert import org.junit.Before import org.junit.Rule import org.junit.Test +import org.smartregister.fhircore.engine.configuration.QuestionnaireConfig import org.smartregister.fhircore.engine.robolectric.RobolectricTest +import org.smartregister.model.practitioner.KeycloakUserDetails @HiltAndroidTest internal class SharedPreferencesHelperTest : RobolectricTest() { @@ -39,9 +42,12 @@ internal class SharedPreferencesHelperTest : RobolectricTest() { private lateinit var sharedPreferencesHelper: SharedPreferencesHelper + @Inject lateinit var gson: Gson + @Before fun setUp() { - sharedPreferencesHelper = SharedPreferencesHelper(context = application, gson = mockk()) + hiltRule.inject() + sharedPreferencesHelper = SharedPreferencesHelper(context = application, gson = gson) } @Test @@ -76,4 +82,24 @@ internal class SharedPreferencesHelperTest : RobolectricTest() { sharedPreferencesHelper.write("anyLongKey", 123456789) Assert.assertEquals(123456789, sharedPreferencesHelper.read("anyLongKey", 0)) } + + @Test + fun writeObjectUsingSerialized() { + val questionnaireConfig = QuestionnaireConfig(id = "123", title = "my-questionnaire") + sharedPreferencesHelper.write("object", questionnaireConfig) + Assert.assertEquals( + questionnaireConfig.id, + sharedPreferencesHelper.read("object", isSerialized = true)?.id + ) + } + + @Test + fun writeObjectUsingGson() { + val keycloakUserDetails = KeycloakUserDetails().apply { id = "12345" } + sharedPreferencesHelper.write("object", keycloakUserDetails) + Assert.assertEquals( + keycloakUserDetails.id, + sharedPreferencesHelper.read("object")?.id + ) + } }