Skip to content

Commit bc3edd0

Browse files
committed
[ANDROAPP-5645] Close enrollment data section if already completed
Signed-off-by: Pablo <[email protected]>
1 parent 5ef760c commit bc3edd0

File tree

2 files changed

+152
-39
lines changed

2 files changed

+152
-39
lines changed

form/src/main/java/org/dhis2/form/data/EnrollmentRepository.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,11 @@ class EnrollmentRepository(
4646

4747
override fun sectionUids(): Flowable<List<String>> {
4848
val sectionUids = mutableListOf(ENROLLMENT_DATA_SECTION_UID)
49-
sectionUids.addAll(programSections.map { it.uid() })
49+
if (programSections.isEmpty()) {
50+
sectionUids.add(SINGLE_SECTION_UID)
51+
} else {
52+
sectionUids.addAll(programSections.map { it.uid() })
53+
}
5054
return Flowable.just(sectionUids)
5155
}
5256

@@ -442,7 +446,7 @@ class EnrollmentRepository(
442446
}
443447

444448
override fun firstSectionToOpen(): String? {
445-
return if (isEnrollmentDataCompleted()) {
449+
return if (enrollmentMode == EnrollmentMode.CHECK && isEnrollmentDataCompleted()) {
446450
sectionUids().blockingFirst().filterIndexed { index, _ -> index != 0 }.firstOrNull()
447451
} else {
448452
super.firstSectionToOpen()

form/src/test/java/org/dhis2/form/data/FormRepositoryIntegrationTest.kt

Lines changed: 146 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,179 @@
11
package org.dhis2.form.data
22

3-
import io.reactivex.Single
3+
import org.dhis2.form.data.metadata.EnrollmentConfiguration
44
import org.dhis2.form.model.EnrollmentMode
55
import org.dhis2.form.model.SectionUiModelImpl
6-
import org.dhis2.form.ui.FieldViewModelFactory
6+
import org.dhis2.form.ui.FieldViewModelFactoryImpl
7+
import org.dhis2.form.ui.provider.AutoCompleteProvider
78
import org.dhis2.form.ui.provider.DisplayNameProvider
89
import org.dhis2.form.ui.provider.EnrollmentFormLabelsProvider
10+
import org.dhis2.form.ui.provider.HintProvider
11+
import org.dhis2.form.ui.provider.KeyboardActionProvider
12+
import org.dhis2.form.ui.provider.LayoutProvider
913
import org.dhis2.form.ui.provider.LegendValueProvider
14+
import org.dhis2.form.ui.provider.UiEventTypesProvider
15+
import org.dhis2.form.ui.provider.UiStyleProvider
1016
import org.dhis2.form.ui.validation.FieldErrorMessageProvider
11-
import org.hisp.dhis.android.core.D2
17+
import org.hisp.dhis.android.core.common.FeatureType
18+
import org.hisp.dhis.android.core.common.ObjectStyle
19+
import org.hisp.dhis.android.core.common.ObjectWithUid
20+
import org.hisp.dhis.android.core.common.ValueType
1221
import org.hisp.dhis.android.core.enrollment.Enrollment
1322
import org.hisp.dhis.android.core.program.Program
23+
import org.hisp.dhis.android.core.program.ProgramTrackedEntityAttribute
24+
import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttribute
25+
import org.hisp.dhis.android.core.trackedentity.TrackedEntityType
1426
import org.junit.Assert.assertTrue
27+
import org.junit.Before
1528
import org.junit.Test
16-
import org.mockito.Mockito
1729
import org.mockito.kotlin.any
1830
import org.mockito.kotlin.doReturn
1931
import org.mockito.kotlin.mock
2032
import org.mockito.kotlin.whenever
33+
import java.util.Date
2134

2235
class FormRepositoryIntegrationTest {
2336
private val rulesUtilsProvider: RulesUtilsProvider = mock()
2437
private val ruleEngineRepository: RuleEngineRepository = mock()
2538
private val formValueStore: FormValueStore = mock()
2639
private val fieldErrorMessageProvider: FieldErrorMessageProvider = mock()
27-
private val displayNameProvider: DisplayNameProvider = mock()
28-
private val legendValueProvider: LegendValueProvider = mock()
29-
private val fieldViewModelFactory: FieldViewModelFactory = mock()
30-
private val enrollmentUid = "enrollmentUid"
31-
private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS)
32-
private val enrollmentFormLabelsProvider: EnrollmentFormLabelsProvider = mock()
40+
private val conf: EnrollmentConfiguration = mock()
41+
private val enrollmentFormLabelsProvider: EnrollmentFormLabelsProvider = mock {
42+
on { provideEnrollmentOrgUnitLabel() } doReturn "OrgUnit label"
43+
}
44+
45+
private val program: Program = mock {
46+
on { description() } doReturn "program description"
47+
on { enrollmentDateLabel() } doReturn "enrollment date label"
48+
on { selectEnrollmentDatesInFuture() } doReturn false
49+
on { displayIncidentDate() } doReturn false
50+
on { access() } doReturn mock()
51+
on { access().data() } doReturn mock()
52+
on { access().data().write() } doReturn true
53+
on { featureType() } doReturn FeatureType.NONE
54+
}
55+
56+
private val teType: TrackedEntityType = mock {
57+
on { access() } doReturn mock()
58+
on { access().data() } doReturn mock()
59+
on { access().data().write() } doReturn true
60+
on { featureType() } doReturn FeatureType.NONE
61+
}
62+
63+
@Before
64+
fun setUp() {
65+
whenever(conf.sections()) doReturn emptyList()
66+
val programAttribute: ProgramTrackedEntityAttribute = mock {
67+
on { trackedEntityAttribute() } doReturn ObjectWithUid.create("teAttributeUid")
68+
on { mandatory() } doReturn false
69+
}
70+
whenever(conf.programAttributes()) doReturn listOf(programAttribute)
71+
val teAttribute: TrackedEntityAttribute = mock {
72+
on { uid() } doReturn "teAttributeUid"
73+
on { valueType() } doReturn ValueType.TEXT
74+
on { optionSet() } doReturn null
75+
on { generated() } doReturn false
76+
on { style() } doReturn ObjectStyle.builder().build()
77+
on { fieldMask() } doReturn null
78+
}
79+
whenever(conf.trackedEntityAttribute("teAttributeUid")) doReturn teAttribute
80+
whenever(conf.attributeValue(any())) doReturn null
81+
whenever(conf.conflicts()) doReturn emptyList()
82+
whenever(conf.program()) doReturn program
83+
whenever(conf.trackedEntityType()) doReturn teType
84+
whenever(conf.captureOrgUnitsCount()) doReturn 1
85+
86+
whenever(enrollmentFormLabelsProvider.provideSingleSectionLabel()) doReturn "single section label"
87+
}
88+
89+
@Test
90+
fun shouldOpenEnrollmentDetailSectionIfIsNewAndNotCompleted() {
91+
mockUncompletedEnrollment()
92+
whenever(conf.disableCollapsableSectionsInProgram(any())) doReturn false
93+
94+
val repository = mockFormRepository()
95+
96+
val fields = repository.fetchFormItems()
97+
assertTrue((fields.first { it.isSection() } as SectionUiModelImpl).isOpen == true)
98+
}
99+
100+
@Test
101+
fun shouldOpenEnrollmentDetailSectionIfIsNewAndCompleted() {
102+
mockCompletedEnrollment()
103+
whenever(conf.disableCollapsableSectionsInProgram(any())) doReturn false
104+
105+
val repository = mockFormRepository(EnrollmentMode.NEW)
106+
107+
val fields = repository.fetchFormItems()
108+
assertTrue((fields.first { it.isSection() } as SectionUiModelImpl).isOpen == true)
109+
}
110+
111+
@Test
112+
fun shouldOpenEnrollmentDetailSectionIfNotCompleted() {
113+
mockUncompletedEnrollment()
114+
whenever(conf.disableCollapsableSectionsInProgram(any())) doReturn false
115+
116+
val repository = mockFormRepository(EnrollmentMode.CHECK)
117+
118+
val fields = repository.fetchFormItems()
119+
assertTrue((fields.first { it.isSection() } as SectionUiModelImpl).isOpen == true)
120+
}
33121

34122
@Test
35-
fun shouldOpenEnrollmentDetailSection() {
123+
fun shouldNotOpenEnrollmentDetailSectionIfCompleted() {
124+
mockCompletedEnrollment()
125+
whenever(conf.disableCollapsableSectionsInProgram(any())) doReturn false
126+
127+
val repository = mockFormRepository(EnrollmentMode.CHECK)
128+
129+
val fields = repository.fetchFormItems()
130+
assertTrue(
131+
(fields.filter { it.isSection() }[1] as SectionUiModelImpl).isOpen == true,
132+
)
133+
}
134+
135+
private fun mockUncompletedEnrollment() {
36136
val enrollment: Enrollment = mock {
137+
on { enrollmentDate() } doReturn null
138+
on { organisationUnit() } doReturn "orgUnitUid"
37139
}
140+
whenever(conf.enrollment()) doReturn enrollment
141+
}
38142

39-
val program: Program = mock {
40-
on { uid() } doReturn "programUid"
143+
private fun mockCompletedEnrollment() {
144+
val enrollment: Enrollment = mock {
145+
on { enrollmentDate() } doReturn Date()
146+
on { organisationUnit() } doReturn "orgUnitUid"
41147
}
148+
whenever(conf.enrollment()) doReturn enrollment
149+
}
150+
151+
private fun mockFormRepository(enrollmentMode: EnrollmentMode = EnrollmentMode.NEW): FormRepositoryImpl {
152+
val styleProvider: UiStyleProvider = mock()
153+
val layoutProvider: LayoutProvider = mock()
154+
val hintProvider: HintProvider = mock()
155+
val displayNameProvider: DisplayNameProvider = mock()
156+
val uiEventTypesProvider: UiEventTypesProvider = mock()
157+
val keyboardActionProvider: KeyboardActionProvider = mock()
158+
val legendValueProvider: LegendValueProvider = mock()
159+
val autoCompleteProvider: AutoCompleteProvider = mock()
42160

43-
whenever(d2.enrollmentModule().enrollments().uid("enrollmentUid")) doReturn mock()
44-
whenever(
45-
d2.enrollmentModule().enrollments().uid("enrollmentUid").blockingGet(),
46-
) doReturn enrollment
47-
whenever(d2.programModule().programs().uid(any()).get()) doReturn Single.just(program)
48-
whenever(d2.programModule().programSections().byProgramUid()) doReturn mock()
49-
whenever(d2.programModule().programSections().byProgramUid().eq(any())) doReturn mock()
50-
whenever(
51-
d2.programModule().programSections().byProgramUid().eq(any()).withAttributes(),
52-
) doReturn mock()
53-
whenever(
54-
d2.programModule().programSections().byProgramUid().eq(any()).withAttributes().get(),
55-
) doReturn Single.just(mockedProgramSections)
161+
val fieldFactory = FieldViewModelFactoryImpl(
162+
false,
163+
styleProvider,
164+
layoutProvider,
165+
hintProvider,
166+
displayNameProvider,
167+
uiEventTypesProvider,
168+
keyboardActionProvider,
169+
legendValueProvider,
170+
autoCompleteProvider,
171+
)
56172

57173
val dataEntryRepository = EnrollmentRepository(
58-
fieldViewModelFactory,
59-
enrollmentUid,
60-
d2,
61-
EnrollmentMode.NEW,
174+
fieldFactory,
175+
conf,
176+
enrollmentMode,
62177
enrollmentFormLabelsProvider,
63178
)
64179

@@ -72,12 +187,6 @@ class FormRepositoryIntegrationTest {
72187
legendValueProvider,
73188
false,
74189
)
75-
76-
whenever(d2.programModule())
77-
78-
val fields = repository.fetchFormItems()
79-
assertTrue((fields.first { it.isSection() } as SectionUiModelImpl).isOpen == true)
190+
return repository
80191
}
81192
}
82-
83-
const val mockedProgramSections = listOf()

0 commit comments

Comments
 (0)