def test_paginated_table(self, export_save): export_instance = FormExportInstance( export_format=Format.JSON, tables=[ TableConfiguration(label="My table", selected=True, columns=[ ExportColumn(label="Q3", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q3') ], ), selected=True), ExportColumn(label="Q1", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q1') ], ), selected=True), ]) ]) assert_instance_gives_results( self.docs + self.docs, export_instance, { 'My table_000': { 'headers': ['Q3', 'Q1'], 'rows': [['baz', 'foo'], ['bop', 'bip']], }, 'My table_001': { 'headers': ['Q3', 'Q1'], 'rows': [['baz', 'foo'], ['bop', 'bip']], } }) self.assertTrue(export_save.called)
def setUpClass(cls): super(TestCaseExportInstanceGeneration, cls).setUpClass() cls.app_id = '1234' cls.schema = CaseExportDataSchema(group_schemas=[ ExportGroupSchema( path=MAIN_TABLE, items=[ ScalarItem( path=[PathNode(name='p1')], label='p1', last_occurrences={}, ), ], last_occurrences={cls.app_id: 3}, ), ], ) cls.new_schema = CaseExportDataSchema(group_schemas=[ ExportGroupSchema( path=MAIN_TABLE, items=[ ScalarItem( path=[PathNode(name='p1')], label='p1', last_occurrences={}, ), ScalarItem( path=[PathNode(name='name')], label='name', last_occurrences={cls.app_id: 3}, ), ], last_occurrences={cls.app_id: 3}, ), ], )
def test_simple(self): table_configuration = TableConfiguration( path=[], columns=[ ExportColumn( item=ScalarItem( path=[PathNode(name='form'), PathNode(name='q3')], ), selected=True, ), ExportColumn( item=ScalarItem( path=[PathNode(name='form'), PathNode(name='q1')], ), selected=True, ), ExportColumn( item=ScalarItem( path=[PathNode(name='form'), PathNode(name='q2')], ), selected=False, ), ]) submission = { 'domain': 'my-domain', '_id': '1234', "form": { "q1": "foo", "q2": "bar", "q3": "baz" } } self.assertEqual( [row.data for row in table_configuration.get_rows(submission, 0)], [['baz', 'foo']])
def test_simple_table(self, export_save): """ Confirm that some simple documents and a simple FormExportInstance are writtern with _write_export_file() correctly """ export_instance = FormExportInstance( export_format=Format.JSON, tables=[ TableConfiguration(label="My table", selected=True, columns=[ ExportColumn(label="Q3", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q3') ], ), selected=True), ExportColumn(label="Q1", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q1') ], ), selected=True), ]) ]) assert_instance_gives_results( self.docs, export_instance, { 'My table': { 'headers': ['Q3', 'Q1'], 'rows': [['baz', 'foo'], ['bop', 'bip']], } }) self.assertTrue(export_save.called)
def test_get_column(self): table_configuration = TableConfiguration( path=[ PathNode(name='form', is_repeat=False), PathNode(name="repeat1", is_repeat=True) ], columns=[ ExportColumn(item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='repeat1', is_repeat=True), PathNode(name='q1') ], )), ExportColumn(item=ScalarItem(path=[ PathNode(name="form"), PathNode(name="user_id"), ], transform=USERNAME_TRANSFORM)), ExportColumn(item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='repeat1', is_repeat=True), PathNode(name='q2') ], )), ]) index, column = table_configuration.get_column( [ PathNode(name='form'), PathNode(name='repeat1', is_repeat=True), PathNode(name='q1') ], 'ScalarItem', None, ) self.assertEqual(column.item.path, [ PathNode(name='form'), PathNode(name='repeat1', is_repeat=True), PathNode(name='q1') ]) self.assertEqual(index, 0) index, column = table_configuration.get_column( [ PathNode(name='form'), PathNode(name='repeat1', is_repeat=True), PathNode(name='DoesNotExist') ], 'ScalarItem', None, ) self.assertIsNone(column) # Verify that get_column ignores deid transforms index, column = table_configuration.get_column( [PathNode(name="form"), PathNode(name="user_id")], 'ScalarItem', USERNAME_TRANSFORM) self.assertIsNotNone(column) self.assertEqual(index, 1)
def test_different_doc_types_ordering(self): schema = self._create_schema([ GeopointItem(path=[PathNode(name='one')]), ScalarItem(path=[PathNode(name='two')]), ScalarItem(path=[PathNode(name='three')]), ScalarItem(path=[PathNode(name='one')]), ]) ordered_schema = self._create_schema([ ScalarItem(path=[PathNode(name='two')]), ScalarItem(path=[PathNode(name='one')]), ScalarItem(path=[PathNode(name='three')]), GeopointItem(path=[PathNode(name='one')]), ]) schema = CaseExportDataSchema._reorder_schema_from_schema( schema, ordered_schema, ) self._assert_item_order( schema, [], [ ScalarItem(path=[PathNode(name='two')]), ScalarItem(path=[PathNode(name='one')]), ScalarItem(path=[PathNode(name='three')]), GeopointItem(path=[PathNode(name='one')]), ], )
def test_multi_table(self): export_instance = FormExportInstance( export_format=Format.JSON, tables=[ TableConfiguration( label="My table", selected=True, path=[], columns=[ ExportColumn( label="Q3", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='q3')], ), selected=True, ), ] ), TableConfiguration( label="My other table", selected=True, path=[PathNode(name='form', is_repeat=False), PathNode(name="q2", is_repeat=False)], columns=[ ExportColumn( label="Q4", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='q2'), PathNode(name='q4')], ), selected=True, ), ] ) ] ) writer = _get_writer([export_instance]) with writer.open([export_instance]): _write_export_instance(writer, export_instance, self.docs) with ExportFile(writer.path, writer.format) as export: self.assertEqual( json.loads(export.read()), { u'My table': { u'headers': [u'Q3'], u'rows': [[u'baz'], [u'bop']], }, u'My other table': { u'headers': [u'Q4'], u'rows': [[u'bar'], [u'boop']], } } )
def test_multi_table(self, export_save): export_instance = FormExportInstance( export_format=Format.JSON, tables=[ TableConfiguration(label="My table", selected=True, path=[], columns=[ ExportColumn( label="Q3", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q3') ], ), selected=True, ), ]), TableConfiguration(label="My other table", selected=True, path=[ PathNode(name='form', is_repeat=False), PathNode(name="q2", is_repeat=False) ], columns=[ ExportColumn( label="Q4", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q2'), PathNode(name='q4') ], ), selected=True, ), ]) ]) assert_instance_gives_results( self.docs, export_instance, { 'My table': { 'headers': ['Q3'], 'rows': [['baz'], ['bop']], }, 'My other table': { 'headers': ['Q4'], 'rows': [['bar'], ['boop']], } }) self.assertTrue(export_save.called)
def test_repeat(self): table_configuration = TableConfiguration( path=[PathNode(name="form", is_repeat=False), PathNode(name="repeat1", is_repeat=True)], columns=[ ExportColumn( item=ScalarItem( path=[ PathNode(name="form"), PathNode(name="repeat1", is_repeat=True), PathNode(name="q1") ], ), selected=True, ), ] ) submission = { 'domain': 'my-domain', '_id': '1234', 'form': { 'repeat1': [ {'q1': 'foo'}, {'q1': 'bar'} ] } } self.assertEqual( [row.data for row in table_configuration.get_rows(submission, 0)], [ExportRow(['foo']).data, ExportRow(['bar']).data] )
def test_multi_table_order(self): tables = [ TableConfiguration(label="My table {}".format(i), selected=True, path=[], columns=[ ExportColumn( label="Q{}".format(i), item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q{}'.format(i)) ], ), selected=True, ), ]) for i in range(10) ] export_instance = FormExportInstance(export_format=Format.HTML, tables=tables) writer = _get_writer([export_instance]) docs = [{ 'domain': 'my-domain', '_id': '1234', "form": {'q{}'.format(i): 'value {}'.format(i) for i in range(10)} }] with writer.open([export_instance]): _write_export_instance(writer, export_instance, docs) with ExportFile(writer.path, writer.format) as export: exported_tables = [ table for table in re.findall('<h2>(.*)</h2>', export.read()) ] expected_tables = [t.label for t in tables] self.assertEqual(expected_tables, exported_tables)
def test_empty_group(self): table_configuration = TableConfiguration( path=[ PathNode(name="form", is_repeat=False), PathNode(name="group", is_repeat=False), PathNode(name="repeat1", is_repeat=True) ], columns=[ ExportColumn( item=ScalarItem( path=[ PathNode(name="form"), PathNode(name="group"), PathNode(name="repeat1", is_repeat=True), PathNode(name="q1") ], ), selected=True, ), ] ) submission = { 'domain': 'my-domain', '_id': '1234', 'form': { 'group': '' } } self.assertEqual( [row.data for row in table_configuration.get_rows(submission, 0)], [] )
def test_empty_table_label(self, export_save): export_instance = FormExportInstance( export_format=Format.JSON, domain=DOMAIN, case_type=DEFAULT_CASE_TYPE, split_multiselects=True, tables=[ TableConfiguration(label="", selected=True, path=[], columns=[ ExportColumn(label="Q1", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q1') ], ), selected=True), ]) ]) assert_instance_gives_results( self.docs, export_instance, {'Sheet1': { 'headers': ['Q1'], 'rows': [['foo'], ['bip']], }}) self.assertTrue(export_save.called)
def test_empty_table_label(self): export_instance = FormExportInstance( export_format=Format.JSON, domain=DOMAIN, case_type=DEFAULT_CASE_TYPE, split_multiselects=True, tables=[ TableConfiguration(label="", selected=True, path=[], columns=[ ExportColumn(label="Q1", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q1') ], ), selected=True), ]) ]) writer = _get_writer([export_instance]) with writer.open([export_instance]): _write_export_instance(writer, export_instance, self.docs) with ExportFile(writer.path, writer.format) as export: self.assertEqual(json.loads(export.read()), { u'Sheet1': { u'headers': [u'Q1'], u'rows': [[u'foo'], [u'bip']], } })
def test_simple_table(self): """ Confirm that some simple documents and a simple FormExportInstance are writtern with _write_export_file() correctly """ export_instance = FormExportInstance( export_format=Format.JSON, tables=[ TableConfiguration( label="My table", selected=True, columns=[ ExportColumn( label="Q3", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='q3')], ), selected=True ), ExportColumn( label="Q1", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='q1')], ), selected=True ), ] ) ] ) writer = _get_writer([export_instance]) with writer.open([export_instance]): _write_export_instance(writer, export_instance, self.docs) with ExportFile(writer.path, writer.format) as export: self.assertEqual( json.loads(export.read()), { u'My table': { u'headers': [u'Q3', u'Q1'], u'rows': [[u'baz', u'foo'], [u'bop', u'bip']], } } )
def test_double_repeat(self): table_configuration = TableConfiguration( path=[ PathNode(name="form", is_repeat=False), PathNode(name="repeat1", is_repeat=True), PathNode(name="group1", is_repeat=False), PathNode(name="repeat2", is_repeat=True), ], columns=[ RowNumberColumn( selected=True ), ExportColumn( item=ScalarItem( path=[ PathNode(name='form'), PathNode(name='repeat1', is_repeat=True), PathNode(name='group1'), PathNode(name='repeat2', is_repeat=True), PathNode(name='q1') ], ), selected=True, ), ] ) submission = { 'domain': 'my-domain', '_id': '1234', 'form': { 'repeat1': [ { 'group1': { 'repeat2': [ {'q1': 'foo'}, {'q1': 'bar'} ] } }, { 'group1': { 'repeat2': [ {'q1': 'beep'}, {'q1': 'boop'} ] } }, ] } } self.assertEqual( [row.data for row in table_configuration.get_rows(submission, 0)], [ ["0.0.0", 0, 0, 0, 'foo'], ["0.0.1", 0, 0, 1, 'bar'], ["0.1.0", 0, 1, 0, 'beep'], ["0.1.1", 0, 1, 1, 'boop'] ] )
def test_get_export_properties(self): export_instance = FormExportInstance(tables=[ TableConfiguration(label="My table", selected=True, path=[], columns=[ ExportColumn( label="Q3", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q3') ], ), selected=True, ), ExportColumn( label="dontshow", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='dontshow') ], ), selected=False, ), ]), TableConfiguration(label="My other table", selected=True, path=[ PathNode(name='form', is_repeat=False), PathNode(name="q2", is_repeat=False) ], columns=[ ExportColumn( label="Q4", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q2'), PathNode(name='q4') ], ), selected=True, ), ]) ]) with mock.patch('corehq.apps.export.models.new.FormExportInstance.get', return_value=export_instance): props = _get_export_properties("fake id for my export instance", False) self.assertEqual(props, set(['q2-q4', 'q3']))
def test_paginated_table(self): export_instance = FormExportInstance( export_format=Format.JSON, tables=[ TableConfiguration( label="My table", selected=True, columns=[ ExportColumn( label="Q3", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='q3')], ), selected=True ), ExportColumn( label="Q1", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='q1')], ), selected=True ), ] ) ] ) writer = get_export_writer([export_instance]) with writer.open([export_instance]): write_export_instance(writer, export_instance, self.docs + self.docs) with ExportFile(writer.path, writer.format) as export: self.assertEqual( json.loads(export.read()), { 'My table_000': { 'headers': ['Q3', 'Q1'], 'rows': [['baz', 'foo'], ['bop', 'bip']], }, 'My table_001': { 'headers': ['Q3', 'Q1'], 'rows': [['baz', 'foo'], ['bop', 'bip']], } } )
def test_get_export_properties(self): export_instance = FormExportInstance(tables=[ TableConfiguration(label="My table", selected=True, path=[], columns=[ ExportColumn( label="Q3", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q3') ], ), selected=True, ), ExportColumn( label="dontshow", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='dontshow') ], ), selected=False, ), ]), TableConfiguration(label="My other table", selected=True, path=[ PathNode(name='form', is_repeat=False), PathNode(name="q2", is_repeat=False) ], columns=[ ExportColumn( label="Q4", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q2'), PathNode(name='q4') ], ), selected=True, ), ]) ]) props = _get_export_properties(export_instance) self.assertEqual(props, set(['q2-q4', 'q3']))
def test_case_name_transform(self): docs = [ { 'domain': 'my-domain', '_id': '1234', "form": { "caseid": "robin", }, }, { 'domain': 'my-domain', '_id': '1234', "form": { "caseid": "i-do-not-exist", }, } ] export_instance = FormExportInstance( export_format=Format.JSON, tables=[ TableConfiguration( label="My table", selected=True, columns=[ ExportColumn( label="case_name", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='caseid')], transform=CASE_NAME_TRANSFORM, ), selected=True ), ] ) ] ) writer = _get_writer([export_instance]) with writer.open([export_instance]): _write_export_instance(writer, export_instance, docs) with ExportFile(writer.path, writer.format) as export: self.assertEqual( json.loads(export.read()), { u'My table': { u'headers': [u'case_name'], u'rows': [[u'batman'], [MISSING_VALUE]], } } )
def test_table_containing_duplicate_paths_with_differing_doc_types_can_find_either(self): path = [PathNode(name='closed')] prop1 = ScalarItem(path=path) prop2 = ExportItem(path=path) table_config = TableConfiguration( columns=[ ExportColumn(item=prop1), ExportColumn(item=prop2) ] ) scalarIndex, _ = table_config.get_column(path, 'ScalarItem', None) exportIndex, _ = table_config.get_column(path, 'ExportItem', None) self.assertEqual(scalarIndex, 0) self.assertEqual(exportIndex, 1)
def test_empty_location(self): export_instance = FormExportInstance( export_format=Format.JSON, tables=[ TableConfiguration( label="My table", selected=True, columns=[ ExportColumn( label="location", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='meta'), PathNode(name='location')], ), selected=True ), ] ) ] ) docs = [ { 'domain': 'my-domain', '_id': '1234', 'form': { 'meta': { 'location': {'xmlns': 'abc'}, } } } ] writer = get_export_writer([export_instance]) with writer.open([export_instance]): write_export_instance(writer, export_instance, docs) with ExportFile(writer.path, writer.format) as export: self.assertEqual( json.loads(export.read()), { 'My table': { 'headers': ['location'], 'rows': [[EMPTY_VALUE]], } } )
def test_array_data_in_scalar_question(self): ''' This test ensures that when a question id has array data that we return still return a string for scalar data. This happens rarely ''' doc = { 'domain': 'my-domain', '_id': '12345', "form": { "array": ["one", "two"], } } export_instance = FormExportInstance( export_format=Format.JSON, domain=DOMAIN, xmlns='xmlns', tables=[TableConfiguration( label="My table", selected=True, path=[], columns=[ ExportColumn( label="Scalar Array", item=ScalarItem(path=[PathNode(name='form'), PathNode(name='array')]), selected=True, ) ] )] ) writer = get_export_writer([export_instance]) with writer.open([export_instance]): write_export_instance(writer, export_instance, [doc]) with ExportFile(writer.path, writer.format) as export: self.assertEqual( json.loads(export.read()), { 'My table': { 'headers': ['Scalar Array'], 'rows': [['one two']], } } )
def test_case_name_transform(self): docs = [ { 'domain': 'my-domain', '_id': '1234', "form": { "caseid": "robin", }, }, { 'domain': 'my-domain', '_id': '1234', "form": { "caseid": "i-do-not-exist", }, } ] export_instance = FormExportInstance( export_format=Format.JSON, tables=[ TableConfiguration( label="My table", selected=True, columns=[ ExportColumn( label="case_name", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='caseid')], transform=CASE_NAME_TRANSFORM, ), selected=True ), ] ) ] ) assert_instance_gives_results(docs, export_instance, { 'My table': { 'headers': ['case_name'], 'rows': [['batman'], [MISSING_VALUE]], } })
def test_array_data_in_scalar_question(self, export_save): ''' This test ensures that when a question id has array data that we return still return a string for scalar data. This happens rarely ''' doc = { 'domain': 'my-domain', '_id': '12345', "form": { "array": ["one", "two"], } } export_instance = FormExportInstance( export_format=Format.JSON, domain=DOMAIN, xmlns='xmlns', tables=[ TableConfiguration(label="My table", selected=True, path=[], columns=[ ExportColumn( label="Scalar Array", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='array') ]), selected=True, ) ]) ]) assert_instance_gives_results([doc], export_instance, { 'My table': { 'headers': ['Scalar Array'], 'rows': [['one two']], } }) self.assertTrue(export_save.called)
def test_empty_location(self): export_instance = FormExportInstance( export_format=Format.JSON, tables=[ TableConfiguration( label="My table", selected=True, columns=[ ExportColumn( label="location", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='meta'), PathNode(name='location')], ), selected=True ), ] ) ] ) docs = [ { 'domain': 'my-domain', '_id': '1234', 'form': { 'meta': { 'location': {'xmlns': 'abc'}, } } } ] assert_instance_gives_results(docs, export_instance, { 'My table': { 'headers': ['location'], 'rows': [[EMPTY_VALUE]], } })
def test_basic_ordering(self): schema = self._create_schema([ ScalarItem(path=[PathNode(name='three')]), ScalarItem(path=[PathNode(name='one')]), ScalarItem(path=[PathNode(name='two')]), ScalarItem(path=[PathNode(name='four')]), ]) ordered_schema = self._create_schema([ ScalarItem(path=[PathNode(name='one')]), ScalarItem(path=[PathNode(name='two')]), ScalarItem(path=[PathNode(name='three')]), ScalarItem(path=[PathNode(name='four')]), ]) schema = CaseExportDataSchema._reorder_schema_from_schema( schema, ordered_schema, ) self._assert_item_order( schema, [], [ ScalarItem(path=[PathNode(name='one')]), ScalarItem(path=[PathNode(name='two')]), ScalarItem(path=[PathNode(name='three')]), ScalarItem(path=[PathNode(name='four')]), ], )
def test_multiple_write_export_instance_calls(self, export_save): """ Confirm that calling _write_export_instance() multiple times (as part of a bulk export) works as expected. """ export_instances = [ FormExportInstance(tables=[ TableConfiguration(label="My table", selected=True, path=[], columns=[ ExportColumn( label="Q3", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q3') ], ), selected=True, ), ]), ]), FormExportInstance(tables=[ TableConfiguration(label="My other table", selected=True, path=[ PathNode(name="form", is_repeat=False), PathNode(name="q2", is_repeat=False) ], columns=[ ExportColumn( label="Q4", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q2'), PathNode(name='q4') ], ), selected=True, ), ]) ]), FormExportInstance(tables=[ TableConfiguration(label="My other table", selected=True, path=[ PathNode(name="form", is_repeat=False), PathNode(name="q2", is_repeat=False) ], columns=[ ExportColumn( label="Q4", item=ScalarItem(path=[ PathNode(name='form'), PathNode(name='q2'), PathNode(name='q4') ], ), selected=True, ), ]) ]) ] with TransientTempfile() as temp_path: writer = _ExportWriter(get_writer(Format.JSON), temp_path) with writer.open(export_instances): write_export_instance(writer, export_instances[0], self.docs) write_export_instance(writer, export_instances[1], self.docs) write_export_instance(writer, export_instances[2], self.docs) with ExportFile(writer.path, writer.format) as export: self.assertEqual( json.loads(export.read()), { 'My table': { 'headers': ['Q3'], 'rows': [['baz'], ['bop']], }, 'Export2-My other table': { 'headers': ['Q4'], 'rows': [['bar'], ['boop']], }, 'Export3-My other table': { 'headers': ['Q4'], 'rows': [['bar'], ['boop']], }, }) self.assertTrue(export_save.called)
RowNumberColumn( tags=[PROPERTY_TAG_ROW], label='number', item=ExportItem(path=[PathNode(name='number')]), selected=True ), ExportColumn( tags=[PROPERTY_TAG_INFO], label='caseid', item=ExportItem(path=[PathNode(name='_id')]), help_text=_("The ID of the case"), selected=True ), ExportColumn( label='name', item=ScalarItem(path=[PathNode(name='name')]), help_text=_("The name of the case"), selected=True ), ] BOTTOM_MAIN_CASE_TABLE_PROPERTIES = [ # This second list is displayed below the case properties ExportColumn( tags=[PROPERTY_TAG_INFO], label='case_type', item=ExportItem(path=[PathNode(name='type')]), help_text=_("The type of the case"), is_advanced=True, ), ExportColumn(
def test_multiple_write_export_instance_calls(self): """ Confirm that calling _write_export_instance() multiple times (as part of a bulk export) works as expected. """ export_instances = [ FormExportInstance( # export_format=Format.JSON, tables=[ TableConfiguration( label="My table", selected=True, path=[], columns=[ ExportColumn( label="Q3", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='q3')], ), selected=True, ), ] ), ] ), FormExportInstance( # export_format=Format.JSON, tables=[ TableConfiguration( label="My other table", selected=True, path=[PathNode(name="form", is_repeat=False), PathNode(name="q2", is_repeat=False)], columns=[ ExportColumn( label="Q4", item=ScalarItem( path=[PathNode(name='form'), PathNode(name='q2'), PathNode(name='q4')], ), selected=True, ), ] ) ] ) ] writer = _Writer(get_writer(Format.JSON)) with writer.open(export_instances): _write_export_instance(writer, export_instances[0], self.docs) _write_export_instance(writer, export_instances[1], self.docs) with ExportFile(writer.path, writer.format) as export: self.assertEqual( json.loads(export.read()), { u'Export1-My table': { u'headers': [u'Q3'], u'rows': [[u'baz'], [u'bop']], }, u'Export2-My other table': { u'headers': [u'Q4'], u'rows': [[u'bar'], [u'boop']], } } )