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)
Exemple #2
0
    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")
Exemple #5
0
    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())
Exemple #7
0
    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',
        ])
Exemple #9
0
    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 &lt;= 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 &lt;= today()"/>
          </menu>
        </partial>
        """
        self.assertXmlPartialEqual(expected, self.factory.app.create_suite(), './menu')
Exemple #11
0
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_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_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())
Exemple #15
0
    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_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_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())
Exemple #19
0
    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_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())
Exemple #21
0
    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())
Exemple #23
0
 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)
Exemple #26
0
    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'])
Exemple #28
0
    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_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'])
Exemple #30
0
    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")
Exemple #31
0
    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())
Exemple #37
0
    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())
Exemple #38
0
    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',
        ])
Exemple #40
0
    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]')
Exemple #47
0
    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]")
Exemple #49
0
    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',
        ])
Exemple #55
0
    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())