def test_export_instance_from_saved(self):
        """This test ensures that when we build from a saved export instance that the selection that a user
        makes is still there"""
        build_ids_and_versions = {
            self.app_id: 3,
        }
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions',
                return_value=build_ids_and_versions):
            instance = FormExportInstance.generate_instance_from_schema(self.schema)

        instance.save()
        self.assertEqual(len(instance.tables), 1)
        self.assertEqual(len(instance.tables[0].columns), 1)
        self.assertTrue(instance.tables[0].columns[0].selected)

        # Simulate a selection
        instance.tables[0].columns[0].selected = False

        instance.save()
        self.assertFalse(instance.tables[0].columns[0].selected)

        with mock.patch(
                'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions',
                return_value=build_ids_and_versions):

            instance = FormExportInstance.generate_instance_from_schema(
                self.new_schema,
                saved_export=instance
            )

        self.assertEqual(len(instance.tables), 2)
        self.assertEqual(len(instance.tables[0].columns), 2)
        # Selection from previous instance should hold the same and not revert to defaults
        self.assertFalse(instance.tables[0].columns[0].selected)
    def test_export_instance_deleted_columns_updated(self):
        """This test ensures that when building from a saved export that the new instance correctly labels the
        old columns as advanced
        """
        build_ids_and_versions = {
            self.app_id: 3,
        }
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions',
                return_value=build_ids_and_versions):
            instance = FormExportInstance.generate_instance_from_schema(self.schema)

        instance.save()
        self.assertEqual(len(instance.tables), 1)
        self.assertEqual(len(instance.tables[0].columns), 1)
        self.assertTrue(instance.tables[0].columns[0].selected)

        # Every column should now be marked as advanced
        build_ids_and_versions = {
            self.app_id: 4,
        }
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions',
                return_value=build_ids_and_versions):

            instance = FormExportInstance.generate_instance_from_schema(
                self.new_schema,
                saved_export=instance
            )

        self.assertEqual(len(instance.tables), 2)
        self.assertEqual(len(instance.tables[0].columns), 2)
        self.assertEqual(len(filter(lambda c: c.is_advanced, instance.tables[0].columns)), 2)
Exemple #3
0
    def test_generate_instance_from_schema(self, _, __):
        """Only questions that are in the main table and of the same version should be shown"""
        build_ids_and_versions = {self.app_id: 3}
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_app_ids_and_versions',
                return_value=build_ids_and_versions):

            instance = FormExportInstance.generate_instance_from_schema(
                self.schema)

        self.assertEqual(len(instance.tables), 2)

        index, split_column = instance.tables[0].get_column(
            [PathNode(name='data'),
             PathNode(name='question1')], 'MultipleChoiceItem', None)
        self.assertTrue(isinstance(split_column, SplitExportColumn))

        index, stock_column = instance.tables[0].get_column([
            PathNode(name='data'),
            PathNode(name='balance:question-id'),
            PathNode(name='@type')
        ], 'StockItem', None)
        self.assertTrue(isinstance(stock_column, StockFormExportColumn))

        selected = filter(
            lambda column: column.selected,
            instance.tables[0].columns + instance.tables[1].columns)
        selected_system_props = len(
            [x for x in MAIN_FORM_TABLE_PROPERTIES if x.selected])
        self.assertEqual(len(selected), 2 + selected_system_props)
    def test_generate_instance_from_schema(self, _, __):
        """Only questions that are in the main table and of the same version should be shown"""
        build_ids_and_versions = {self.app_id: 3}
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions',
                return_value=build_ids_and_versions):

            instance = FormExportInstance.generate_instance_from_schema(self.schema)

        self.assertEqual(len(instance.tables), 2)

        index, split_column = instance.tables[0].get_column(
            [PathNode(name='data'), PathNode(name='question1')],
            'MultipleChoiceItem',
            None
        )
        self.assertTrue(isinstance(split_column, SplitExportColumn))

        selected = filter(
            lambda column: column.selected,
            instance.tables[0].columns + instance.tables[1].columns
        )
        shown = filter(
            lambda column: column.selected,
            instance.tables[0].columns + instance.tables[1].columns
        )
        selected_system_props = len([x for x in MAIN_FORM_TABLE_PROPERTIES if x.selected])
        self.assertEqual(len(selected), 1 + selected_system_props)
        self.assertEqual(len(shown), 1 + selected_system_props)
