Skip to content

Commit

Permalink
Add test
Browse files Browse the repository at this point in the history
  • Loading branch information
FikriMilano committed Aug 19, 2022
1 parent 59abebf commit a4248d7
Show file tree
Hide file tree
Showing 3 changed files with 282 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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

Expand All @@ -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
Expand All @@ -80,6 +99,8 @@ internal class LoginViewModelTest : RobolectricTest() {

private lateinit var fhirResourceDataSource: FhirResourceDataSource

private val application = ApplicationProvider.getApplicationContext<Application>()

@Before
fun setUp() {
hiltRule.inject()
Expand Down Expand Up @@ -235,4 +256,206 @@ internal class LoginViewModelTest : RobolectricTest() {
)
Assert.assertEquals(LoginErrorState.INVALID_CREDENTIALS, loginViewModel.loginErrorState.value)
}

@Test
fun savePractitionerDetailsWithProperPayload() {
val fhirEngine = mockk<FhirEngine>()
val configurationRegistry = mockk<ConfigurationRegistry>()
val accountAuthenticator = mockk<AccountAuthenticator>()
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<KeycloakUserDetails>(
SharedPreferenceKey.PRACTITIONER_DETAILS_USER_DETAIL.name
)
?.userBioData
?.givenName
?.value
)

Assert.assertEquals(
1,
sharedPreferences.read<List<String>>(
SharedPreferenceKey.PRACTITIONER_DETAILS_CARE_TEAM_IDS.name
)
?.size
)

Assert.assertEquals(
1,
sharedPreferences.read<List<String>>(
SharedPreferenceKey.PRACTITIONER_DETAILS_ORGANIZATION_IDS.name
)
?.size
)

Assert.assertEquals(
1,
sharedPreferences.read<List<String>>(
SharedPreferenceKey.PRACTITIONER_DETAILS_LOCATION_IDS.name
)
?.size
)

Assert.assertEquals(
1,
sharedPreferences.read<List<String>>(
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<FhirEngine>()
val configurationRegistry = mockk<ConfigurationRegistry>()
val accountAuthenticator = mockk<AccountAuthenticator>()
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<KeycloakUserDetails>(
SharedPreferenceKey.PRACTITIONER_DETAILS_USER_DETAIL.name
)
?.userBioData
?.givenName
?.value
)

Assert.assertEquals(
0,
sharedPreferences.read<List<String>>(
SharedPreferenceKey.PRACTITIONER_DETAILS_CARE_TEAM_IDS.name
)
?.size
)

Assert.assertEquals(
0,
sharedPreferences.read<List<String>>(
SharedPreferenceKey.PRACTITIONER_DETAILS_ORGANIZATION_IDS.name
)
?.size
)

Assert.assertEquals(
0,
sharedPreferences.read<List<String>>(
SharedPreferenceKey.PRACTITIONER_DETAILS_LOCATION_IDS.name
)
?.size
)

Assert.assertEquals(
0,
sharedPreferences.read<List<String>>(
SharedPreferenceKey.PRACTITIONER_DETAILS_LOCATION_HIERARCHIES.name
)
?.size
)

coVerify(exactly = 3) { fhirEngine.create(*emptyArray()) }
}
}
Original file line number Diff line number Diff line change
@@ -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")
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -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
Expand Down Expand Up @@ -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<QuestionnaireConfig>("object", isSerialized = true)?.id
)
}

@Test
fun writeObjectUsingGson() {
val keycloakUserDetails = KeycloakUserDetails().apply { id = "12345" }
sharedPreferencesHelper.write("object", keycloakUserDetails)
Assert.assertEquals(
keycloakUserDetails.id,
sharedPreferencesHelper.read<KeycloakUserDetails>("object")?.id
)
}
}

0 comments on commit a4248d7

Please sign in to comment.