def test_target_module_different_datums(self):
        """
        * Registration
          * Register patient form
            * open case (patient), update user_case
        * Visits (case type = patient, case list form = 'Register patient')
          * Visit form
            * update case, open child case (visit), load from user_case
          * Record notes
            * update case, open child case (visit)
          * Update patient
            * update case
        """

        factory = AppFactory(build_version='2.9')
        registration_module, registration_form = factory.new_basic_module('registration', 'patient')

        factory.form_opens_case(registration_form)
        factory.form_uses_usercase(registration_form, preload={'username': '******'})

        visit_module, visit_form = factory.new_basic_module(
            'visits',
            'patient',
            case_list_form=registration_form
        )

        factory.form_requires_case(visit_form)
        factory.form_opens_case(visit_form, 'visit', is_subcase=True)
        factory.form_uses_usercase(visit_form, preload={'username': '******'})

        notes_form = factory.new_form(visit_module)
        factory.form_requires_case(notes_form)
        factory.form_opens_case(notes_form, 'visit', is_subcase=True)

        update_patient_form = factory.new_form(visit_module)
        factory.form_requires_case(update_patient_form)

        self.assertXmlPartialEqual(
            self.get_xml('target_module_different_datums'),
            factory.app.create_suite(),
            './entry')
Example #2
0
class DisabledUserPropertiesSchemaTest(SimpleTestCase):
    # TODO remove this test when removing USER_PROPERTY_EASY_REFS toggle

    def setUp(self):
        self.factory = AppFactory()

    def test_get_session_schema(self):
        module, form = self.factory.new_basic_module('village', 'village')
        schema = get_session_schema(form)
        self.assertNotIn("context", schema["structure"], repr(schema))

    def test_get_casedb_schema(self):
        module, form = self.factory.new_basic_module('village', 'village')
        self.factory.form_uses_usercase(form,
                                        update={
                                            'name': '/data/username',
                                            'role': '/data/userrole',
                                        })
        schema = get_casedb_schema(form)
        subsets = {s["id"]: s for s in schema["subsets"]}
        self.assertNotIn(USERCASE_TYPE, subsets, repr(subsets))
    def test_target_module_different_datums(self):
        """
        * Registration
          * Register patient form
            * open case (patient), update user_case
        * Visits (case type = patient, case list form = 'Register patient')
          * Visit form
            * update case, open child case (visit), load from user_case
          * Record notes
            * update case, open child case (visit)
          * Update patient
            * update case
        """

        factory = AppFactory(build_version='2.9')
        registration_module, registration_form = factory.new_basic_module(
            'registration', 'patient')

        factory.form_opens_case(registration_form)
        factory.form_uses_usercase(registration_form,
                                   preload={'username': '******'})

        visit_module, visit_form = factory.new_basic_module(
            'visits', 'patient', case_list_form=registration_form)

        factory.form_requires_case(visit_form)
        factory.form_opens_case(visit_form, 'visit', is_subcase=True)
        factory.form_uses_usercase(visit_form,
                                   preload={'username': '******'})

        notes_form = factory.new_form(visit_module)
        factory.form_requires_case(notes_form)
        factory.form_opens_case(notes_form, 'visit', is_subcase=True)

        update_patient_form = factory.new_form(visit_module)
        factory.form_requires_case(update_patient_form)

        self.assertXmlPartialEqual(
            self.get_xml('target_module_different_datums'),
            factory.app.create_suite(), './entry')