Exemple #5
0
    def test_ensure_that_column_is_not_deleted(self, _, __):
        """This test ensures that as long as ONE app in last_occurrences is the most recent version then the
        column is still marked as is_deleted=False
        """

        build_ids_and_versions = {
            self.app_id: 3,
            self.second_app_id: 4,
        }
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_app_ids_and_versions',
                return_value=build_ids_and_versions):
            instance = FormExportInstance.generate_instance_from_schema(
                self.schema)

        selected = [
            column for column in instance.tables[0].columns +
            instance.tables[1].columns if column.selected
        ]
        is_advanced = [
            column for column in instance.tables[0].columns +
            instance.tables[1].columns if column.is_advanced
        ]
        selected_system_props = len(
            [x for x in MAIN_FORM_TABLE_PROPERTIES if x.selected])
        advanced_system_props = len(
            [x for x in MAIN_FORM_TABLE_PROPERTIES if x.is_advanced])
        self.assertEqual(len(selected), 1 + selected_system_props)
        self.assertEqual(len(is_advanced), 0 + advanced_system_props)
Exemple #6
0
    def test_copy_instance(self, _):
        build_ids_and_versions = {
            self.app_id: 3,
        }
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_app_ids_and_versions',
                return_value=build_ids_and_versions):
            instance = FormExportInstance.generate_instance_from_schema(
                self.schema)

        instance.save()
        self.addCleanup(instance.delete)

        new_export = instance.copy_export()
        new_export.save()
        self.assertNotEqual(new_export._id, instance._id)
        self.assertEqual(new_export.name, '{} - Copy'.format(instance.name))
        old_json = instance.to_json()
        del old_json['name']
        del old_json['_id']
        del old_json['_rev']
        new_json = new_export.to_json()
        del new_json['name']
        del new_json['_id']
        del new_json['_rev']
        self.assertDictEqual(old_json, new_json)
    def test_copy_instance(self, _):
        build_ids_and_versions = {
            self.app_id: 3,
        }
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_app_ids_and_versions',
                return_value=build_ids_and_versions):
            instance = FormExportInstance.generate_instance_from_schema(self.schema)

        instance.save()
        self.addCleanup(instance.delete)

        new_export = instance.copy_export()
        new_export.save()
        self.assertNotEqual(new_export._id, instance._id)
        self.assertEqual(new_export.name, '{} - Copy'.format(instance.name))
        old_json = instance.to_json()
        del old_json['name']
        del old_json['_id']
        del old_json['_rev']
        new_json = new_export.to_json()
        del new_json['name']
        del new_json['_id']
        del new_json['_rev']
        self.assertDictEqual(old_json, new_json)
    def test_ensure_that_column_is_not_deleted(self, _, __):
        """This test ensures that as long as ONE app in last_occurrences is the most recent version then the
        column is still marked as is_deleted=False
        """

        build_ids_and_versions = {
            self.app_id: 3,
            self.second_app_id: 4,
        }
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions',
                return_value=build_ids_and_versions):
            instance = FormExportInstance.generate_instance_from_schema(self.schema)

        selected = filter(
            lambda column: column.selected,
            instance.tables[0].columns + instance.tables[1].columns
        )
        is_advanced = filter(
            lambda column: column.is_advanced,
            instance.tables[0].columns + instance.tables[1].columns
        )
        selected_system_props = len([x for x in MAIN_FORM_TABLE_PROPERTIES if x.selected])
        advanced_system_props = len([x for x in MAIN_FORM_TABLE_PROPERTIES if x.is_advanced])
        self.assertEqual(len(selected), 1 + selected_system_props)
        self.assertEqual(len(is_advanced), 0 + advanced_system_props)
