From 32d7723f036c0048f1136cf5c84336d4fcd591ce Mon Sep 17 00:00:00 2001 From: Siddharth Agarwal Date: Tue, 25 Aug 2026 19:26:05 +0530 Subject: [PATCH] [SIMPLEBGD-65] Update blood pressure high-range criteria for Bangladesh (#5905) --- CHANGELOG.md | 4 ++ ...PressureHistoryListItemPagingSourceTest.kt | 7 +++- ...loodPressureHistoryListItemPagingSource.kt | 20 +++++++-- .../simple/clinic/bp/BloodPressureLevel.kt | 14 +++++++ ...BloodPressureHistoryScreenEffectHandler.kt | 42 ++++++++++++++----- .../BloodPressureSummaryViewEffect.kt | 4 ++ .../BloodPressureSummaryViewEffectHandler.kt | 23 +++++++++- .../BloodPressureSummaryViewEvent.kt | 3 ++ .../BloodPressureSummaryViewInit.kt | 7 ++-- .../BloodPressureSummaryViewModel.kt | 20 +++++++-- .../BloodPressureSummaryViewUi.kt | 6 ++- .../BloodPressureSummaryViewUiRenderer.kt | 2 +- .../BloodPressureSummaryViewUpdate.kt | 1 + .../ui/BloodPressureSummaryView.kt | 25 +++++++++-- ...dPressureHistoryScreenEffectHandlerTest.kt | 23 +++++++++- ...oodPressureSummaryViewEffectHandlerTest.kt | 33 ++++++++++++++- .../BloodPressureSummaryViewUiRendererTest.kt | 34 ++++++++++++--- .../BloodPressureSummaryViewUpdateTest.kt | 17 +++++++- 18 files changed, 246 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9061eb143f4..8da1a0a5b08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,10 @@ - Bump Gradle to v9.7.0 - Replace legacy edittext-mask dependency with custom DateOfBirthEditText for DOB input masking +### Changes + +- Update blood pressure high-range criteria for diabetic patients in Bangladesh to ≥130/80 mmHg + ## 2026.08.03 ### Internal diff --git a/app/src/androidTest/java/org/simple/clinic/bp/BloodPressureHistoryListItemPagingSourceTest.kt b/app/src/androidTest/java/org/simple/clinic/bp/BloodPressureHistoryListItemPagingSourceTest.kt index 47df85b08ba..09bd66fd6f7 100644 --- a/app/src/androidTest/java/org/simple/clinic/bp/BloodPressureHistoryListItemPagingSourceTest.kt +++ b/app/src/androidTest/java/org/simple/clinic/bp/BloodPressureHistoryListItemPagingSourceTest.kt @@ -15,6 +15,7 @@ import org.simple.clinic.TestClinicApp import org.simple.clinic.bp.history.adapter.BloodPressureHistoryListItem import org.simple.clinic.util.scheduler.SchedulersProvider import org.simple.clinic.TestData +import org.simple.clinic.appconfig.Country import org.simple.clinic.util.Rules import org.simple.clinic.util.TestUserClock import org.simple.clinic.util.TestUtcClock @@ -138,11 +139,13 @@ class BloodPressureHistoryListItemPagingSourceTest { appDatabase = appDatabase, utcClock = utcClock, userClock = userClock, - bpEditableDuration = Duration.ofMinutes(10), schedulersProvider = schedulersProvider, + country = TestData.country(), dateFormatter = dateFormatter, timeFormatter = timeFormatter, - source = appDatabase.bloodPressureDao().allBloodPressuresPagingSource(patientUuid) + bpEditableDuration = Duration.ofMinutes(10), + source = appDatabase.bloodPressureDao().allBloodPressuresPagingSource(patientUuid), + hasDiabetes = false ) val pager = TestPager( diff --git a/app/src/main/java/org/simple/clinic/bp/BloodPressureHistoryListItemPagingSource.kt b/app/src/main/java/org/simple/clinic/bp/BloodPressureHistoryListItemPagingSource.kt index 4553fde3ccb..925aca09828 100644 --- a/app/src/main/java/org/simple/clinic/bp/BloodPressureHistoryListItemPagingSource.kt +++ b/app/src/main/java/org/simple/clinic/bp/BloodPressureHistoryListItemPagingSource.kt @@ -10,6 +10,7 @@ import dagger.assisted.AssistedInject import kotlinx.coroutines.rx2.asCoroutineDispatcher import kotlinx.coroutines.withContext import org.simple.clinic.AppDatabase +import org.simple.clinic.appconfig.Country import org.simple.clinic.bp.history.adapter.BloodPressureHistoryListItem import org.simple.clinic.bp.history.adapter.BloodPressureHistoryListItem.BloodPressureHistoryItem import org.simple.clinic.util.INVALID @@ -29,17 +30,20 @@ class BloodPressureHistoryListItemPagingSource @AssistedInject constructor( private val utcClock: UtcClock, private val userClock: UserClock, private val schedulersProvider: SchedulersProvider, + private val country: Country, @Named("full_date") private val dateFormatter: DateTimeFormatter, @Named("time_for_measurement_history") private val timeFormatter: DateTimeFormatter, @Assisted private val bpEditableDuration: Duration, - @Assisted private val source: PagingSource + @Assisted private val source: PagingSource, + @Assisted private val hasDiabetes: Boolean ) : PagingSource() { @AssistedFactory interface Factory { fun create( bpEditableDuration: Duration, - source: PagingSource + source: PagingSource, + hasDiabetes: Boolean ): BloodPressureHistoryListItemPagingSource } @@ -75,7 +79,9 @@ class BloodPressureHistoryListItemPagingSource @AssistedInject constructor( } } - private fun convertToBloodPressureHistoryListItems(measurements: List): List { + private fun convertToBloodPressureHistoryListItems( + measurements: List, + ): List { val measurementsByDate = measurements.groupBy { it.recordedAt.toLocalDateAtZone(userClock.zone) } return measurementsByDate.mapValues { (_, measurementsList) -> @@ -91,10 +97,16 @@ class BloodPressureHistoryListItemPagingSource @AssistedInject constructor( null } + val isHighBp = BloodPressureLevel.isHigh( + measurement = measurement, + country = country, + hasDiabetes = hasDiabetes + ) + BloodPressureHistoryItem( measurement = measurement, isBpEditable = isBpEditable, - isBpHigh = measurement.level.isHigh, + isBpHigh = isHighBp, bpDate = dateFormatter.format(recordedAt), bpTime = bpTime ) diff --git a/app/src/main/java/org/simple/clinic/bp/BloodPressureLevel.kt b/app/src/main/java/org/simple/clinic/bp/BloodPressureLevel.kt index a9e58443ba5..8e6c25d46bd 100644 --- a/app/src/main/java/org/simple/clinic/bp/BloodPressureLevel.kt +++ b/app/src/main/java/org/simple/clinic/bp/BloodPressureLevel.kt @@ -1,6 +1,7 @@ package org.simple.clinic.bp import org.simple.clinic.R +import org.simple.clinic.appconfig.Country import java.util.Optional enum class BloodPressureLevel(private val urgency: Int, val displayTextRes: Optional) { @@ -23,8 +24,21 @@ enum class BloodPressureLevel(private val urgency: Int, val displayTextRes: Opti MODERATELY_HIGH, VERY_HIGH, EXTREMELY_HIGH -> true } + companion object { + fun isHigh( + measurement: BloodPressureMeasurement, + country: Country, + hasDiabetes: Boolean + ): Boolean { + return when (compute(measurement)) { + LOW, NORMAL -> false + MILDLY_HIGH -> country.isoCountryCode == Country.BANGLADESH && hasDiabetes + MODERATELY_HIGH, VERY_HIGH, EXTREMELY_HIGH -> true + } + } + fun compute(measurement: BloodPressureMeasurement): BloodPressureLevel { val systolicLevel = computeSystolic(measurement) val diastolicLevel = computeDiastolic(measurement) diff --git a/app/src/main/java/org/simple/clinic/bp/history/BloodPressureHistoryScreenEffectHandler.kt b/app/src/main/java/org/simple/clinic/bp/history/BloodPressureHistoryScreenEffectHandler.kt index ff25554140c..dfd82556d40 100644 --- a/app/src/main/java/org/simple/clinic/bp/history/BloodPressureHistoryScreenEffectHandler.kt +++ b/app/src/main/java/org/simple/clinic/bp/history/BloodPressureHistoryScreenEffectHandler.kt @@ -8,21 +8,27 @@ import dagger.assisted.AssistedInject import io.reactivex.ObservableTransformer import io.reactivex.Scheduler import kotlinx.coroutines.CoroutineScope +import org.simple.clinic.appconfig.Country import org.simple.clinic.bp.BloodPressureHistoryListItemPagingSource import org.simple.clinic.bp.BloodPressureRepository +import org.simple.clinic.medicalhistory.Answer +import org.simple.clinic.medicalhistory.MedicalHistoryRepository import org.simple.clinic.patient.PatientRepository import org.simple.clinic.summary.PatientSummaryConfig import org.simple.clinic.util.PagerFactory import org.simple.clinic.util.extractIfPresent import org.simple.clinic.util.scheduler.SchedulersProvider +import org.simple.clinic.uuid.UuidGenerator class BloodPressureHistoryScreenEffectHandler @AssistedInject constructor( private val bloodPressureRepository: BloodPressureRepository, + private val medicalHistoryRepository: MedicalHistoryRepository, private val patientRepository: PatientRepository, private val schedulersProvider: SchedulersProvider, private val pagerFactory: PagerFactory, private val pagingSourceFactory: BloodPressureHistoryListItemPagingSource.Factory, private val patientSummaryConfig: PatientSummaryConfig, + private val uuidGenerator: UuidGenerator, @Assisted private val viewEffectsConsumer: Consumer, @Assisted private val pagingCacheScope: () -> CoroutineScope ) { @@ -44,22 +50,36 @@ class BloodPressureHistoryScreenEffectHandler @AssistedInject constructor( .build() } - private fun loadBloodPressureHistory(): ObservableTransformer { + private fun loadBloodPressureHistory(): + ObservableTransformer { + return ObservableTransformer { effects -> effects .observeOn(schedulersProvider.io()) - .flatMap { - val pagingSource = bloodPressureRepository.allBloodPressuresPagingSource(it.patientUuid) + .flatMap { effect -> + val pagingSource = + bloodPressureRepository.allBloodPressuresPagingSource( + effect.patientUuid + ) + + medicalHistoryRepository + .historyForPatientOrDefault( + defaultHistoryUuid = uuidGenerator.v4(), + patientUuid = effect.patientUuid + ) + .flatMap { history -> - pagerFactory.createPager( - sourceFactory = { - pagingSourceFactory.create( - bpEditableDuration = patientSummaryConfig.bpEditableDuration, - source = pagingSource, + pagerFactory.createPager( + sourceFactory = { + pagingSourceFactory.create( + bpEditableDuration = patientSummaryConfig.bpEditableDuration, + source = pagingSource, + hasDiabetes = history.diagnosedWithDiabetes == Answer.Yes + ) + }, + cacheScope = pagingCacheScope.invoke(), ) - }, - cacheScope = pagingCacheScope.invoke(), - ) + } } .map(::BloodPressuresHistoryLoaded) } diff --git a/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewEffect.kt b/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewEffect.kt index 961212a3df4..81f20f73d05 100644 --- a/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewEffect.kt +++ b/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewEffect.kt @@ -10,6 +10,10 @@ data class LoadBloodPressures( val numberOfBpsToDisplay: Int ) : BloodPressureSummaryViewEffect() +data class LoadMedicalHistory( + val patientUuid: UUID, +) : BloodPressureSummaryViewEffect() + data class LoadBloodPressuresCount(val patientUuid: UUID) : BloodPressureSummaryViewEffect() data class OpenBloodPressureEntrySheet( diff --git a/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewEffectHandler.kt b/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewEffectHandler.kt index e9a5e49d0c4..f1f0cf47768 100644 --- a/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewEffectHandler.kt +++ b/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewEffectHandler.kt @@ -9,13 +9,17 @@ import io.reactivex.ObservableTransformer import io.reactivex.Scheduler import org.simple.clinic.bp.BloodPressureRepository import org.simple.clinic.facility.Facility +import org.simple.clinic.medicalhistory.MedicalHistoryRepository import org.simple.clinic.util.scheduler.SchedulersProvider +import org.simple.clinic.uuid.UuidGenerator class BloodPressureSummaryViewEffectHandler @AssistedInject constructor( private val bloodPressureRepository: BloodPressureRepository, + private val medicalHistoryRepository: MedicalHistoryRepository, private val schedulersProvider: SchedulersProvider, private val facility: Lazy, - @Assisted private val uiActions: BloodPressureSummaryViewUiActions + @Assisted private val uiActions: BloodPressureSummaryViewUiActions, + private val uuidGenerator: UuidGenerator, ) { @AssistedFactory @@ -32,6 +36,7 @@ class BloodPressureSummaryViewEffectHandler @AssistedInject constructor( .addConsumer(OpenBloodPressureEntrySheet::class.java, { uiActions.openBloodPressureEntrySheet(it.patientUuid, it.currentFacility) }, schedulersProvider.ui()) .addConsumer(OpenBloodPressureUpdateSheet::class.java, { uiActions.openBloodPressureUpdateSheet(it.id) }, schedulersProvider.ui()) .addConsumer(ShowBloodPressureHistoryScreen::class.java, { uiActions.showBloodPressureHistoryScreen(it.patientUuid) }, schedulersProvider.ui()) + .addTransformer(LoadMedicalHistory::class.java, loadMedicalHistory(schedulersProvider.io())) .build() } @@ -71,4 +76,20 @@ class BloodPressureSummaryViewEffectHandler @AssistedInject constructor( .map(::CurrentFacilityLoaded) } } + + private fun loadMedicalHistory( + scheduler: Scheduler + ): ObservableTransformer { + return ObservableTransformer { effects -> + effects + .observeOn(scheduler) + .flatMap { + medicalHistoryRepository.historyForPatientOrDefault( + defaultHistoryUuid = uuidGenerator.v4(), + patientUuid = it.patientUuid + ) + } + .map(::MedicalHistoryLoaded) + } + } } diff --git a/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewEvent.kt b/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewEvent.kt index 29b414725a9..86bf2177269 100644 --- a/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewEvent.kt +++ b/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewEvent.kt @@ -2,6 +2,7 @@ package org.simple.clinic.summary.bloodpressures import org.simple.clinic.bp.BloodPressureMeasurement import org.simple.clinic.facility.Facility +import org.simple.clinic.medicalhistory.MedicalHistory import org.simple.clinic.widgets.UiEvent import java.util.UUID @@ -13,6 +14,8 @@ data class BloodPressuresCountLoaded(val count: Int) : BloodPressureSummaryViewE data class CurrentFacilityLoaded(val facility: Facility) : BloodPressureSummaryViewEvent() +data class MedicalHistoryLoaded(val medicalHistory: MedicalHistory) : BloodPressureSummaryViewEvent() + data object AddNewBloodPressureClicked : BloodPressureSummaryViewEvent() { override val analyticsName = "Patient Summary:Add New BP Clicked" } diff --git a/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewInit.kt b/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewInit.kt index 611b414b1ef..6052bf4e29a 100644 --- a/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewInit.kt +++ b/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewInit.kt @@ -8,9 +8,10 @@ class BloodPressureSummaryViewInit( private val config: BloodPressureSummaryViewConfig ) : Init { override fun init(model: BloodPressureSummaryViewModel): First { - val effects = mutableSetOf() - - effects.add(LoadBloodPressuresCount(model.patientUuid)) + val effects = mutableSetOf( + LoadBloodPressuresCount(model.patientUuid), + LoadMedicalHistory(model.patientUuid) + ) if (!model.hasLoadedFacility) { effects.add(LoadCurrentFacility) diff --git a/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewModel.kt b/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewModel.kt index 4ba54dce0a9..fb76775b013 100644 --- a/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewModel.kt +++ b/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewModel.kt @@ -4,6 +4,8 @@ import android.os.Parcelable import kotlinx.parcelize.Parcelize import org.simple.clinic.bp.BloodPressureMeasurement import org.simple.clinic.facility.Facility +import org.simple.clinic.medicalhistory.Answer +import org.simple.clinic.medicalhistory.MedicalHistory import org.simple.clinic.summary.PatientSummaryChildModel import java.util.UUID @@ -12,10 +14,18 @@ data class BloodPressureSummaryViewModel( val patientUuid: UUID, val latestBloodPressuresToDisplay: List?, val totalRecordedBloodPressureCount: Int?, - val facility: Facility? + val facility: Facility?, + val diagnosedWithDiabetes: Answer?, ) : Parcelable, PatientSummaryChildModel { companion object { - fun create(patientUuid: UUID) = BloodPressureSummaryViewModel(patientUuid, null, null, null) + fun create(patientUuid: UUID) = + BloodPressureSummaryViewModel( + patientUuid, + null, + null, + null, + null + ) } val hasLoadedCountOfBloodSugars: Boolean @@ -28,7 +38,7 @@ data class BloodPressureSummaryViewModel( get() = facility!!.config.diabetesManagementEnabled override fun readyToRender(): Boolean { - return hasLoadedCountOfBloodSugars && latestBloodPressuresToDisplay != null + return hasLoadedCountOfBloodSugars && latestBloodPressuresToDisplay != null && diagnosedWithDiabetes != null } fun bloodPressuresLoaded(bloodPressures: List): BloodPressureSummaryViewModel = @@ -39,4 +49,8 @@ data class BloodPressureSummaryViewModel( fun currentFacilityLoaded(facility: Facility): BloodPressureSummaryViewModel = copy(facility = facility) + + fun medicalHistoryLoaded(medicalHistory: MedicalHistory): BloodPressureSummaryViewModel = + copy(diagnosedWithDiabetes = medicalHistory.diagnosedWithDiabetes) + } diff --git a/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUi.kt b/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUi.kt index ebe3ccb8e2a..c09706958a6 100644 --- a/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUi.kt +++ b/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUi.kt @@ -1,10 +1,14 @@ package org.simple.clinic.summary.bloodpressures import org.simple.clinic.bp.BloodPressureMeasurement +import org.simple.clinic.medicalhistory.Answer interface BloodPressureSummaryViewUi { fun showNoBloodPressuresView() - fun showBloodPressures(bloodPressures: List) + fun showBloodPressures( + bloodPressures: List, + diagnosedWithDiabetes: Answer?, + ) fun showSeeAllButton() fun hideSeeAllButton() } diff --git a/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUiRenderer.kt b/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUiRenderer.kt index 1b0681cfda7..f4cf970f010 100644 --- a/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUiRenderer.kt +++ b/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUiRenderer.kt @@ -10,7 +10,7 @@ class BloodPressureSummaryViewUiRenderer( when { model.latestBloodPressuresToDisplay == null -> return model.latestBloodPressuresToDisplay.isEmpty() -> ui.showNoBloodPressuresView() - else -> ui.showBloodPressures(model.latestBloodPressuresToDisplay) + else -> ui.showBloodPressures(model.latestBloodPressuresToDisplay, model.diagnosedWithDiabetes) } if (model.hasLoadedFacility && model.hasLoadedCountOfBloodSugars) { diff --git a/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUpdate.kt b/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUpdate.kt index d7553606896..71e95320b88 100644 --- a/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUpdate.kt +++ b/app/src/main/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUpdate.kt @@ -21,6 +21,7 @@ class BloodPressureSummaryViewUpdate( is AddNewBloodPressureClicked -> dispatch(OpenBloodPressureEntrySheet(model.patientUuid, model.facility!!)) is BloodPressureClicked -> dispatch(OpenBloodPressureUpdateSheet(event.id)) is SeeAllClicked -> dispatch(ShowBloodPressureHistoryScreen(model.patientUuid)) + is MedicalHistoryLoaded -> next(model.medicalHistoryLoaded(event.medicalHistory)) } } diff --git a/app/src/main/java/org/simple/clinic/summary/bloodpressures/ui/BloodPressureSummaryView.kt b/app/src/main/java/org/simple/clinic/summary/bloodpressures/ui/BloodPressureSummaryView.kt index 4b4d83b49bd..a42b12a20e3 100644 --- a/app/src/main/java/org/simple/clinic/summary/bloodpressures/ui/BloodPressureSummaryView.kt +++ b/app/src/main/java/org/simple/clinic/summary/bloodpressures/ui/BloodPressureSummaryView.kt @@ -17,6 +17,8 @@ import io.reactivex.rxkotlin.cast import io.reactivex.rxkotlin.ofType import io.reactivex.subjects.PublishSubject import org.simple.clinic.ReportAnalyticsEvents +import org.simple.clinic.appconfig.Country +import org.simple.clinic.bp.BloodPressureLevel import org.simple.clinic.bp.BloodPressureMeasurement import org.simple.clinic.bp.entry.BloodPressureEntrySheet import org.simple.clinic.bp.history.BloodPressureHistoryScreen @@ -25,6 +27,7 @@ import org.simple.clinic.di.injector import org.simple.clinic.facility.Facility import org.simple.clinic.facility.alertchange.AlertFacilityChangeSheet import org.simple.clinic.facility.alertchange.Continuation.ContinueToActivity +import org.simple.clinic.medicalhistory.Answer import org.simple.clinic.mobius.MobiusDelegate import org.simple.clinic.navigation.v2.ActivityResult import org.simple.clinic.navigation.v2.Router @@ -103,6 +106,9 @@ class BloodPressureSummaryView( @Inject lateinit var screenKeyProvider: ScreenKeyProvider + @Inject + lateinit var country: Country + private val viewEvents = PublishSubject.create() private var summaryItems by mutableStateOf(emptyList()) @@ -189,14 +195,18 @@ class BloodPressureSummaryView( super.onRestoreInstanceState(delegate.onRestoreInstanceState(state)) } - override fun showBloodPressures(bloodPressures: List) { + override fun showBloodPressures( + bloodPressures: List, + diagnosedWithDiabetes: Answer?, + ) { val bpSummaryItems = generateBPSummaryItems( measurements = bloodPressures, canEditFor = patientSummaryConfig.bpEditableDuration, utcClock = utcClock, userClock = userClock, dateFormatter = dateFormatter, - timeFormatter = timeFormatter + timeFormatter = timeFormatter, + diagnosedWithDiabetes = diagnosedWithDiabetes ) summaryItems = bpSummaryItems @@ -253,7 +263,8 @@ class BloodPressureSummaryView( utcClock: UtcClock, userClock: UserClock, dateFormatter: DateTimeFormatter, - timeFormatter: DateTimeFormatter + timeFormatter: DateTimeFormatter, + diagnosedWithDiabetes: Answer?, ): List { val measurementByDate = measurements.groupBy { it.recordedAt.toLocalDateAtZone(userClock.zone) } @@ -268,13 +279,19 @@ class BloodPressureSummaryView( null } + val isHighBp = BloodPressureLevel.isHigh( + measurement = measurement, + country = country, + hasDiabetes = diagnosedWithDiabetes == Answer.Yes + ) + BloodPressureSummaryItem( id = measurement.uuid, systolic = measurement.reading.systolic, diastolic = measurement.reading.diastolic, date = dateFormatter.format(recordedAt), time = bpTime, - isHigh = measurement.level.isHigh, + isHigh = isHighBp, canEdit = isBpEditable ) } diff --git a/app/src/test/java/org/simple/clinic/bp/history/BloodPressureHistoryScreenEffectHandlerTest.kt b/app/src/test/java/org/simple/clinic/bp/history/BloodPressureHistoryScreenEffectHandlerTest.kt index 6b75cc500dc..7a2ae87bdd4 100644 --- a/app/src/test/java/org/simple/clinic/bp/history/BloodPressureHistoryScreenEffectHandlerTest.kt +++ b/app/src/test/java/org/simple/clinic/bp/history/BloodPressureHistoryScreenEffectHandlerTest.kt @@ -13,8 +13,11 @@ import org.mockito.kotlin.verify import org.mockito.kotlin.verifyNoInteractions import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.whenever +import org.simple.clinic.TestData import org.simple.clinic.bp.BloodPressureRepository import org.simple.clinic.bp.history.adapter.BloodPressureHistoryListItem +import org.simple.clinic.medicalhistory.Answer +import org.simple.clinic.medicalhistory.MedicalHistoryRepository import org.simple.clinic.mobius.EffectHandlerTestCase import org.simple.clinic.patient.Patient import org.simple.clinic.patient.PatientRepository @@ -22,7 +25,7 @@ import org.simple.clinic.summary.PatientSummaryConfig import org.simple.clinic.util.PagerFactory import org.simple.clinic.util.PagingSourceFactory import org.simple.clinic.util.scheduler.TestSchedulersProvider -import org.simple.clinic.TestData +import org.simple.clinic.uuid.FakeUuidGenerator import java.time.Duration import java.time.Instant import java.time.temporal.ChronoUnit @@ -33,13 +36,18 @@ class BloodPressureHistoryScreenEffectHandlerTest { private val patientRepository = mock() private val bloodPressureRepository = mock() + + private val medicalHistoryRepository = mock() private val patientUuid = UUID.fromString("433d058f-daef-47a7-8c61-95f1a220cbcb") private val uiActions = mock() private val viewEffectHandler = BloodPressureHistoryViewEffectHandler(uiActions) private val pagerFactory = mock() private val pagingCacheScope = TestScope() + + private val uuidGenerator = FakeUuidGenerator(uuid = UUID.fromString("e78ec5f7-6fe9-4812-a894-9e34e55c670e")) private val effectHandler = BloodPressureHistoryScreenEffectHandler( bloodPressureRepository, + medicalHistoryRepository, patientRepository, TestSchedulersProvider.trampoline(), pagerFactory = pagerFactory, @@ -48,6 +56,7 @@ class BloodPressureHistoryScreenEffectHandlerTest { bpEditableDuration = Duration.ofMinutes(10), numberOfMeasurementsForTeleconsultation = 0, ), + uuidGenerator = uuidGenerator, viewEffectsConsumer = viewEffectHandler::handle, pagingCacheScope = { pagingCacheScope } ).build() @@ -146,6 +155,18 @@ class BloodPressureHistoryScreenEffectHandlerTest { ), )) + val medicalHistory = TestData.medicalHistory( + hasDiabetes = Answer.No + ) + + whenever( + medicalHistoryRepository.historyForPatientOrDefault( + defaultHistoryUuid = any(), + patientUuid = eq(patientUuid) + ) + ) doReturn Observable.just(medicalHistory) + + whenever(pagerFactory.createPager( sourceFactory = any>(), pageSize = eq(25), diff --git a/app/src/test/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewEffectHandlerTest.kt b/app/src/test/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewEffectHandlerTest.kt index 11a462998d2..1f3cf2cb4d1 100644 --- a/app/src/test/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewEffectHandlerTest.kt +++ b/app/src/test/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewEffectHandlerTest.kt @@ -2,6 +2,7 @@ package org.simple.clinic.summary.bloodpressures import dagger.Lazy import io.reactivex.Observable +import io.sentry.util.UUIDGenerator import org.junit.After import org.junit.Test import org.mockito.kotlin.doReturn @@ -12,22 +13,30 @@ import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.whenever import org.simple.clinic.TestData import org.simple.clinic.bp.BloodPressureRepository +import org.simple.clinic.medicalhistory.MedicalHistoryRepository import org.simple.clinic.mobius.EffectHandlerTestCase import org.simple.clinic.util.scheduler.TrampolineSchedulersProvider +import org.simple.clinic.uuid.FakeUuidGenerator import java.util.UUID class BloodPressureSummaryViewEffectHandlerTest { private val uiActions = mock() private val bloodPressureRepository = mock() + + private val medicalHistoryRepository = mock() private val patientUuid = UUID.fromString("6b00207f-a613-4adc-9a72-dff68481a3ff") private val currentFacility = TestData.facility(uuid = UUID.fromString("2257f737-0e8a-452d-a270-66bdc2422664")) + private val uuidGenerator = FakeUuidGenerator(uuid = UUID.fromString("e78ec5f7-6fe9-4812-a894-9e34e55c670e")) + private val effectHandler = BloodPressureSummaryViewEffectHandler( bloodPressureRepository = bloodPressureRepository, + medicalHistoryRepository = medicalHistoryRepository, schedulersProvider = TrampolineSchedulersProvider(), - facility = Lazy { currentFacility }, - uiActions = uiActions + facility = { currentFacility }, + uiActions = uiActions, + uuidGenerator = uuidGenerator ).build() private val testCase = EffectHandlerTestCase(effectHandler) @@ -118,4 +127,24 @@ class BloodPressureSummaryViewEffectHandlerTest { verify(uiActions).showBloodPressureHistoryScreen(patientUuid) verifyNoMoreInteractions(uiActions) } + + @Test + fun `when load medical history effect is received, then load medical history`() { + // given + val medicalHistory = TestData.medicalHistory( + uuid = UUID.fromString("8568fd00-7de8-469e-a869-e92e54eb7f9b"), + patientUuid = patientUuid + ) + whenever(medicalHistoryRepository.historyForPatientOrDefault( + patientUuid = patientUuid, + defaultHistoryUuid = uuidGenerator.v4() + )) doReturn Observable.just(medicalHistory) + + // when + testCase.dispatch(LoadMedicalHistory(patientUuid)) + + // then + testCase.assertOutgoingEvents(MedicalHistoryLoaded(medicalHistory)) + verifyNoInteractions(uiActions) + } } diff --git a/app/src/test/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUiRendererTest.kt b/app/src/test/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUiRendererTest.kt index fb9f28810ac..bf4c92f7fa9 100644 --- a/app/src/test/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUiRendererTest.kt +++ b/app/src/test/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUiRendererTest.kt @@ -48,7 +48,7 @@ class BloodPressureSummaryViewUiRendererTest { } @Test - fun `when blood pressures are loaded, then show blood pressures`() { + fun `when blood pressures and medical history are loaded, then show blood pressures`() { // given val bloodPressure = TestData.bloodPressureMeasurement( uuid = UUID.fromString("58ff9789-c295-41ca-bab3-becb4e9b7861"), @@ -57,16 +57,22 @@ class BloodPressureSummaryViewUiRendererTest { val bloodPressures = listOf(bloodPressure) val bloodPressuresCount = bloodPressures.size + val medicalHistory = TestData.medicalHistory( + uuid = UUID.fromString("8568fd00-7de8-469e-a869-e92e54eb7f9b"), + patientUuid = patientUuid + ) + // when uiRenderer.render( defaultModel .currentFacilityLoaded(facility) .bloodPressuresCountLoaded(bloodPressuresCount) .bloodPressuresLoaded(bloodPressures) + .medicalHistoryLoaded(medicalHistory) ) // then - verify(ui).showBloodPressures(bloodPressures) + verify(ui).showBloodPressures(bloodPressures, medicalHistory.diagnosedWithDiabetes) verify(ui).hideSeeAllButton() verifyNoMoreInteractions(ui) } @@ -102,16 +108,22 @@ class BloodPressureSummaryViewUiRendererTest { ) ) + val medicalHistory = TestData.medicalHistory( + uuid = UUID.fromString("8568fd00-7de8-469e-a869-e92e54eb7f9b"), + patientUuid = patientUuid + ) + // when uiRenderer.render( defaultModel .currentFacilityLoaded(facility) .bloodPressuresLoaded(bloodPressures) .bloodPressuresCountLoaded(bloodPressuresCount) + .medicalHistoryLoaded(medicalHistory) ) // then - verify(ui).showBloodPressures(bloodPressures) + verify(ui).showBloodPressures(bloodPressures, medicalHistory.diagnosedWithDiabetes) verify(ui).showSeeAllButton() verifyNoMoreInteractions(ui) } @@ -177,16 +189,22 @@ class BloodPressureSummaryViewUiRendererTest { ) ) + val medicalHistory = TestData.medicalHistory( + uuid = UUID.fromString("8568fd00-7de8-469e-a869-e92e54eb7f9b"), + patientUuid = patientUuid + ) + // when uiRenderer.render( defaultModel .currentFacilityLoaded(facility) .bloodPressuresLoaded(bloodPressures) .bloodPressuresCountLoaded(bloodPressuresCount) + .medicalHistoryLoaded(medicalHistory) ) // then - verify(ui).showBloodPressures(bloodPressures) + verify(ui).showBloodPressures(bloodPressures, medicalHistory.diagnosedWithDiabetes) verify(ui).showSeeAllButton() verifyNoMoreInteractions(ui) } @@ -209,16 +227,22 @@ class BloodPressureSummaryViewUiRendererTest { val bloodPressures = listOf(bloodPressure1, bloodPressure2, bloodPressure3) val bloodPressureCount = bloodPressures.size + val medicalHistory = TestData.medicalHistory( + uuid = UUID.fromString("8568fd00-7de8-469e-a869-e92e54eb7f9b"), + patientUuid = patientUuid + ) + // when uiRenderer.render( defaultModel .currentFacilityLoaded(facility) .bloodPressuresLoaded(bloodPressures) .bloodPressuresCountLoaded(bloodPressureCount) + .medicalHistoryLoaded(medicalHistory) ) // then - verify(ui).showBloodPressures(bloodPressures) + verify(ui).showBloodPressures(bloodPressures, medicalHistory.diagnosedWithDiabetes) verify(ui).hideSeeAllButton() verifyNoMoreInteractions(ui) } diff --git a/app/src/test/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUpdateTest.kt b/app/src/test/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUpdateTest.kt index fda1025114d..c097ffba2bd 100644 --- a/app/src/test/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUpdateTest.kt +++ b/app/src/test/java/org/simple/clinic/summary/bloodpressures/BloodPressureSummaryViewUpdateTest.kt @@ -15,7 +15,7 @@ class BloodPressureSummaryViewUpdateTest { private val patientUuid = UUID.fromString("8f1befda-f99e-4d26-aff3-cecb90925df1") private val defaultModel = BloodPressureSummaryViewModel.create(patientUuid) private val config = BloodPressureSummaryViewConfig(numberOfBpsToDisplay = 3, numberOfBpsToDisplayWithoutDiabetesManagement = 8) - private val updateSpec = UpdateSpec(BloodPressureSummaryViewUpdate(config)) + private val updateSpec = UpdateSpec(BloodPressureSummaryViewUpdate(config)) @Test fun `when blood pressures are loaded, then show blood pressures`() { @@ -149,4 +149,19 @@ class BloodPressureSummaryViewUpdateTest { hasEffects(ShowBloodPressureHistoryScreen(patientUuid) as BloodPressureSummaryViewEffect) )) } + + @Test + fun `when medical history is loaded, then update the model`() { + val medicalHistory = TestData.medicalHistory(UUID.fromString("8568fd00-7de8-469e-a869-e92e54eb7f9b")) + + updateSpec + .given(defaultModel) + .whenEvent(MedicalHistoryLoaded(medicalHistory)) + .then( + assertThatNext( + hasModel(defaultModel.medicalHistoryLoaded(medicalHistory)), + hasNoEffects() + ) + ) + } }