Example #4
0
class SchemaTest(SimpleTestCase):
    def setUp(self):
        self.factory = AppFactory()
        self.factory_2 = AppFactory()

    def test_get_casedb_schema_form_without_cases(self):
        survey = self.add_form()
        schema = get_casedb_schema(survey)
        self.assert_has_kv_pairs(
            schema, {
                "id": "casedb",
                "uri": "jr://instance/casedb",
                "name": "case",
                "path": "/casedb/case",
                "structure": {},
                "subsets": [],
            })

    def test_get_casedb_schema_with_form(self):
        village = self.add_form("village")
        self.factory.form_requires_case(
            village,
            case_type=self.factory.app.get_module(0).case_type,
            update={'foo': '/data/question1'})
        schema = get_casedb_schema(village)
        self.assertEqual(len(schema["subsets"]), 1, schema["subsets"])
        self.assert_has_kv_pairs(
            schema["subsets"][0], {
                'id': 'case',
                'name': 'village',
                'structure': {
                    'case_name': {
                        "description": ""
                    },
                    'foo': {
                        "description": ""
                    },
                },
                'related': None,
            })

    def test_get_casedb_schema_with_related_case_types(self):
        family = self.add_form("family")
        village = self.add_form("village")
        self.factory.form_opens_case(village,
                                     case_type='family',
                                     is_subcase=True)
        self.factory.form_requires_case(family,
                                        case_type='family',
                                        update={
                                            'foo': '/data/question1',
                                        })
        schema = get_casedb_schema(family)
        subsets = {s["id"]: s for s in schema["subsets"]}
        self.assertEqual(subsets["parent"]["related"], None)
        self.assertDictEqual(
            subsets["case"]["related"], {
                "parent": {
                    "hashtag": "#case/parent",
                    "subset": "parent",
                    "key": "@case_id",
                }
            })

    def test_get_casedb_schema_with_multiple_parent_case_types(self):
        referral = self.add_form("referral")
        self.factory.form_requires_case(referral,
                                        case_type='referral',
                                        update={
                                            'foo': '/data/question1',
                                        })
        child = self.add_form("child")
        self.factory.form_opens_case(child,
                                     case_type='referral',
                                     is_subcase=True)
        pregnancy = self.add_form("pregnancy")
        self.factory.form_opens_case(pregnancy,
                                     case_type='referral',
                                     is_subcase=True)
        schema = get_casedb_schema(referral)
        subsets = {s["id"]: s for s in schema["subsets"]}
        self.assertTrue(
            re.match(r'^parent \((pregnancy|child) or (pregnancy|child)\)$',
                     subsets["parent"]["name"]))
        self.assertEqual(subsets["parent"]["structure"],
                         {"case_name": {
                             "description": ""
                         }})

    def test_get_casedb_schema_with_deep_hierarchy(self):
        child = self.add_form("child")
        case_type = self.factory.app.get_module(0).case_type
        case_update = {'foo': '/data/question1'}
        self.factory.form_requires_case(child,
                                        case_type=case_type,
                                        update=case_update)
        parent = self.add_form("parent")
        self.factory.form_requires_case(parent,
                                        case_type=case_type,
                                        update=case_update)
        self.factory.form_opens_case(parent,
                                     case_type='child',
                                     is_subcase=True)
        grandparent = self.add_form("grandparent")
        self.factory.form_opens_case(grandparent,
                                     case_type='parent',
                                     is_subcase=True)
        self.factory.form_requires_case(grandparent,
                                        case_type=case_type,
                                        update=case_update)
        greatgrandparent = self.add_form("greatgrandparent")
        self.factory.form_opens_case(greatgrandparent,
                                     case_type='grandparent',
                                     is_subcase=True)
        schema = get_casedb_schema(child)
        self.assertEqual(
            [s["name"] for s in schema["subsets"]],
            ["child", "parent (parent)", "grandparent (grandparent)"])
        schema = get_casedb_schema(parent)
        self.assertEqual([s["name"] for s in schema["subsets"]], [
            "parent", "parent (grandparent)", "grandparent (greatgrandparent)"
        ])
        schema = get_casedb_schema(grandparent)
        self.assertEqual([s["name"] for s in schema["subsets"]],
                         ["grandparent", "parent (greatgrandparent)"])

    def test_get_casedb_schema_with_parent_case_property_update(self):
        family = self.add_form("family",
                               {"parent/has_well": "/data/village_has_well"})
        village = self.add_form("village")
        self.factory.form_opens_case(village,
                                     case_type='family',
                                     is_subcase=True)
        schema = get_casedb_schema(family)
        subsets = {s["id"]: s for s in schema["subsets"]}
        self.assertDictEqual(
            subsets["case"]["related"], {
                "parent": {
                    "hashtag": "#case/parent",
                    "subset": "parent",
                    "key": "@case_id",
                }
            })
        self.assertEqual(subsets["case"]["structure"]["case_name"],
                         {"description": ""})
        #self.assertEqual(subsets["parent"]["structure"]["has_well"], {}) TODO
        self.assertNotIn("parent/has_well", subsets["case"]["structure"])

    def test_get_session_schema_for_module_with_no_case_type(self):
        form = self.add_form()
        schema = get_session_schema(form)
        self.assert_has_kv_pairs(
            schema, {
                "id": "commcaresession",
                "uri": "jr://instance/session",
                "name": "Session",
                "path": "/session",
            })
        assert "data" not in schema["structure"], schema["structure"]

    def test_get_session_schema_for_simple_module_with_case(self):
        module, form = self.factory.new_basic_module('village', 'village')
        self.factory.form_requires_case(form)
        schema = get_session_schema(form)
        self.assertDictEqual(
            schema["structure"], {
                "data": {
                    "merge": True,
                    "structure": {
                        "case_id": {
                            "reference": {
                                "hashtag": "#case",
                                "source": "casedb",
                                "subset": "case",
                                "key": "@case_id",
                            },
                        },
                    },
                },
            })

    def test_get_session_schema_for_child_module(self):
        # m0 - opens 'gold-fish' case.
        # m1 - has m0 as root-module, has parent-select, updates 'guppy' case
        self.module_0, _ = self.factory.new_basic_module('parent', 'gold-fish')
        self.module_1, _ = self.factory.new_basic_module(
            'child', 'guppy', parent_module=self.module_0)
        # m0f0 registers gold-fish case and a child case ('guppy')
        m0f0 = self.module_0.get_form(0)
        self.factory.form_requires_case(m0f0, update={'name': 'goldilocks'})
        self.factory.form_opens_case(m0f0, 'guppy', is_subcase=True)

        # m1f0 has parent-select, updates `guppy` case
        m1f0 = self.module_1.get_form(0)
        self.factory.form_requires_case(m1f0, parent_case_type='gold-fish')

        casedb_schema = get_casedb_schema(m1f0)
        session_schema = get_session_schema(m1f0)

        expected_session_schema_structure = {
            "data": {
                "merge": True,
                "structure": {
                    "case_id_guppy": {
                        "reference": {
                            "hashtag": "#case",
                            "subset": "case",
                            "source": "casedb",
                            "key": "@case_id"
                        }
                    }
                }
            }
        }

        expected_casedb_schema_subsets = [{
            "structure": {
                "case_name": {
                    "description": "",
                }
            },
            "related": {
                "parent": {
                    "hashtag": "#case/parent",
                    "subset": "parent",
                    "key": "@case_id",
                }
            },
            "id": "case",
            "name": "guppy"
        }, {
            "structure": {
                "name": {
                    "description": "",
                },
                "case_name": {
                    "description": "",
                }
            },
            "related": None,
            "id": "parent",
            "name": "parent (gold-fish)"
        }]

        self.assertEqual(casedb_schema['subsets'],
                         expected_casedb_schema_subsets)
        self.assertEqual(session_schema['structure'],
                         expected_session_schema_structure)

    def test_get_case_sharing_hierarchy(self):
        with patch('corehq.apps.app_manager.app_schemas.case_properties.get_case_sharing_apps_in_domain')\
                as mock_sharing:
            mock_sharing.return_value = [self.factory.app, self.factory_2.app]
            self.factory.app.case_sharing = True
            self.factory_2.app.case_sharing = True

            self.add_form("referral")
            child = self.add_form("child")
            self.factory.form_opens_case(child,
                                         case_type='referral',
                                         is_subcase=True)
            pregnancy = self.add_form("pregnancy")
            self.factory.form_opens_case(pregnancy,
                                         case_type='referral',
                                         is_subcase=True)
            schema = get_casedb_schema(pregnancy)
            subsets = {s["id"]: s for s in schema["subsets"]}
            self.assertEqual(subsets, {})

            referral_2 = self.add_form_app_2('referral')
            self.factory.form_requires_case(referral_2,
                                            case_type='referral',
                                            update={
                                                'foo': '/data/question1',
                                            })
            schema = get_casedb_schema(referral_2)
            subsets = {s["id"]: s for s in schema["subsets"]}
            self.assertTrue(
                re.match(
                    r'^parent \((pregnancy|child) or (pregnancy|child)\)$',
                    subsets["parent"]["name"]))
            self.assertEqual(subsets["parent"]["structure"],
                             {"case_name": {
                                 "description": ""
                             }})

    def test_get_session_schema_with_user_case(self):
        module, form = self.factory.new_basic_module('village', 'village')
        with patch('corehq.apps.app_manager.app_schemas.casedb_schema.is_usercase_in_use') as mock1, \
                patch('corehq.apps.app_manager.app_schemas.session_schema.is_usercase_in_use') as mock2:
            mock1.return_value = True
            mock2.return_value = True
            schema = get_session_schema(form)
            self.assertDictEqual(
                schema["structure"]["context"], {
                    "merge": True,
                    "structure": {
                        "userid": {
                            "reference": {
                                "hashtag": "#user",
                                "source": "casedb",
                                "subset": util.USERCASE_TYPE,
                                "subset_key": "@case_type",
                                "subset_filter": True,
                                "key": "hq_user_id",
                            },
                        },
                    },
                })

    def test_get_casedb_schema_with_user_case(self):
        module, form = self.factory.new_basic_module('village', 'village')
        self.factory.form_uses_usercase(form,
                                        update={
                                            'name': '/data/username',
                                            'role': '/data/userrole',
                                        })
        with patch('corehq.apps.app_manager.app_schemas.casedb_schema.is_usercase_in_use') as mock1, \
                patch('corehq.apps.app_manager.app_schemas.case_properties.is_usercase_in_use') as mock2:
            mock1.return_value = True
            mock2.return_value = True
            schema = get_casedb_schema(form)
            subsets = {s["id"]: s for s in schema["subsets"]}
            self.assertDictEqual(
                subsets[USERCASE_TYPE], {
                    "id": USERCASE_TYPE,
                    "key": "@case_type",
                    "name": "user",
                    "structure": {
                        "name": {},
                        "role": {},
                    },
                })

    # -- helpers --

    def assert_has_kv_pairs(self, test_dict, expected_dict):
        """Assert that test_dict contains all key/value pairs in expected_dict

        Key/value pairs in `test_dict` but not present in
        `expected_dict` will be ignored.
        """
        for key, value in expected_dict.items():
            self.assertEqual(test_dict[key], value)

    def add_form(self, case_type=None, case_updates=None):
        module_id = len(self.factory.app.modules)
        module, form = self.factory.new_basic_module(module_id, case_type)
        if case_type:
            self.factory.form_opens_case(form, case_type)
        if case_updates:
            assert case_type, 'case_type is required with case_updates'
            self.factory.form_requires_case(form,
                                            case_type=case_type,
                                            update=case_updates)
        return form

    def add_form_app_2(self, case_type=None, case_updates=None):
        module_id = len(self.factory_2.app.modules)
        module, form = self.factory_2.new_basic_module(module_id, case_type)
        if case_type:
            self.factory_2.form_opens_case(form, case_type)
        if case_updates:
            assert case_type, 'case_type is required with case_updates'
            self.factory_2.form_requires_case(form,
                                              case_type=case_type,
                                              update=case_updates)
        return form