Exemple #9
0
    def _generate_instance(self, build_ids_and_versions, saved_export=None):
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_app_ids_and_versions',
                return_value=build_ids_and_versions):

            return FormExportInstance.generate_instance_from_schema(
                self.schema, saved_export=saved_export)
 def _update_instance(self, build_ids_and_versions, instance):
     with mock.patch(
             'corehq.apps.export.models.new.get_latest_app_ids_and_versions',
             return_value=build_ids_and_versions):
         instance = FormExportInstance.generate_instance_from_schema(
             self.new_schema,
             saved_export=instance
         )
     return instance
    def test_export_instance_from_saved(self, _):
        """This test ensures that when we build from a saved export instance that the selection that a user
        makes is still there"""
        first_non_system_property = len(TOP_MAIN_FORM_TABLE_PROPERTIES)
        build_ids_and_versions = {
            self.app_id: 3,
        }
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_app_ids_and_versions',
                return_value=build_ids_and_versions):
            instance = FormExportInstance.generate_instance_from_schema(
                self.schema)

        instance.save()
        self.assertEqual(len(instance.tables), 1)
        self.assertEqual(len(instance.tables[0].columns),
                         1 + len(MAIN_FORM_TABLE_PROPERTIES))
        self.assertTrue(
            instance.tables[0].columns[first_non_system_property].selected)
        item = instance.tables[0].columns[first_non_system_property].item

        # Simulate a selection
        instance.tables[0].columns[first_non_system_property].selected = False

        instance.save()
        self.assertFalse(
            instance.tables[0].columns[first_non_system_property].selected)

        with mock.patch(
                'corehq.apps.export.models.new.get_latest_app_ids_and_versions',
                return_value=build_ids_and_versions):

            instance = FormExportInstance.generate_instance_from_schema(
                self.new_schema, saved_export=instance)

        self.assertEqual(len(instance.tables), 2)
        self.assertEqual(len(instance.tables[0].columns),
                         2 + len(MAIN_FORM_TABLE_PROPERTIES))

        # Selection from previous instance should hold the same and not revert to defaults
        idx, column = instance.tables[0].get_column(item.path, item.doc_type,
                                                    item.transform)
        self.assertFalse(column.selected)
 def _get_instance(self, build_ids_and_versions):
     with mock.patch(
             'corehq.apps.export.models.new.get_latest_app_ids_and_versions',
             return_value=build_ids_and_versions):
         instance = FormExportInstance.generate_instance_from_schema(self.schema)
     instance.save()
     self.addCleanup(instance.delete)
     self.assertEqual(len(instance.tables), 1)
     self.assertEqual(len(instance.tables[0].columns), 3 + len(MAIN_FORM_TABLE_PROPERTIES))
     self.assertTrue(instance.tables[0].columns[len(TOP_MAIN_FORM_TABLE_PROPERTIES)].selected)
     return instance
Exemple #13
0
 def _get_instance(self, build_ids_and_versions):
     with mock.patch(
             'corehq.apps.export.models.new.get_latest_app_ids_and_versions',
             return_value=build_ids_and_versions):
         instance = FormExportInstance.generate_instance_from_schema(self.schema)
     instance.save()
     self.addCleanup(instance.delete)
     self.assertEqual(len(instance.tables), 1)
     self.assertEqual(len(instance.tables[0].columns), 3 + len(MAIN_FORM_TABLE_PROPERTIES))
     self.assertTrue(instance.tables[0].columns[len(TOP_MAIN_FORM_TABLE_PROPERTIES)].selected)
     return instance
Exemple #14
0
    def test_export_instance_deleted_columns_updated(self, _):
        """This test ensures that when building from a saved export that the new instance correctly labels the
        old columns as advanced
        """
        build_ids_and_versions = {
            self.app_id: 3,
        }
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_app_ids_and_versions',
                return_value=build_ids_and_versions):
            instance = FormExportInstance.generate_instance_from_schema(
                self.schema)

        instance.save()
        self.assertEqual(len(instance.tables), 1)
        self.assertEqual(len(instance.tables[0].columns),
                         1 + len(MAIN_FORM_TABLE_PROPERTIES))
        self.assertTrue(instance.tables[0].columns[len(
            TOP_MAIN_FORM_TABLE_PROPERTIES)].selected)

        # Every column should now be marked as advanced
        build_ids_and_versions = {
            self.app_id: 4,
        }
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_app_ids_and_versions',
                return_value=build_ids_and_versions):

            instance = FormExportInstance.generate_instance_from_schema(
                self.new_schema, saved_export=instance)

        self.assertEqual(len(instance.tables), 2)
        self.assertEqual(len(instance.tables[0].columns),
                         2 + len(MAIN_FORM_TABLE_PROPERTIES))
        self.assertEqual(
            len(filter(lambda c: c.is_advanced, instance.tables[0].columns)),
            2 + len([x for x in MAIN_FORM_TABLE_PROPERTIES if x.is_advanced]))
