def test_case_list_form_requires_parent_case_but_target_doesnt( self, *args): factory = AppFactory(build_version='2.9.0') register_household_module, register_household_form = factory.new_basic_module( 'new_household', 'household') factory.form_opens_case(register_household_form) households, edit_household_form = factory.new_basic_module( 'households', 'household', case_list_form=register_household_form) factory.form_requires_case(edit_household_form) register_member_module, register_member_form = factory.new_advanced_module( 'new_member', 'member') factory.form_requires_case(register_member_form, 'household') factory.form_opens_case(register_member_form, 'member', is_subcase=True) members, edit_member_form = factory.new_basic_module( 'members', 'member', case_list_form=register_member_form) factory.form_requires_case(edit_member_form) suite = factory.app.create_suite() self.assertXmlEqual(self.get_xml('source_requires_case_target_doesnt'), suite)
def test_link_to_child_module(self): factory = AppFactory(build_version='2.9.0/latest') m0, m0f0 = factory.new_basic_module('enroll child', 'child') factory.form_opens_case(m0f0) m1, m1f0 = factory.new_basic_module('child visit', 'child') factory.form_requires_case(m1f0) factory.form_opens_case(m1f0, case_type='visit', is_subcase=True) m2, m2f0 = factory.new_advanced_module('visit history', 'visit', parent_module=m1) factory.form_requires_case(m2f0, 'child') factory.form_requires_case(m2f0, 'visit', parent_case_type='child') m0f0.post_form_workflow = WORKFLOW_FORM m0f0.form_links = [ FormLink(xpath="true()", form_id=m1f0.unique_id), ] m1f0.post_form_workflow = WORKFLOW_FORM m1f0.form_links = [ FormLink(xpath="true()", form_id=m2f0.unique_id), ] self.assertXmlPartialEqual(self.get_xml('form_link_tdh'), factory.app.create_suite(), "./entry")
def test_form_links_submodule(self): """ Test that when linking between two forms in a submodule we match up the session variables between the source and target form correctly :return: """ factory = AppFactory(build_version='2.9.0/latest') m0, m0f0 = factory.new_basic_module('child visit', 'child') factory.form_requires_case(m0f0) factory.form_opens_case(m0f0, 'visit', is_subcase=True) m1, m1f0 = factory.new_advanced_module('visit histroy', 'visit', parent_module=m0) factory.form_requires_case(m1f0, 'child') factory.form_requires_case(m1f0, 'visit', parent_case_type='child') m1f1 = factory.new_form(m1) factory.form_requires_case(m1f1, 'child') factory.form_requires_case(m1f1, 'visit', parent_case_type='child') m1f0.post_form_workflow = WORKFLOW_FORM m1f0.form_links = [ FormLink(xpath="true()", form_id=m1f1.unique_id), ] self.assertXmlPartialEqual(self.get_xml('form_link_submodule'), factory.app.create_suite(), "./entry")
def test_manual_form_link(self): factory = AppFactory(build_version='2.9.0') m0, m0f0 = factory.new_basic_module('enroll child', 'child') factory.form_opens_case(m0f0) m1, m1f0 = factory.new_basic_module('child visit', 'child') factory.form_requires_case(m1f0) factory.form_opens_case(m1f0, case_type='visit', is_subcase=True) m2, m2f0 = factory.new_advanced_module('visit history', 'visit', parent_module=m1) factory.form_requires_case(m2f0, 'child') factory.form_requires_case(m2f0, 'visit', parent_case_type='child') m0f0.post_form_workflow = WORKFLOW_FORM m0f0.form_links = [ FormLink(xpath="true()", form_id=m1f0.unique_id, datums=[ FormDatum(name='case_id', xpath="instance('commcaresession')/session/data/case_id_new_child_0") ]), ] m1f0.post_form_workflow = WORKFLOW_FORM m1f0.form_links = [ FormLink(xpath="true()", form_id=m2f0.unique_id, datums=[ FormDatum(name='case_id', xpath="instance('commcaresession')/session/data/case_id"), FormDatum(name='case_id_load_visit_0', xpath="instance('commcaresession')/session/data/case_id_new_visit_0"), ]), ] self.assertXmlPartialEqual(self.get_xml('form_link_tdh'), factory.app.create_suite(), "./entry")
def test_return_to_child_module(self): factory = AppFactory(build_version='2.9.0/latest') m0, m0f0 = factory.new_basic_module('enroll child', 'child') factory.form_opens_case(m0f0) m1, m1f0 = factory.new_basic_module('child visit', 'child') factory.form_requires_case(m1f0) factory.form_opens_case(m1f0, case_type='visit', is_subcase=True) m2, m2f0 = factory.new_advanced_module('visit history', 'visit', parent_module=m1) factory.form_requires_case(m2f0, 'child') factory.form_requires_case(m2f0, 'visit', parent_case_type='child') m2f0.post_form_workflow = WORKFLOW_MODULE expected = """ <partial> <stack> <create> <command value="'m1'"/> <datum id="case_id" value="instance('commcaresession')/session/data/case_id"/> <datum id="case_id_new_visit_0" value="uuid()"/> <command value="'m2'"/> </create> </stack> </partial> """ self.assertXmlPartialEqual(expected, factory.app.create_suite(), "./entry[3]/stack")
def test_case_list_form_parent_child_basic(self): """ * Register house (case type = house, basic) * Register house form * Register person (case type = person, parent select = 'Register house', basic) * Register person form * Manager person (case type = person, case list form = 'Register person form', basic) * Manage person form """ factory = AppFactory(build_version='2.9') register_house_module, register_house_form = factory.new_basic_module( 'register_house', 'house') factory.form_opens_case(register_house_form) register_person_module, register_person_form = factory.new_basic_module( 'register_person', 'house') factory.form_updates_case(register_person_form) factory.form_opens_case(register_person_form, case_type='person', is_subcase=True) person_module, update_person_form = factory.new_basic_module( 'update_person', 'person', case_list_form=register_person_form) factory.form_updates_case(update_person_form, parent_case_type='house') self.assertXmlEqual( self.get_xml('case-list-form-suite-parent-child-basic'), factory.app.create_suite())
def test_case_list_form_parent_child_submodule_basic(self): # * Register house (case type = house, basic) # * Register house form # * Register person (case type = person, parent select = 'Register house', basic) # * Register person form # * Update house (case type = house, case list form = 'Register house') # * Update house form # * Update person (case type = person, case list form = 'Register person form', basic, parent module = 'Update house') # * Update person form factory = AppFactory(build_version='2.9.0') register_house_module, register_house_form = factory.new_basic_module('register_house', 'house') factory.form_opens_case(register_house_form) register_person_module, register_person_form = factory.new_basic_module('register_person', 'house') factory.form_requires_case(register_person_form, 'house') factory.form_opens_case(register_person_form, 'person', is_subcase=True) house_module, update_house_form = factory.new_basic_module( 'update_house', 'house', case_list_form=register_house_form ) factory.form_requires_case(update_house_form) person_module, update_person_form = factory.new_basic_module( 'update_person', 'person', parent_module=house_module, case_list_form=register_person_form ) factory.form_requires_case(update_person_form, 'person', parent_case_type='house') self.assertXmlEqual(self.get_xml('case-list-form-suite-parent-child-submodule-basic'), factory.app.create_suite())
def test_scheduler_module(self): factory = AppFactory() m1, m1f1 = factory.new_basic_module('open_case', 'house') factory.form_opens_case(m1f1) m2, m2f1 = factory.new_advanced_module('scheduler_module', 'house') m2f2 = factory.new_form(m2) factory.form_requires_case(m2f1, case_type='house', update={ 'foo': '/data/question1', 'bar': '/data/question2', }) factory.form_requires_case(m2f2, case_type='house', update={ 'bleep': '/data/question1', 'bloop': '/data/question2', }) self._add_scheduler_to_module(m2) self._add_scheduler_to_form(m2f1, m2, 'form1') self._add_scheduler_to_form(m2f2, m2, 'form2') self.assertCaseProperties(factory.app, 'house', [ 'foo', 'bar', 'bleep', 'bloop', # Scheduler properties: 'last_visit_date_form1', 'last_visit_number_form1', 'last_visit_date_form2', 'last_visit_number_form2', 'current_schedule_phase', ])
def test_link_to_child_module(self, *args): factory = AppFactory(build_version='2.9.0') m0, m0f0 = factory.new_basic_module('Register City', 'city') factory.form_opens_case(m0f0) m1, m1f0 = factory.new_basic_module('Update City', 'city') factory.form_requires_case(m1f0) m2, m2f0 = factory.new_basic_module('Update Person', 'person', parent_module=m1) factory.form_requires_case(m2f0) m0f0.post_form_workflow = WORKFLOW_FORM m0f0.form_links = [ FormLink(xpath="true()", module_unique_id=m2.unique_id) ] self.assertXmlPartialEqual( """ <partial> <stack> <create if="true()"> <command value="'m1'"/> <datum id="case_id" value="instance('commcaresession')/session/data/case_id"/> <command value="'m2'"/> </create> </stack> </partial> """, factory.app.create_suite(), "./entry[1]/stack")
class FormFilterErrorTests(SimpleTestCase, TestXmlMixin): file_path = ('data', 'suite') def setUp(self): self.suite_xml_is_usercase_in_use_patch = patch( 'corehq.apps.app_manager.suite_xml.sections.menus.is_usercase_in_use' ) self.suite_xml_is_usercase_in_use_mock = self.suite_xml_is_usercase_in_use_patch.start() self.factory = AppFactory(build_version='2.9') def tearDown(self): self.suite_xml_is_usercase_in_use_patch.stop() def test_error_when_no_case(self): self.suite_xml_is_usercase_in_use_mock.return_value = True __, reg_form = self.factory.new_basic_module('reg_module', 'mother') self.factory.form_opens_case(reg_form) reg_form.form_filter = './due_date <= today()' with self.assertRaises(CaseXPathValidationError): self.factory.app.create_suite() def test_no_error_when_user_case(self): self.suite_xml_is_usercase_in_use_mock.return_value = True __, reg_form = self.factory.new_basic_module('reg_module', 'mother') self.factory.form_opens_case(reg_form) reg_form.form_filter = '#user/due_date <= today()' expected = """ <partial> <menu id="m0"> <text> <locale id="modules.m0"/> </text> <command id="m0-f0" relevant="instance('casedb')/casedb/case[@case_type='commcare-user'][hq_user_id=instance('commcaresession')/session/context/userid]/due_date <= today()"/> </menu> </partial> """ self.assertXmlPartialEqual(expected, self.factory.app.create_suite(), './menu') def test_no_error_when_case(self): self.suite_xml_is_usercase_in_use_mock.return_value = False __, update_form = self.factory.new_basic_module('update_mother', 'mother') self.factory.form_requires_case(update_form) update_form.form_filter = '#case/due_date <= today()' expected = """ <partial> <menu id="m0"> <text> <locale id="modules.m0"/> </text> <command id="m0-f0" relevant="instance('casedb')/casedb/case[@case_id=instance('commcaresession')/session/data/case_id]/due_date <= today()"/> </menu> </partial> """ self.assertXmlPartialEqual(expected, self.factory.app.create_suite(), './menu')
def test_form_linking_multiple_case_types(): factory = AppFactory(build_version='2.9.0') m0, m0f0 = factory.new_basic_module('m0', 'frog') factory.form_opens_case(m0f0) m1, m1f0 = factory.new_basic_module('m1', 'frog') factory.form_requires_case(m1f0) m1.search_config.additional_case_types = ['tadpole'] m0f0.post_form_workflow = WORKFLOW_FORM m0f0.form_links = [ FormLink(form_id=m1f0.unique_id), ] suite = factory.app.create_suite() print(suite.decode('utf8')) # ensure that target datum contains both case types datum = extract_xml_partial(suite, "./entry[2]/session/datum[@id='case_id']", wrap=False).decode('utf8') eq(datum, Regex(r"\[@case_type='frog' or @case_type='tadpole'\]")) expected_stack = """ <partial> <create> <command value="'m1'"/> <datum id="case_id" value="instance('commcaresession')/session/data/case_id_new_frog_0"/> <command value="'m1-f0'"/> </create> </partial>""" assert_xml_partial_equal(expected_stack, suite, "./entry[1]/stack/create")
def test_manual_form_link(self): factory = AppFactory(build_version='2.9.0/latest') m0, m0f0 = factory.new_basic_module('enroll child', 'child') factory.form_opens_case(m0f0) m1, m1f0 = factory.new_basic_module('child visit', 'child') factory.form_requires_case(m1f0) factory.form_opens_case(m1f0, case_type='visit', is_subcase=True) m2, m2f0 = factory.new_advanced_module('visit history', 'visit', parent_module=m1) factory.form_requires_case(m2f0, 'child') factory.form_requires_case(m2f0, 'visit', parent_case_type='child') m0f0.post_form_workflow = WORKFLOW_FORM m0f0.form_links = [ FormLink(xpath="true()", form_id=m1f0.unique_id, datums=[ FormDatum(name='case_id', xpath="instance('commcaresession')/session/data/case_id_new_child_0") ]), ] m1f0.post_form_workflow = WORKFLOW_FORM m1f0.form_links = [ FormLink(xpath="true()", form_id=m2f0.unique_id, datums=[ FormDatum(name='case_id', xpath="instance('commcaresession')/session/data/case_id"), FormDatum(name='case_id_load_visit_0', xpath="instance('commcaresession')/session/data/case_id_new_visit_0"), ]), ] self.assertXmlPartialEqual(self.get_xml('form_link_tdh'), factory.app.create_suite(), "./entry")
def test_case_list_form_parent_child_basic(self): # * Register house (case type = house, basic) # * Register house form # * Register person (case type = person, parent select = 'Register house', basic) # * Register person form # * Manager person (case type = person, case list form = 'Register person form', basic) # * Manage person form factory = AppFactory(build_version='2.9.0') register_house_module, register_house_form = factory.new_basic_module('register_house', 'house') factory.form_opens_case(register_house_form) register_person_module, register_person_form = factory.new_basic_module('register_person', 'house') factory.form_requires_case(register_person_form) factory.form_opens_case(register_person_form, case_type='person', is_subcase=True) person_module, update_person_form = factory.new_basic_module( 'update_person', 'person', case_list_form=register_person_form ) factory.form_requires_case(update_person_form, parent_case_type='house') register_person_module.case_details.short.columns.append( DetailColumn( header={'en': 'a'}, model='case', field='parent/case_name', # Include a parent case property in the case list format='plain', ) ) self.assertXmlEqual(self.get_xml('case-list-form-suite-parent-child-basic'), factory.app.create_suite())
def test_form_links_submodule(self): # Test that when linking between two forms in a submodule we match up the # session variables between the source and target form correctly factory = AppFactory(build_version='2.9.0/latest') m0, m0f0 = factory.new_basic_module('child visit', 'child') factory.form_requires_case(m0f0) factory.form_opens_case(m0f0, 'visit', is_subcase=True) m1, m1f0 = factory.new_advanced_module('visit histroy', 'visit', parent_module=m0) factory.form_requires_case(m1f0, 'child') factory.form_requires_case(m1f0, 'visit', parent_case_type='child') m1f1 = factory.new_form(m1) factory.form_requires_case(m1f1, 'child') factory.form_requires_case(m1f1, 'visit', parent_case_type='child') m1f0.post_form_workflow = WORKFLOW_FORM m1f0.form_links = [ FormLink(xpath="true()", form_id=m1f1.unique_id), ] self.assertXmlPartialEqual(self.get_xml('form_link_submodule'), factory.app.create_suite(), "./entry")
def test_case_list_form_parent_child_advanced(self): # * Register house (case type = house, basic) # * Register house form # * Register person (case type = person, parent select = 'Register house', advanced) # * Register person form # * Manager person (case type = person, case list form = 'Register person form', basic) # * Manage person form factory = AppFactory(build_version='2.9.0') register_house_module, register_house_form = factory.new_basic_module( 'register_house', 'house') factory.form_opens_case(register_house_form) register_person_module, register_person_form = factory.new_advanced_module( 'register_person', 'person') factory.form_requires_case(register_person_form, 'house') factory.form_opens_case(register_person_form, 'person', is_subcase=True) person_module, update_person_form = factory.new_basic_module( 'update_person', 'person', case_list_form=register_person_form) person_module.parent_select.active = True person_module.parent_select.module_id = register_house_module.unique_id factory.form_requires_case(update_person_form) self.assertXmlEqual( self.get_xml('case-list-form-suite-parent-child-advanced'), factory.app.create_suite())
def test_case_list_form_parent_child_submodule_mixed(self): # * Register house (case type = house, basic) # * Register house form # * Register person (case type = person, parent select = 'Register house', advanced) # * Register person form # * Update house (case type = house, case list form = 'Register house') # * Update house form # * Update person (case type = person, case list form = 'Register person form', advanced, parent module = 'Update house') # * Update person form factory = AppFactory(build_version='2.9.0') register_house_module, register_house_form = factory.new_basic_module('register_house', 'house') factory.form_opens_case(register_house_form) register_person_module, register_person_form = factory.new_basic_module('register_person', 'house') factory.form_requires_case(register_person_form, 'house') factory.form_opens_case(register_person_form, 'person', is_subcase=True) house_module, update_house_form = factory.new_advanced_module( 'update_house', 'house', case_list_form=register_house_form ) factory.form_requires_case(update_house_form) person_module, update_person_form = factory.new_basic_module( 'update_person', 'person', parent_module=house_module, case_list_form=register_person_form ) factory.form_requires_case(update_person_form, 'person', parent_case_type='house') self.assertXmlEqual(self.get_xml('case-list-form-suite-parent-child-submodule-mixed'), factory.app.create_suite())
def test_case_list_form_parent_child_advanced(self): """ * Register house (case type = house, basic) * Register house form * Register person (case type = person, parent select = 'Register house', advanced) * Register person form * Manager person (case type = person, case list form = 'Register person form', basic) * Manage person form """ factory = AppFactory(build_version='2.9') register_house_module, register_house_form = factory.new_basic_module('register_house', 'house') factory.form_opens_case(register_house_form) register_person_module, register_person_form = factory.new_advanced_module('register_person', 'person') factory.form_requires_case(register_person_form, 'house') factory.form_opens_case(register_person_form, 'person', is_subcase=True) person_module, update_person_form = factory.new_basic_module( 'update_person', 'person', case_list_form=register_person_form ) person_module.parent_select.active = True person_module.parent_select.module_id = register_house_module.unique_id factory.form_requires_case(update_person_form) self.assertXmlEqual(self.get_xml('case-list-form-suite-parent-child-advanced'), factory.app.create_suite())
def test_case_list_form_advanced_module_different_case_config(self, *args): case_tile_error = { 'type': "all forms in case list module must load the same cases", 'module': { 'id': 1, 'name': { 'en': 'update module' } }, 'form': { 'id': 1, 'name': { 'en': 'update form 1' } }, } factory = AppFactory(build_version='2.11.0') m0, m0f0 = factory.new_basic_module('register', 'person') factory.form_opens_case(m0f0) m1, m1f0 = factory.new_advanced_module('update', 'person', case_list_form=m0f0) factory.form_requires_case(m1f0, case_type='house') factory.form_requires_case(m1f0, parent_case_type='house') m1f1 = factory.new_form(m1) factory.form_requires_case( m1f1) # only loads a person case and not a house case errors = factory.app.validate_app() self._clean_unique_id(errors) self.assertIn(case_tile_error, errors)
def test_case_list_form_parent_child_basic(self): """ * Register house (case type = house, basic) * Register house form * Register person (case type = person, parent select = 'Register house', basic) * Register person form * Manager person (case type = person, case list form = 'Register person form', basic) * Manage person form """ factory = AppFactory(build_version='2.9') register_house_module, register_house_form = factory.new_basic_module('register_house', 'house') factory.form_opens_case(register_house_form) register_person_module, register_person_form = factory.new_basic_module('register_person', 'house') factory.form_updates_case(register_person_form) factory.form_opens_case(register_person_form, case_type='person', is_subcase=True) person_module, update_person_form = factory.new_basic_module( 'update_person', 'person', case_list_form=register_person_form ) factory.form_updates_case(update_person_form, parent_case_type='house') self.assertXmlEqual(self.get_xml('case-list-form-suite-parent-child-basic'), factory.app.create_suite())
def _create_app(self, name): factory = AppFactory(domain=self.domain, name=name, build_version='2.11') module1, form1 = factory.new_basic_module('open_case', 'house') factory.form_opens_case(form1) app = factory.app app.save() self.addCleanup(app.delete) return app
def _create_app(self, name): factory = AppFactory(domain=self.domain, name=name, build_version='2.11.0') module1, form1 = factory.new_basic_module('open_case', 'house') factory.form_opens_case(form1) app = factory.app app.save() self.addCleanup(app.delete) return app
def setUpClass(cls): super(UCRAggregationTest, cls).setUpClass() # cleanup any previous data cls._cleanup_data() # setup app factory = AppFactory(domain=cls.domain) # parent case module, incl opening child cases of main type m_parent, f_parent = factory.new_basic_module('Parent Module', cls.parent_case_type) factory.form_opens_case(f_parent, case_type=cls.parent_case_type) factory.form_opens_case(f_parent, case_type=cls.case_type, is_subcase=True) # main module m0, f0 = factory.new_basic_module('A Module', cls.case_type) f1 = factory.new_form(m0) f1.source = cls._get_xform() factory.form_requires_case(f1, case_type=cls.case_type, update={ cp[0]: '/data/{}'.format(cp[0]) for cp in cls.case_properties }) cls.followup_form = f1 cls.app = factory.app cls.app.save() # create form and case ucrs cls.form_data_source = get_form_data_source(cls.app, cls.followup_form) cls.case_data_source = get_case_data_source(cls.app, cls.case_type) cls.parent_case_data_source = get_case_data_source(cls.app, cls.parent_case_type) # create some data - first just create the case cls.parent_case_id = cls._create_parent_case(cls.parent_name) cls.case_id = cls._create_case(cls.parent_case_id) for fu_date in cls.fu_visit_dates: cls._submit_followup_form(cls.case_id, received_on=fu_date) # the closed case causes there to be some data with an end_column cls.closed_case_id = cls._create_closed_case() # populate the UCRs with the data we just created cls.form_adapter = get_indicator_adapter(cls.form_data_source) cls.case_adapter = get_indicator_adapter(cls.case_data_source) cls.parent_case_adapter = get_indicator_adapter(cls.parent_case_data_source) cls.form_adapter.rebuild_table() cls.case_adapter.rebuild_table() cls.parent_case_adapter.rebuild_table() _iteratively_build_table(cls.form_data_source) _iteratively_build_table(cls.case_data_source) _iteratively_build_table(cls.parent_case_data_source) # setup AggregateTableDefinition cls.monthly_aggregate_table_definition = cls._get_monthly_aggregate_table_definition() cls.weekly_aggregate_table_definition = cls._get_weekly_aggregate_table_definition() cls.basic_aggregate_table_definition = cls._get_basic_aggregate_table_definition() # and adapter cls.monthly_adapter = get_indicator_adapter(cls.monthly_aggregate_table_definition)
def test_basic_apps(self): for class_ in (Module, AdvancedModule): factory = AppFactory() m1, m1f1 = factory.new_module(class_, 'open_case', 'house') factory.form_opens_case(m1f1) m1f2 = factory.new_form(m1) factory.form_requires_case(m1f2, case_type='house', update={ 'foo': '/data/question1', 'bar': '/data/question2', }) self.assertCaseProperties(factory.app, 'house', ['foo', 'bar'])
def test_workflow_registry_module_previous_screen_after_case_list_form(self): factory = AppFactory(DOMAIN, "App with DR", build_version='2.53.0') m0, f0 = factory.new_basic_module("new case", "case") factory.form_opens_case(f0, "case") m1, f1 = factory.new_basic_module("update case", "case") factory.form_requires_case(f1, "case") m1.case_details.long.columns.append( DetailColumn.wrap(dict( header={"en": "name"}, model="case", format="plain", field="whatever", )) ) m1.search_config = CaseSearch( properties=[ CaseSearchProperty(name='name', label={'en': 'Name'}), ], data_registry="myregistry", data_registry_workflow=REGISTRY_WORKFLOW_LOAD_CASE, ) m1.case_list_form.form_id = f0.get_unique_id() m1.case_list_form.label = {'en': 'New Case'} f1.post_form_workflow = WORKFLOW_PREVIOUS app = Application.wrap(factory.app.to_json()) app._id = "123" suite = app.create_suite() self.assertXmlPartialEqual( """ <partial> <create> <command value="'m1'"/> <query id="results" value="http://localhost:8000/a/test_domain/phone/registry_case/123/"> <data key="case_type" ref="'case'"/> <data key="x_commcare_data_registry" ref="'myregistry'"/> <data key="case_id" ref="instance('commcaresession')/session/data/case_id"/> </query> <datum id="case_id" value="instance('commcaresession')/session/data/case_id"/> <query id="registry" value="http://localhost:8000/a/test_domain/phone/registry_case/123/"> <data key="x_commcare_data_registry" ref="'myregistry'"/> <data key="case_type" ref="'case'"/> <data key="case_id" ref="instance('commcaresession')/session/data/case_id"/> </query> </create> </partial> """, suite, "./entry[2]/stack/create" )
def test_reference_to_missing_session_variable_in_stack(self): # http://manage.dimagi.com/default.asp?236750 # # Stack create blocks do not update the session after each datum # so items put into the session in one step aren't available later steps # # <datum id="case_id_A" value="instance('commcaresession')/session/data/case_id_new_A"/> # - <datum id="case_id_B" value="instance('casedb')/casedb/case[@case_id=instance('commcaresession')/session/data/case_id_A]/index/host"/> # + <datum id="case_id_B" value="instance('casedb')/casedb/case[@case_id=instance('commcaresession')/session/data/case_id_new_A]/index/host"/> # # in the above example ``case_id_A`` is being added to the session and then # later referenced. However since the session doesn't get updated # the value isn't available in the session. # # To fix this we need to replace any references to previous variables with the full xpath which # that session variable references. # # See corehq.apps.app_manager.suite_xml.post_process.workflow._replace_session_references_in_stack factory = AppFactory(build_version='2.9.0/latest') m0, m0f0 = factory.new_basic_module('person registration', 'person') factory.form_opens_case(m0f0) m1, m1f0 = factory.new_advanced_module('episode registration', 'episode') factory.form_requires_case(m1f0, case_type='person') factory.form_opens_case(m1f0, case_type='episode', is_subcase=True, is_extension=True) m2, m2f0 = factory.new_advanced_module('tests', 'episode') factory.form_requires_case(m2f0, 'episode') factory.advanced_form_autoloads(m2f0, AUTO_SELECT_CASE, 'host', 'load_episode_0') m1f0.post_form_workflow = WORKFLOW_FORM m1f0.form_links = [ FormLink( xpath="true()", form_id=m2f0.unique_id, datums=[ FormDatum( name='case_id_load_episode_0', xpath= "instance('commcaresession')/session/data/case_id_new_episode_0" ) ]), ] self.assertXmlPartialEqual(self.get_xml('form_link_enikshay'), factory.app.create_suite(), "./entry")
def test_with_case_management_create_update(self): factory = AppFactory(build_version='2.9.0/latest') m0, m0f0 = factory.new_basic_module('m0', 'frog') factory.form_opens_case(m0f0) m1, m1f0 = factory.new_basic_module('m1', 'frog') factory.form_requires_case(m1f0) m0f0.post_form_workflow = WORKFLOW_FORM m0f0.form_links = [FormLink(xpath='true()', form_id=m1f0.unique_id)] self.assertXmlPartialEqual( self.get_xml('form_link_create_update_case'), factory.app.create_suite(), "./entry[1]")
def test_with_case_management_create_update(self): factory = AppFactory(build_version='2.9.0/latest') m0, m0f0 = factory.new_basic_module('m0', 'frog') factory.form_opens_case(m0f0) m1, m1f0 = factory.new_basic_module('m1', 'frog') factory.form_requires_case(m1f0) m0f0.post_form_workflow = WORKFLOW_FORM m0f0.form_links = [ FormLink(xpath='true()', form_id=m1f0.unique_id) ] self.assertXmlPartialEqual(self.get_xml('form_link_create_update_case'), factory.app.create_suite(), "./entry[1]")
def test_with_case_management_create_update(self): factory = AppFactory(build_version="2.9.0/latest") m0, m0f0 = factory.new_basic_module("m0", "frog") factory.form_opens_case(m0f0) m1, m1f0 = factory.new_basic_module("m1", "frog") factory.form_updates_case(m1f0) m0f0.post_form_workflow = WORKFLOW_FORM m0f0.form_links = [FormLink(xpath="true()", form_id=m1f0.unique_id)] self.assertXmlPartialEqual( self.get_xml("form_link_create_update_case"), factory.app.create_suite(), "./entry[1]" )
def _prep_case_list_form_app(self): factory = AppFactory(build_version='2.9') case_module, update_case_form = factory.new_basic_module( 'case_module', 'suite_test') factory.form_updates_case(update_case_form) register_module, register_form = factory.new_basic_module( 'register_case', 'suite_test') factory.form_opens_case(register_form) case_module.case_list_form.form_id = register_form.get_unique_id() case_module.case_list_form.label = {'en': 'New Case'} return factory
def _prep_case_list_form_app(self): factory = AppFactory(build_version='2.9') case_module, update_case_form = factory.new_basic_module('case_module', 'suite_test') factory.form_updates_case(update_case_form) register_module, register_form = factory.new_basic_module('register_case', 'suite_test') factory.form_opens_case(register_form) case_module.case_list_form.form_id = register_form.get_unique_id() case_module.case_list_form.label = { 'en': 'New Case' } return factory
def test_case_list_registration_form_advanced(self): factory = AppFactory(build_version='2.9') register_module, register_form = factory.new_advanced_module('register_dugong', 'dugong') factory.form_opens_case(register_form) case_module, update_form = factory.new_advanced_module('update_dugong', 'dugong') factory.form_updates_case(update_form) case_module.case_list_form.form_id = register_form.get_unique_id() case_module.case_list_form.label = { 'en': 'Register another Dugong' } self.assertXmlEqual(self.get_xml('case-list-form-advanced'), factory.app.create_suite())
def test_case_list_registration_form_advanced(self): factory = AppFactory(build_version='2.9.0') register_module, register_form = factory.new_advanced_module('register_dugong', 'dugong') factory.form_opens_case(register_form) case_module, update_form = factory.new_advanced_module('update_dugong', 'dugong') factory.form_requires_case(update_form) case_module.case_list_form.form_id = register_form.get_unique_id() case_module.case_list_form.label = { 'en': 'Register another Dugong' } self.assertXmlEqual(self.get_xml('case-list-form-advanced'), factory.app.create_suite())
def test_form_links_other_child_module(self): # This test demonstrates current behavior that I believe to be flawed factory = AppFactory(build_version='2.9.0') m0, m0f0 = factory.new_basic_module('parent', 'mother') factory.form_opens_case(m0f0) m1, m1f0 = factory.new_basic_module('child', 'baby', parent_module=m0) factory.form_requires_case(m1f0) m0f1 = factory.new_form(m0) m0f1.post_form_workflow = WORKFLOW_FORM m0f1.form_links = [FormLink(xpath='true()', form_id=m1f0.unique_id)] m2, m2f0 = factory.new_basic_module('other_module', 'baby') m2f0.post_form_workflow = WORKFLOW_FORM m2f0.form_links = [FormLink(xpath='true()', form_id=m1f0.unique_id)] suite_xml = factory.app.create_suite() # m0f1 links to m1f0, a form in its child module. Here's the stack for that: expected = """ <partial> <stack> <create if="true()"> <command value="'m0'"/> <command value="'m1'"/> <datum id="case_id_new_mother_0" value="uuid()"/> <datum id="case_id" value="instance('commcaresession')/session/data/case_id"/> <command value="'m1-f0'"/> </create> </stack> </partial> """ self.assertXmlPartialEqual(expected, suite_xml, "./entry[2]/stack") # m2f0 links to m1f0, a form in a separate child module, here's the stack there expected = """ <partial> <stack> <create if="true()"> <command value="'m0'"/> <command value="'m1'"/> <datum id="case_id_new_mother_0" value="uuid()"/> <datum id="case_id" value="instance('commcaresession')/session/data/case_id"/> <command value="'m1-f0'"/> </create> </stack> </partial> """ self.assertXmlPartialEqual(expected, suite_xml, "./entry[4]/stack")
def test_parent_child_properties(self): factory = AppFactory() household_module, houshold_form_1 = factory.new_basic_module( 'household_module', 'household') patient_module, patient_form_1 = factory.new_basic_module( 'patient_module', 'patient') referral_module, referral_form_1 = factory.new_basic_module( 'referral_module', 'referral') factory.form_requires_case(houshold_form_1, 'household', update={ 'household_name': 'HH', }) factory.form_opens_case(houshold_form_1, 'patient', is_subcase=True) factory.form_requires_case(patient_form_1, update={ 'patient_id': 1, 'parent/household_id': 1, }) factory.form_opens_case(patient_form_1, 'referral', is_subcase=True) factory.form_requires_case(referral_form_1, update={ 'parent/patient_name': "Ralph", 'parent/parent/household_color': 'green', 'referral_id': 1, }) self.assertCaseProperties(factory.app, 'household', [ 'household_color', 'household_id', 'household_name', ]) self.assertCaseProperties(factory.app, 'patient', [ 'parent/household_color', 'parent/household_id', 'parent/household_name', 'patient_id', 'patient_name', ]) self.assertCaseProperties(factory.app, 'referral', [ 'parent/parent/household_color', 'parent/parent/household_id', 'parent/parent/household_name', 'parent/patient_id', 'parent/patient_name', 'referral_id', ])
def _build_workflow_app(self, mode): factory = AppFactory(build_version='2.9.0') m0, m0f0 = factory.new_basic_module('m0', '') factory.new_form(m0) m1, m1f0 = factory.new_basic_module('m1', 'patient') m1f1 = factory.new_form(m1) factory.form_opens_case(m1f0) factory.form_requires_case(m1f1) m2, m2f0 = factory.new_basic_module('m2', 'patient') m2f1 = factory.new_form(m2) factory.form_requires_case(m2f0) factory.form_requires_case(m2f1) m3, m3f0 = factory.new_basic_module('m3', 'child') m3f1 = factory.new_form(m3) factory.form_requires_case(m3f0, parent_case_type='patient') factory.form_requires_case(m3f1) m4, m4f0 = factory.new_advanced_module('m4', 'patient') factory.form_requires_case(m4f0, case_type='patient') factory.form_requires_case(m4f0, case_type='patient') m4f1 = factory.new_form(m4) factory.form_requires_case(m4f1, case_type='patient') factory.form_requires_case(m4f1, case_type='patient') factory.form_requires_case(m4f1, case_type='patient') m4f2 = factory.new_form(m4) factory.form_requires_case(m4f2, case_type='patient') factory.form_requires_case(m4f2, case_type='patient') factory.advanced_form_autoloads(m4f2, AUTO_SELECT_RAW, 'case_id') m5, m5f0 = factory.new_basic_module('m5', 'patient', parent_module=m1) factory.form_requires_case(m5f0) m6 = factory.new_shadow_module('shadow_module', m1, with_form=False) factory.new_shadow_module('shadow_child', m5, with_form=False, parent_module=m6) for module in factory.app.get_modules(): for form in module.get_forms(): form.post_form_workflow = mode return factory.app
def test_link_to_form_in_parent_module(self): factory = AppFactory(build_version="2.9.0/latest") m0, m0f0 = factory.new_basic_module("enroll child", "child") factory.form_opens_case(m0f0) m1, m1f0 = factory.new_basic_module("child visit", "child") factory.form_updates_case(m1f0) m2, m2f0 = factory.new_advanced_module("visit history", "visit", parent_module=m1) factory.form_updates_case(m2f0, "child") # link to child -> edit child m2f0.post_form_workflow = WORKFLOW_FORM m2f0.form_links = [FormLink(xpath="true()", form_id=m1f0.unique_id)] self.assertXmlPartialEqual(self.get_xml("form_link_child_modules"), factory.app.create_suite(), "./entry[3]")
def test_manual_form_link_with_fallback(self): factory = AppFactory(build_version='2.9.0/latest') m0, m0f0 = factory.new_basic_module('enroll child', 'child') factory.form_opens_case(m0f0) m1, m1f0 = factory.new_basic_module('child visit', 'child') factory.form_requires_case(m1f0) factory.form_opens_case(m1f0, case_type='visit', is_subcase=True) m2, m2f0 = factory.new_advanced_module('visit history', 'visit', parent_module=m1) factory.form_requires_case(m2f0, 'child') factory.form_requires_case(m2f0, 'visit', parent_case_type='child') m0f0.post_form_workflow = WORKFLOW_FORM m0f0.form_links = [ FormLink(xpath="true()", form_id=m1f0.unique_id, datums=[ FormDatum(name='case_id', xpath="instance('commcaresession')/session/data/case_id_new_child_0") ]), ] m1f0.post_form_workflow = WORKFLOW_FORM condition_for_xpath = "instance('casedb')/casedb/case[@case_id = " \ "instance('commcaresession')/session/data/case_id]/prop = 'value'" m1f0.form_links = [ FormLink(xpath="true()", form_id=m2f0.unique_id, datums=[ FormDatum(name='case_id', xpath="instance('commcaresession')/session/data/case_id"), FormDatum(name='case_id_load_visit_0', xpath="instance('commcaresession')/session/data/case_id_new_visit_0"), ]), FormLink(xpath=condition_for_xpath, form_id=m2f0.unique_id, datums=[ FormDatum(name='case_id', xpath="instance('commcaresession')/session/data/case_id"), FormDatum(name='case_id_load_visit_0', xpath="instance('commcaresession')/session/data/case_id_new_visit_0"), ]), ] m1f0.post_form_workflow_fallback = WORKFLOW_PREVIOUS self.assertXmlPartialEqual(self.get_xml('form_link_tdh_with_fallback_previous'), factory.app.create_suite(), "./entry") m1f0.post_form_workflow_fallback = WORKFLOW_MODULE self.assertXmlPartialEqual(self.get_xml('form_link_tdh_with_fallback_module'), factory.app.create_suite(), "./entry") m1f0.post_form_workflow_fallback = WORKFLOW_ROOT self.assertXmlPartialEqual(self.get_xml('form_link_tdh_with_fallback_root'), factory.app.create_suite(), "./entry")
def test_manual_form_link_with_fallback(self): factory = AppFactory(build_version='2.9.0') m0, m0f0 = factory.new_basic_module('enroll child', 'child') factory.form_opens_case(m0f0) m1, m1f0 = factory.new_basic_module('child visit', 'child') factory.form_requires_case(m1f0) factory.form_opens_case(m1f0, case_type='visit', is_subcase=True) m2, m2f0 = factory.new_advanced_module('visit history', 'visit', parent_module=m1) factory.form_requires_case(m2f0, 'child') factory.form_requires_case(m2f0, 'visit', parent_case_type='child') m0f0.post_form_workflow = WORKFLOW_FORM m0f0.form_links = [ FormLink(xpath="true()", form_id=m1f0.unique_id, datums=[ FormDatum(name='case_id', xpath="instance('commcaresession')/session/data/case_id_new_child_0") ]), ] m1f0.post_form_workflow = WORKFLOW_FORM condition_for_xpath = "instance('casedb')/casedb/case[@case_id = " \ "instance('commcaresession')/session/data/case_id]/prop = 'value'" m1f0.form_links = [ FormLink(xpath="true()", form_id=m2f0.unique_id, datums=[ FormDatum(name='case_id', xpath="instance('commcaresession')/session/data/case_id"), FormDatum(name='case_id_load_visit_0', xpath="instance('commcaresession')/session/data/case_id_new_visit_0"), ]), FormLink(xpath=condition_for_xpath, form_id=m2f0.unique_id, datums=[ FormDatum(name='case_id', xpath="instance('commcaresession')/session/data/case_id"), FormDatum(name='case_id_load_visit_0', xpath="instance('commcaresession')/session/data/case_id_new_visit_0"), ]), ] m1f0.post_form_workflow_fallback = WORKFLOW_PREVIOUS self.assertXmlPartialEqual(self.get_xml('form_link_tdh_with_fallback_previous'), factory.app.create_suite(), "./entry") m1f0.post_form_workflow_fallback = WORKFLOW_MODULE self.assertXmlPartialEqual(self.get_xml('form_link_tdh_with_fallback_module'), factory.app.create_suite(), "./entry") m1f0.post_form_workflow_fallback = WORKFLOW_ROOT self.assertXmlPartialEqual(self.get_xml('form_link_tdh_with_fallback_root'), factory.app.create_suite(), "./entry")
def test_case_list_form_parent_child_submodule_advanced_rename_case_var( self): """Test that the session vars in the entries for the submodule get updated to match the parent (and to avoid naming conflicts). m3-f0: 'case_id_load_house' -> 'case_id_load_house_renamed' m3-f0: 'case_id_load_house_renamed' -> 'case_id_load_house_renamed_person' """ factory = AppFactory(build_version='2.9') register_house_module, register_house_form = factory.new_basic_module( 'register_house', 'house') factory.form_opens_case(register_house_form) register_person_module, register_person_form = factory.new_advanced_module( 'register_person', 'person') factory.form_updates_case(register_person_form, 'house') factory.form_opens_case(register_person_form, 'person', is_subcase=True) house_module, update_house_form = factory.new_advanced_module( 'update_house', 'house', case_list_form=register_house_form) factory.form_updates_case(update_house_form) # changing this case tag should result in the session var in the submodule entry being updated to match it update_house_form.actions.load_update_cases[ 0].case_tag = 'load_house_renamed' person_module, update_person_form = factory.new_advanced_module( 'update_person', 'person', parent_module=house_module, case_list_form=register_person_form) factory.form_updates_case(update_person_form, 'house') factory.form_updates_case(update_person_form, 'person', parent_case_type='house') # making this case tag the same as the one in the parent module should mean that it will also # get changed to avoid conflicts update_person_form.actions.load_update_cases[ 1].case_tag = 'load_house_renamed' self.assertXmlEqual( self.get_xml( 'case-list-form-suite-parent-child-submodule-advanced-rename-var' ), factory.app.create_suite())
def test_case_list_form_reg_form_creates_child_case(self): factory = AppFactory(build_version='2.9.0') register_person_module, register_person_form = factory.new_basic_module('reg_person_and_stub', 'person') factory.form_opens_case(register_person_form) factory.form_opens_case(register_person_form, case_type='stub', is_subcase=True) person_module, update_person_form = factory.new_basic_module( 'update_person', 'person', case_list_form=register_person_form ) factory.form_requires_case(update_person_form) self.assertXmlPartialEqual( self.get_xml('case_list_form_reg_form_creates_child_case'), factory.app.create_suite(), './entry[1]' )
def test_case_list_form_reg_form_creates_child_case(self): factory = AppFactory(build_version='2.9.0') register_person_module, register_person_form = factory.new_basic_module( 'reg_person_and_stub', 'person') factory.form_opens_case(register_person_form) factory.form_opens_case(register_person_form, case_type='stub', is_subcase=True) person_module, update_person_form = factory.new_basic_module( 'update_person', 'person', case_list_form=register_person_form) factory.form_requires_case(update_person_form) self.assertXmlPartialEqual( self.get_xml('case_list_form_reg_form_creates_child_case'), factory.app.create_suite(), './entry[1]')
def test_with_case_management_multiple_links(self, *args): factory = AppFactory(build_version='2.9.0') m0, m0f0 = factory.new_basic_module('m0', 'frog') factory.form_opens_case(m0f0) m1, m1f0 = factory.new_basic_module('m1', 'frog') factory.form_requires_case(m1f0) m1f1 = factory.new_form(m1) factory.form_opens_case(m1f1) m0f0.post_form_workflow = WORKFLOW_FORM m0f0.form_links = [ FormLink(xpath="a = 1", form_id=m1f0.unique_id), FormLink(xpath="a = 2", form_id=m1f1.unique_id) ] self.assertXmlPartialEqual(self.get_xml('form_link_multiple'), factory.app.create_suite(), "./entry[1]")
def test_link_to_form_in_parent_module(self): factory = AppFactory(build_version='2.9.0/latest') m0, m0f0 = factory.new_basic_module('enroll child', 'child') factory.form_opens_case(m0f0) m1, m1f0 = factory.new_basic_module('child visit', 'child') factory.form_requires_case(m1f0) m2, m2f0 = factory.new_advanced_module('visit history', 'visit', parent_module=m1) factory.form_requires_case(m2f0, 'child') # link to child -> edit child m2f0.post_form_workflow = WORKFLOW_FORM m2f0.form_links = [ FormLink(xpath="true()", form_id=m1f0.unique_id), ] self.assertXmlPartialEqual(self.get_xml('form_link_child_modules'), factory.app.create_suite(), "./entry[3]")
def make_app(cls): factory = AppFactory(domain=cls.domain.name, name="API App", build_version='2.11.0') module1, form1 = factory.new_basic_module('open_case', 'house') form1.source = XFormBuilder().new_question("name", "name").form.tostring() factory.form_opens_case(form1) module2, form2 = factory.new_basic_module('update_case', 'person') form2.source = XFormBuilder().new_question("name", "name").form.tostring() factory.form_requires_case(form2, case_type='house') factory.form_opens_case(form2, case_type="person", is_subcase=True) app = factory.app app.save() return app
def test_case_list_form_advanced_module_different_case_config(self): case_tile_error = { 'type': "all forms in case list module must load the same cases", 'module': {'id': 1, 'name': {u'en': u'update module'}}, 'form': {'id': 1, 'name': {u'en': u'update form 1'}}, } factory = AppFactory(build_version='2.11') m0, m0f0 = factory.new_basic_module('register', 'person') factory.form_opens_case(m0f0) m1, m1f0 = factory.new_advanced_module('update', 'person', case_list_form=m0f0) factory.form_requires_case(m1f0, case_type='house') factory.form_requires_case(m1f0, parent_case_type='house') m1f1 = factory.new_form(m1) factory.form_requires_case(m1f1) # only loads a person case and not a house case errors = factory.app.validate_app() self.assertIn(case_tile_error, errors)
def test_case_list_registration_form_advanced_autoload(self): factory = AppFactory(build_version='2.9') register_module, register_form = factory.new_advanced_module('register_dugong', 'dugong') factory.form_opens_case(register_form) register_form.actions.load_update_cases.append(LoadUpdateAction( case_tag='usercase', auto_select=AutoSelectCase( mode=AUTO_SELECT_USERCASE, ) )) case_module, update_form = factory.new_advanced_module('update_dugong', 'dugong') factory.form_updates_case(update_form) case_module.case_list_form.form_id = register_form.get_unique_id() case_module.case_list_form.label = { 'en': 'Register another Dugong' } self.assertXmlEqual(self.get_xml('case-list-form-advanced-autoload'), factory.app.create_suite())
def setUpClass(cls): super(AppManagerDataSourceConfigTest, cls).setUpClass() factory = AppFactory(domain=cls.domain) # create main form that defines case schema m0, f0 = factory.new_basic_module('Main Module', cls.case_type) f0.source = get_simple_xform() f0.name = {'en': 'Main Form'} factory.form_requires_case(f0, case_type=cls.case_type, update={ cp: '/data/{}'.format(cp) for cp in cls.case_properties.keys() }) cls.main_form = f0 # create another module/form to generate a parent case relationship # for the main case type m1, f1 = factory.new_basic_module('Parent Module', cls.parent_type) f1.source = get_simple_xform() # not used, just needs to be some valid XForm f1.name = {'en': 'Parent Form'} factory.form_opens_case(f1, case_type=cls.parent_type) factory.form_opens_case(f1, case_type=cls.case_type, is_subcase=True) cls.app = factory.app cls.app.save()
def test_case_list_form_requires_parent_case_but_target_doesnt(self): factory = AppFactory(build_version='2.9.0') register_household_module, register_household_form = factory.new_basic_module('new_household', 'household') factory.form_opens_case(register_household_form) households, edit_household_form = factory.new_basic_module('households', 'household', case_list_form=register_household_form) factory.form_requires_case(edit_household_form) register_member_module, register_member_form = factory.new_advanced_module('new_member', 'member') factory.form_requires_case(register_member_form, 'household') factory.form_opens_case(register_member_form, 'member', is_subcase=True) members, edit_member_form = factory.new_basic_module('members', 'member', case_list_form=register_member_form) factory.form_requires_case(edit_member_form) suite = factory.app.create_suite() self.assertXmlEqual( self.get_xml('source_requires_case_target_doesnt'), suite )
def test_parent_child_properties(self): factory = AppFactory() household_module, houshold_form_1 = factory.new_basic_module('household_module', 'household') patient_module, patient_form_1 = factory.new_basic_module('patient_module', 'patient') referral_module, referral_form_1 = factory.new_basic_module('referral_module', 'referral') factory.form_requires_case(houshold_form_1, 'household', update={ 'household_name': 'HH', }) factory.form_opens_case(houshold_form_1, 'patient', is_subcase=True) factory.form_requires_case(patient_form_1, update={ 'patient_id': 1, 'parent/household_id': 1, }) factory.form_opens_case(patient_form_1, 'referral', is_subcase=True) factory.form_requires_case(referral_form_1, update={ 'parent/patient_name': "Ralph", 'parent/parent/household_color': 'green', 'referral_id': 1, }) self.assertCaseProperties(factory.app, 'household', [ 'household_color', 'household_id', 'household_name', ]) self.assertCaseProperties(factory.app, 'patient', [ 'parent/household_color', 'parent/household_id', 'parent/household_name', 'patient_id', 'patient_name', ]) self.assertCaseProperties(factory.app, 'referral', [ 'parent/parent/household_color', 'parent/parent/household_id', 'parent/parent/household_name', 'parent/patient_id', 'parent/patient_name', 'referral_id', ])
def test_reference_to_missing_session_variable_in_stack(self): # http://manage.dimagi.com/default.asp?236750 # # Stack create blocks do not update the session after each datum # so items put into the session in one step aren't available later steps # # <datum id="case_id_A" value="instance('commcaresession')/session/data/case_id_new_A"/> # - <datum id="case_id_B" value="instance('casedb')/casedb/case[@case_id=instance('commcaresession')/session/data/case_id_A]/index/host"/> # + <datum id="case_id_B" value="instance('casedb')/casedb/case[@case_id=instance('commcaresession')/session/data/case_id_new_A]/index/host"/> # # in the above example ``case_id_A`` is being added to the session and then # later referenced. However since the session doesn't get updated # the value isn't available in the session. # # To fix this we need to replace any references to previous variables with the full xpath which # that session variable references. # # See corehq.apps.app_manager.suite_xml.post_process.workflow._replace_session_references_in_stack factory = AppFactory(build_version='2.9.0/latest') m0, m0f0 = factory.new_basic_module('person registration', 'person') factory.form_opens_case(m0f0) m1, m1f0 = factory.new_advanced_module('episode registration', 'episode') factory.form_requires_case(m1f0, case_type='person') factory.form_opens_case(m1f0, case_type='episode', is_subcase=True, is_extension=True) m2, m2f0 = factory.new_advanced_module('tests', 'episode') factory.form_requires_case(m2f0, 'episode') factory.advanced_form_autoloads(m2f0, AUTO_SELECT_CASE, 'host', 'load_episode_0') m1f0.post_form_workflow = WORKFLOW_FORM m1f0.form_links = [ FormLink(xpath="true()", form_id=m2f0.unique_id, datums=[ FormDatum(name='case_id_load_episode_0', xpath="instance('commcaresession')/session/data/case_id_new_episode_0") ]), ] self.assertXmlPartialEqual(self.get_xml('form_link_enikshay'), factory.app.create_suite(), "./entry")
def _build_workflow_app(self, mode): factory = AppFactory(build_version='2.9.0/latest') m0, m0f0 = factory.new_basic_module('m0', '') factory.new_form(m0) m1, m1f0 = factory.new_basic_module('m1', 'patient') m1f1 = factory.new_form(m1) factory.form_opens_case(m1f0) factory.form_requires_case(m1f1) m2, m2f0 = factory.new_basic_module('m2', 'patient') m2f1 = factory.new_form(m2) factory.form_requires_case(m2f0) factory.form_requires_case(m2f1) m3, m3f0 = factory.new_basic_module('m3', 'child') m3f1 = factory.new_form(m3) factory.form_requires_case(m3f0, parent_case_type='patient') factory.form_requires_case(m3f1) m4, m4f0 = factory.new_advanced_module('m4', 'patient') factory.form_requires_case(m4f0, case_type='patient') factory.form_requires_case(m4f0, case_type='patient') m4f1 = factory.new_form(m4) factory.form_requires_case(m4f1, case_type='patient') factory.form_requires_case(m4f1, case_type='patient') factory.form_requires_case(m4f1, case_type='patient') m4f2 = factory.new_form(m4) factory.form_requires_case(m4f2, case_type='patient') factory.form_requires_case(m4f2, case_type='patient') factory.advanced_form_autoloads(m4f2, AUTO_SELECT_RAW, 'case_id') for module in factory.app.get_modules(): for form in module.get_forms(): form.post_form_workflow = mode return factory.app
def test_case_list_form_parent_child_submodule_advanced_rename_case_var(self): """Test that the session vars in the entries for the submodule get updated to match the parent (and to avoid naming conflicts). m3-f0: 'case_id_load_house' -> 'case_id_load_house_renamed' m3-f0: 'case_id_load_house_renamed' -> 'case_id_load_house_renamed_person' """ factory = AppFactory(build_version='2.9') register_house_module, register_house_form = factory.new_basic_module('register_house', 'house') factory.form_opens_case(register_house_form) register_person_module, register_person_form = factory.new_advanced_module('register_person', 'person') factory.form_updates_case(register_person_form, 'house') factory.form_opens_case(register_person_form, 'person', is_subcase=True) house_module, update_house_form = factory.new_advanced_module( 'update_house', 'house', case_list_form=register_house_form ) factory.form_updates_case(update_house_form) # changing this case tag should result in the session var in the submodule entry being updated to match it update_house_form.actions.load_update_cases[0].case_tag = 'load_house_renamed' person_module, update_person_form = factory.new_advanced_module( 'update_person', 'person', parent_module=house_module, case_list_form=register_person_form ) factory.form_updates_case(update_person_form, 'house') factory.form_updates_case(update_person_form, 'person', parent_case_type='house') # making this case tag the same as the one in the parent module should mean that it will also # get changed to avoid conflicts update_person_form.actions.load_update_cases[1].case_tag = 'load_house_renamed' self.assertXmlEqual(self.get_xml('case-list-form-suite-parent-child-submodule-advanced-rename-var'), factory.app.create_suite())
def _build_workflow_app(self, mode): factory = AppFactory(build_version="2.9.0/latest") m0, m0f0 = factory.new_basic_module("m0", "") factory.new_form(m0) m1, m1f0 = factory.new_basic_module("m1", "patient") m1f1 = factory.new_form(m1) factory.form_opens_case(m1f0) factory.form_updates_case(m1f1) m2, m2f0 = factory.new_basic_module("m2", "patient") m2f1 = factory.new_form(m2) factory.form_updates_case(m2f0) factory.form_updates_case(m2f1) m3, m3f0 = factory.new_basic_module("m3", "child") m3f1 = factory.new_form(m3) factory.form_updates_case(m3f0, parent_case_type="patient") factory.form_updates_case(m3f1) m4, m4f0 = factory.new_advanced_module("m4", "patient") factory.form_updates_case(m4f0, case_type="patient") factory.form_updates_case(m4f0, case_type="patient") m4f1 = factory.new_form(m4) factory.form_updates_case(m4f1, case_type="patient") factory.form_updates_case(m4f1, case_type="patient") factory.form_updates_case(m4f1, case_type="patient") m4f2 = factory.new_form(m4) factory.form_updates_case(m4f2, case_type="patient") factory.form_updates_case(m4f2, case_type="patient") factory.advanced_form_autoloads(m4f2, AUTO_SELECT_RAW, "case_id") for module in factory.app.get_modules(): for form in module.get_forms(): form.post_form_workflow = mode return factory.app
def test_form_rename_session_vars(self): """ The session vars in the entries for the submodule should match the parent and avoid naming conflicts. """ factory = AppFactory(build_version='2.9.0') reg_goldfish_mod, reg_goldfish_form = factory.new_basic_module('reg_goldfish', 'gold-fish') factory.form_opens_case(reg_goldfish_form) reg_guppy_mod, reg_guppy_form = factory.new_advanced_module('reg_guppy', 'guppy') factory.form_requires_case(reg_guppy_form, 'gold-fish') factory.form_opens_case(reg_guppy_form, 'guppy', is_subcase=True) upd_goldfish_mod, upd_goldfish_form = factory.new_advanced_module( 'upd_goldfish', 'gold-fish', ) factory.form_requires_case(upd_goldfish_form) # changing this case tag should result in the session var in the submodule entry being updated to match it upd_goldfish_form.actions.load_update_cases[0].case_tag = 'load_goldfish_renamed' upd_guppy_mod, upd_guppy_form = factory.new_advanced_module( 'upd_guppy', 'guppy', parent_module=upd_goldfish_mod, ) upd_guppy_form.source = self.get_xml('original_form', override_path=('data',)).decode('utf-8') factory.form_requires_case(upd_guppy_form, 'gold-fish', update={'question1': '/data/question1'}) factory.form_requires_case( upd_guppy_form, 'guppy', parent_case_type='gold-fish', update={'question1': '/data/question1'} ) # making this case tag the same as the one in the parent module should mean that it will also get changed # to avoid conflicts upd_guppy_form.actions.load_update_cases[1].case_tag = 'load_goldfish_renamed' self.assertXmlEqual(self.get_xml('child-module-rename-session-vars'), upd_guppy_form.render_xform())