@@ -3,9 +3,12 @@ package org.odk.collect.entities.javarosa
33import org.hamcrest.CoreMatchers.equalTo
44import org.hamcrest.MatcherAssert.assertThat
55import org.hamcrest.Matchers.containsInAnyOrder
6+ import org.javarosa.core.model.FormDef
67import org.javarosa.core.model.data.StringData
78import org.javarosa.core.model.data.UncastData
89import org.javarosa.core.model.instance.TreeElement
10+ import org.javarosa.form.api.FormEntryController
11+ import org.javarosa.form.api.FormEntryModel
912import org.javarosa.test.BindBuilderXFormsElement.bind
1013import org.javarosa.test.Scenario
1114import org.javarosa.test.XFormsElement.body
@@ -18,6 +21,7 @@ import org.javarosa.test.XFormsElement.mainInstance
1821import org.javarosa.test.XFormsElement.model
1922import org.javarosa.test.XFormsElement.repeat
2023import org.javarosa.test.XFormsElement.select1
24+ import org.javarosa.test.XFormsElement.select1Dynamic
2125import org.javarosa.test.XFormsElement.setvalue
2226import org.javarosa.test.XFormsElement.t
2327import org.javarosa.test.XFormsElement.title
@@ -26,11 +30,14 @@ import org.javarosa.xform.util.XFormUtils
2630import org.junit.After
2731import org.junit.Before
2832import org.junit.Test
33+ import org.odk.collect.entities.javarosa.filter.LocalEntitiesFilterStrategy
2934import org.odk.collect.entities.javarosa.finalization.EntitiesExtra
3035import org.odk.collect.entities.javarosa.finalization.EntityFormFinalizationProcessor
3136import org.odk.collect.entities.javarosa.finalization.FormEntity
3237import org.odk.collect.entities.javarosa.parse.EntityXFormParserFactory
3338import org.odk.collect.entities.javarosa.spec.EntityAction
39+ import org.odk.collect.entities.storage.Entity
40+ import org.odk.collect.entities.storage.InMemEntitiesRepository
3441
3542class EntitiesTest {
3643 private val entityXFormParserFactory = EntityXFormParserFactory (XFormParserFactory ())
@@ -461,6 +468,15 @@ class EntitiesTest {
461468
462469 @Test
463470 fun `filling form with create or update in repeats makes entities available` () {
471+ val entitiesRepository = InMemEntitiesRepository ()
472+ entitiesRepository.save(" beneficiaries" , Entity .New (" 1" , " Roman Roy" ))
473+
474+ val controllerSupplier: (FormDef ) -> FormEntryController = { formDef ->
475+ FormEntryController (FormEntryModel (formDef)).also {
476+ it.addFilterStrategy(LocalEntitiesFilterStrategy (entitiesRepository))
477+ }
478+ }
479+
464480 val scenario = Scenario .init (
465481 " Create or update entities from repeats form" ,
466482 html(
@@ -474,7 +490,8 @@ class EntitiesTest {
474490 " data id=\" create-or-update-entities-from-repeats-form\" " ,
475491 t(
476492 " people" ,
477- t(" new" ),
493+ t(" beneficiary" ),
494+ t(" new_uuid" ),
478495 t(" name" ),
479496 t(
480497 " meta" ,
@@ -486,35 +503,40 @@ class EntitiesTest {
486503 )
487504 )
488505 ),
489- bind(" /data/people/new" ).type(" string" ),
506+ t(" instance id=\" beneficiaries\" src=\" jr://file-csv/beneficiaries.csv\" " ),
507+ bind(" /data/people/beneficiary" ).type(" string" ),
508+ bind(" /data/people/new_uuid" ).type(" string" ).calculate(" once(uuid())" ).relevant(" /data/people/beneficiary = ''" ),
490509 bind(" /data/people/name" ).type(" string" ).withAttribute(" entities" , " saveto" , " name" ),
491- bind(" /data/people/meta/entity/@create" ).type(" string" ).calculate(" /data/people/new = 'yes '" ),
492- bind(" /data/people/meta/entity/@update" ).type(" string" ).calculate(" /data/people/new != 'yes '" ),
493- bind(" /data/people/meta/entity/@id" ).type(" string" ),
510+ bind(" /data/people/meta/entity/@create" ).type(" string" ).calculate(" /data/people/beneficiary = ''" ),
511+ bind(" /data/people/meta/entity/@update" ).type(" string" ).calculate(" /data/people/beneficiary != ''" ),
512+ bind(" /data/people/meta/entity/@id" ).type(" string" ).calculate( " if(/data/people/beneficiary = '', /data/people/new_uuid , /data/people/beneficiary) " ) ,
494513 bind(" /data/people/meta/entity/label" ).type(" string" ).calculate(" /data/people/name" ),
495514 setvalue(" odk-instance-first-load" , " /data/people/meta/entity/@id" , " uuid()" ),
496515 )
497516 ),
498517 body(
499518 repeat(
500519 " /data/people" ,
501- input(" /data/people/new" ),
520+ select1Dynamic(
521+ " /data/people/beneficiary" ,
522+ " instance('beneficiaries')/root/item" ,
523+ " name" ,
524+ " label"
525+ ),
502526 input(" /data/people/name" ),
503527 setvalue(" odk-new-repeat" , " /data/people/meta/entity/@id" , " uuid()" )
504528 )
505529 )
506- )
530+ ),
531+ controllerSupplier
507532 )
508533
509534 scenario.formEntryController.addPostProcessor(EntityFormFinalizationProcessor ())
510535
511- scenario.answer(" /data/people[1]/new" , " yes" )
512536 scenario.answer(" /data/people[1]/name" , " Tom Wambsgans" )
513-
514537 scenario.createNewRepeat(" /data/people" )
515-
516- scenario.answer(" /data/people[2]/new" , " no" )
517- scenario.answer(" /data/people[2]/name" , " Shiv Roy" )
538+ scenario.answer(" /data/people[2]/beneficiary" , " 1" )
539+ scenario.answer(" /data/people[2]/name" , " Romulus Roy" )
518540 scenario.finalizeInstance()
519541
520542 val entities = scenario.formEntryController.model.extras.get(EntitiesExtra ::class .java).entities
@@ -533,9 +555,9 @@ class EntitiesTest {
533555 FormEntity (
534556 EntityAction .UPDATE ,
535557 " people" ,
536- scenario.answerOf< UncastData >( " /data/people[2]/meta/entity/@id " ).value as String? ,
537- " Shiv Roy" ,
538- listOf (Pair (" name" , " Shiv Roy" ))
558+ " 1 " ,
559+ " Romulus Roy" ,
560+ listOf (Pair (" name" , " Romulus Roy" ))
539561 )
540562 )
541563 )
0 commit comments