Exemple #15
0
    def test_ensure_that_column_is_deleted(self, _, __):
        """If both apps are out of date then, the question is indeed deleted"""
        build_ids_and_versions = {
            self.app_id: 3,
            self.second_app_id: 5,
        }
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_app_ids_and_versions',
                return_value=build_ids_and_versions):
            instance = FormExportInstance.generate_instance_from_schema(self.schema)

        selected = [column for column in instance.tables[0].columns + instance.tables[1].columns if column.selected]
        shown = [column for column in instance.tables[0].columns + instance.tables[1].columns if column.selected]
        selected_system_props = len([x for x in MAIN_FORM_TABLE_PROPERTIES if x.selected])
        self.assertEqual(len(selected), 0 + selected_system_props)
        self.assertEqual(len(shown), 0 + selected_system_props)
    def test_ensure_that_column_is_deleted(self, _, __):
        """If both apps are out of date then, the question is indeed deleted"""
        build_ids_and_versions = {
            self.app_id: 3,
            self.second_app_id: 5,
        }
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_app_ids_and_versions',
                return_value=build_ids_and_versions):
            instance = FormExportInstance.generate_instance_from_schema(self.schema)

        selected = [column for column in instance.tables[0].columns + instance.tables[1].columns if column.selected]
        shown = [column for column in instance.tables[0].columns + instance.tables[1].columns if column.selected]
        selected_system_props = len([x for x in MAIN_FORM_TABLE_PROPERTIES if x.selected])
        self.assertEqual(len(selected), 0 + selected_system_props)
        self.assertEqual(len(shown), 0 + selected_system_props)
    def test_generate_instance_from_schema_deleted(self, _):
        """Given a higher app_version, all the old questions should not be shown or selected"""
        build_ids_and_versions = {self.app_id: 4}
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions',
                return_value=build_ids_and_versions):
            instance = FormExportInstance.generate_instance_from_schema(self.schema)

        self.assertEqual(len(instance.tables), 2)

        selected = filter(
            lambda column: column.selected,
            instance.tables[0].columns + instance.tables[1].columns
        )
        shown = filter(
            lambda column: column.selected,
            instance.tables[0].columns + instance.tables[1].columns
        )
        self.assertEqual(len(selected), 0)
        self.assertEqual(len(shown), 0)
Exemple #18
0
    def test_generate_instance_from_schema_deleted(self, _, __):
        """Given a higher app_version, all the old questions should not be shown or selected"""
        build_ids_and_versions = {self.app_id: 4}
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_app_ids_and_versions',
                return_value=build_ids_and_versions):
            instance = FormExportInstance.generate_instance_from_schema(
                self.schema)

        self.assertEqual(len(instance.tables), 2)

        selected = filter(
            lambda column: column.selected,
            instance.tables[0].columns + instance.tables[1].columns)
        shown = filter(lambda column: column.selected,
                       instance.tables[0].columns + instance.tables[1].columns)
        selected_system_props = len(
            [x for x in MAIN_FORM_TABLE_PROPERTIES if x.selected])
        self.assertEqual(len(selected), 0 + selected_system_props)
        self.assertEqual(len(shown), 0 + selected_system_props)
    def test_ensure_that_column_is_deleted(self, _):
        """If both apps are out of date then, the question is indeed deleted"""
        build_ids_and_versions = {
            self.app_id: 3,
            self.second_app_id: 5,
        }
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions',
                return_value=build_ids_and_versions):
            instance = FormExportInstance.generate_instance_from_schema(self.schema)

        selected = filter(
            lambda column: column.selected,
            instance.tables[0].columns + instance.tables[1].columns
        )
        shown = filter(
            lambda column: column.selected,
            instance.tables[0].columns + instance.tables[1].columns
        )
        self.assertEqual(len(selected), 0)
        self.assertEqual(len(shown), 0)
    def test_generate_instance_from_schema(self, _):
        """Only questions that are in the main table and of the same version should be shown"""
        build_ids_and_versions = {self.app_id: 3}
        with mock.patch(
                'corehq.apps.export.models.new.get_latest_built_app_ids_and_versions',
                return_value=build_ids_and_versions):

            instance = FormExportInstance.generate_instance_from_schema(self.schema)

        self.assertEqual(len(instance.tables), 2)

        selected = filter(
            lambda column: column.selected,
            instance.tables[0].columns + instance.tables[1].columns
        )
        shown = filter(
            lambda column: column.selected,
            instance.tables[0].columns + instance.tables[1].columns
        )
        self.assertEqual(len(selected), 1)
        self.assertEqual(len(shown), 1)
