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_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 #3
0
class FormFilterErrorTests(SimpleTestCase, TestFileMixin):
    file_path = ('data', 'suite')

    def setUp(self):
        self.suite_xml_is_usercase_in_use_patch = patch('corehq.apps.app_manager.suite_xml.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][1]/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_updates_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')
    def test_with_case_management_both_update(self):
        factory = AppFactory(build_version="2.9.0/latest")
        m0, m0f0 = factory.new_basic_module("m0", "frog")
        factory.form_updates_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="(today() - dob) > 7", form_id=m1f0.unique_id)]

        self.assertXmlPartialEqual(self.get_xml("form_link_update_case"), factory.app.create_suite(), "./entry[1]")
Exemple #5
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_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')

        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_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_with_case_management_multiple_links(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)

        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_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 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())
Exemple #14
0
    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_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_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())
Exemple #17
0
class FormFilterErrorTests(SimpleTestCase, TestFileMixin):
    file_path = ('data', 'suite')

    def setUp(self):
        self.suite_xml_is_usercase_in_use_patch = patch(
            'corehq.apps.app_manager.suite_xml.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][1]/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_updates_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')
    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
Exemple #19
0
    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