Exemple #21
0
    def test(self):
        schema = FormExportDataSchema.generate_schema_from_builds(
            self.domain,
            self.app._id,
            self.form_xmlns,
            only_process_current_builds=True,
        )

        for group_schema in schema.group_schemas:
            # group_schema is an instance of ExportGroupSchem
            # group_schema.items is an array of ExportItems subclasses
            path = [node.name for node in group_schema.path]
            if path == []:
                main_group_schema = group_schema
            elif path == ['form', 'babies']:
                baby_repeat_group_schema = group_schema

        assertContainsExportItems(
            [
                # Verify that a simple form question appears in the schema
                ('form.how_are_you_today', 'How are you today?'),
                ('form.how_many_babies', 'How many babies?'),
                ('form.add_a_prescription', 'Add a prescription?'),
                ('form.voucher-name', '#form/voucher-name'),
                ('form.is_this_a_delivery', 'Is this a delivery?'),
                ('form.facility_name', '#form/facility_name'),

                # Verify that the main parent case updates appear (case type "mom")
                ('form.case.@case_id', 'case.@case_id'),
                ('form.case.@date_modified', 'case.@date_modified'),
                ('form.case.@user_id', 'case.@user_id'),
                ('form.case.update.last_status', 'case.update.last_status'),

                # Verify that we see case updates for save-to-case cases
                # These are already in the form schema, so they get interpreted like any other question
                ('form.prescription.prescription.case.close',
                 '#form/prescription/prescription/case/close'),
                ('form.prescription.prescription.case.create.case_name',
                 '#form/prescription/prescription/case/create/case_name'),
                ('form.prescription.prescription.case.create.case_type',
                 '#form/prescription/prescription/case/create/case_type'),
                ('form.prescription.prescription.case.update.number_of_babies',
                 '#form/prescription/prescription/case/update/number_of_babies'
                 ),
                ('form.prescription.prescription_name',
                 '#form/prescription/prescription_name'),
                ('form.prescription.prescription.case.index.parent',
                 '#form/prescription/prescription/case/index/parent'),
                ('form.prescription.prescription.case.@case_id',
                 '#form/prescription/prescription/case/@case_id'),
                ('form.prescription.prescription.case.@user_id',
                 '#form/prescription/prescription/case/@user_id'),
                ('form.prescription.prescription.case.@date_modified',
                 '#form/prescription/prescription/case/@date_modified'),

                # # Verify that we see updates from subcases not in repeat groups (case type "voucher")
                ('form.subcase_0.case.@case_id', 'subcase_0.@case_id'),
                ('form.subcase_0.case.@date_modified',
                 'subcase_0.@date_modified'),
                ('form.subcase_0.case.@user_id', 'subcase_0.@user_id'),
                ('form.subcase_0.case.create.case_name',
                 'subcase_0.create.case_name'),
                ('form.subcase_0.case.create.case_type',
                 'subcase_0.create.case_type'),
                ('form.subcase_0.case.create.owner_id',
                 'subcase_0.create.owner_id'),
                ('form.subcase_0.case.index.parent.#text',
                 'subcase_0.index.#text'),
                ('form.subcase_0.case.index.parent.@case_type',
                 'subcase_0.index.@case_type'),
                ('form.subcase_0.case.update.how_many_babies',
                 'subcase_0.update.how_many_babies'),
            ],
            main_group_schema)

        # Verify that we see updates from subcases in repeat groups (case type "baby")
        assertContainsExportItems([
            ('form.babies.case.@case_id', 'subcase_1.@case_id'),
            ('form.babies.case.@date_modified', 'subcase_1.@date_modified'),
            ('form.babies.case.@user_id', 'subcase_1.@user_id'),
            ('form.babies.case.create.case_name',
             'subcase_1.create.case_name'),
            ('form.babies.case.create.case_type',
             'subcase_1.create.case_type'),
            ('form.babies.case.create.owner_id', 'subcase_1.create.owner_id'),
            ('form.babies.case.update.eye_color',
             'subcase_1.update.eye_color'),
            ('form.babies.case.update.facility_name',
             'subcase_1.update.facility_name'),
            ('form.babies.case.index.parent.#text', 'subcase_1.index.#text'),
            ('form.babies.case.index.parent.@case_type',
             'subcase_1.index.@case_type'),
            ('form.babies.eye_color', 'Eye color?'),
            ('form.babies.whats_the_babys_name', "What's the baby's name?"),
        ], baby_repeat_group_schema)

        instance = FormExportInstance.generate_instance_from_schema(schema)
        instance.export_format = Format.JSON
        # make everything show up in the export
        for table in instance.tables:
            table.selected = True
            for column in table.columns:
                if column.item.path[
                        -1].name == '@case_id' and not column.item.transform:
                    self.assertFalse(column.is_advanced)
                column.selected = True

        with patch('corehq.apps.export.export.get_export_documents') as docs:
            docs.return_value = self.form_es_response
            export_data = get_export_json(instance)

        def get_form_data(table):
            headers = export_data[table]['headers']
            return [
                dict(zip(headers, row)) for row in export_data[table]['rows']
            ]

        self.assertDictContainsSubset(
            {
                # normal form questions
                "form.add_a_prescription": "yes_then_close",
                "form.how_are_you_today": "fine_thanks",
                "form.how_many_babies": "2",
                "form.is_this_a_delivery": "yes",
                "form.voucher-name": "Petunia2017-08-29",

                # standard case update
                "form.case.update.last_status": "fine_thanks",
                "form.case.@case_id": "71626d9c-2d05-491f-81d9-becf8566618a",
                "form.case.@user_id": "853a24735ba89a3019ced7e3153dc60d",

                # save-to-case properties
                "form.prescription.prescription.case.close": "True",
                "form.prescription.prescription.case.create.case_name":
                "Petunia-prescription-2017-08-29",
                "form.prescription.prescription.case.create.case_type":
                "prescription",
                "form.prescription.prescription.case.update.number_of_babies":
                "2",
                "form.prescription.prescription_name":
                "Petunia-prescription-2017-08-29",
                "form.prescription.prescription.case.index.parent":
                "71626d9c-2d05-491f-81d9-becf8566618a",

                # non-repeating subcase actions
                "form.subcase_0.case.@case_id":
                "16954d55-a9be-40dd-98a8-dc7fae9c7ed6",
                "form.subcase_0.case.@date_modified": "2017-08-29 11:19:40",
                "form.subcase_0.case.@user_id":
                "853a24735ba89a3019ced7e3153dc60d",
                "form.subcase_0.case.create.case_name": "Petunia2017-08-29",
                "form.subcase_0.case.create.case_type": "voucher",
                "form.subcase_0.case.create.owner_id":
                "853a24735ba89a3019ced7e3153dc60d",
                "form.subcase_0.case.update.how_many_babies": "2",
                "form.subcase_0.case.index.parent.#text":
                "71626d9c-2d05-491f-81d9-becf8566618a",
                "form.subcase_0.case.index.parent.@case_type": "mom",
            },
            get_form_data('Forms')[0])

        self.assertDictEqual(
            {
                "number": "0.0",
                "number__0": 0,
                "number__1": 0,
                "form.babies.eye_color": "brown",
                "form.babies.whats_the_babys_name": "Bob",
                "form.babies.case.@case_id":
                "5539bd9d-d5d6-44c8-8f78-6915f16b6907",
                "form.babies.case.@date_modified": "2017-08-29 11:19:40",
                "form.babies.case.@user_id":
                "853a24735ba89a3019ced7e3153dc60d",
                "form.babies.case.create.case_name": "Bob",
                "form.babies.case.create.case_type": "baby",
                "form.babies.case.create.owner_id":
                "853a24735ba89a3019ced7e3153dc60d",
                "form.babies.case.index.parent.#text":
                "71626d9c-2d05-491f-81d9-becf8566618a",
                "form.babies.case.index.parent.@case_type": "mom",
                "form.babies.case.update.eye_color": "brown",
                "form.babies.case.update.facility_name": "test",
            },
            get_form_data('Repeat- babies')[0])