def test_messages_to_str_by_id(self): """messages_to_str_by_id should create one message for added records, one message for removed records, and one message for each other record.""" # an empty messages list should produce no errors and return a string with # no messages output_str = utils.MessagesOutput.messages_to_str_by_id([], is_html=True) self.assertEqual(output_str.count('"message"'), 0) # there should be an added section, a deleted section, and one section for # each of the records that had fields added, removed, or changed messages = pfif_diff.pfif_file_diff( StringIO(PfifXml.XML_ADDED_DELETED_CHANGED_1), StringIO(PfifXml.XML_ADDED_DELETED_CHANGED_2)) output_str = utils.MessagesOutput.messages_to_str_by_id(messages, is_html=True) self.assertEqual(output_str.count('grouped_record_header'), 3) self.assertEqual(output_str.count('"message"'), 3) self.assertTrue('foo' in output_str) self.assertTrue('bar' in output_str) self.assertTrue('source_date' in output_str) # when a field is added but no field is changed or deleted, there should # only be one section with one list. messages = pfif_diff.pfif_file_diff( StringIO(PfifXml.XML_ONE_PERSON_ONE_FIELD), StringIO(PfifXml.XML_ONE_PERSON_TWO_FIELDS)) output_str = utils.MessagesOutput.messages_to_str_by_id(messages, is_html=True) self.assertEqual(output_str.count('grouped_record_header'), 1) self.assertEqual(output_str.count('"message"'), 1) self.assertEqual(output_str.count('grouped_record_list'), 1)
def test_messages_to_str_by_id(self): """messages_to_str_by_id should create one message for added records, one message for removed records, and one message for each other record.""" # an empty messages list should produce no errors and return a string with # no messages output_str = utils.MessagesOutput.messages_to_str_by_id([]) self.assertEqual(output_str, '') # there should be an added section, a deleted section, and one section for # each of the records that had fields added, removed, or changed messages = pfif_diff.pfif_file_diff( StringIO(PfifXml.XML_ADDED_DELETED_CHANGED_1), StringIO(PfifXml.XML_ADDED_DELETED_CHANGED_2)) output_str = utils.MessagesOutput.messages_to_str_by_id(messages) self.assertEqual(output_str.count('1 messages'), 2) self.assertEqual(output_str.count('3 messages'), 1) self.assertTrue('foo' in output_str) self.assertTrue('bar' in output_str) self.assertTrue('source_date' in output_str) # when a field is added but no field is changed or deleted, there should # only be one section with one list. messages = pfif_diff.pfif_file_diff( StringIO(PfifXml.XML_ONE_PERSON_ONE_FIELD), StringIO(PfifXml.XML_ONE_PERSON_TWO_FIELDS)) output_str = utils.MessagesOutput.messages_to_str_by_id(messages) self.assertEqual(output_str.count('1 messages'), 1) self.assertEqual(output_str.count('extra fields'), 1)
def run_diff(xml_str_1, xml_str_2, text_is_case_sensitive=None): """Runs pfif_file_diff on the two xml strings. Returns the message list of differences.""" xml_file_1 = StringIO(xml_str_1) xml_file_2 = StringIO(xml_str_2) if text_is_case_sensitive is not None: return pfif_diff.pfif_file_diff(xml_file_1, xml_file_2, text_is_case_sensitive) else: return pfif_diff.pfif_file_diff(xml_file_1, xml_file_2)
def post(self, request, *args, **kwargs): page_ctx = {'page_title': 'PFIF Diff: Results'} file_1, filename_1 = self.get_file(1, return_filename=True) file_2, filename_2 = self.get_file(2, return_filename=True) if file_1 is None or file_2 is None: page_ctx['error'] = 'Missing Input File' return render(request, 'error.html', page_ctx) page_ctx['filenames'] = [ {'filename': filename_1, 'shorthand_name': 'A'}, {'filename': filename_2, 'shorthand_name': 'B'}, ] options = self.request.POST.getlist('options') ignore_fields = self.request.POST.get( 'ignore_fields', default='').split() messages = pfif_diff.pfif_file_diff( file_1, file_2, text_is_case_sensitive='text_is_case_sensitive' in options, ignore_fields=ignore_fields, omit_blank_fields='omit_blank_fields' in options) page_ctx['msgs'] = messages page_ctx['msgs_by_category'] = ( utils.MessagesOutput.group_messages_by_category(messages)) if 'group_messages_by_record' in options: page_ctx['group_messages'] = True messages = utils.MessagesOutput.truncate( messages, utils.MessagesOutput.GROUPED_TRUNCATE_THRESHOLD) page_ctx['msg_grouping'] = utils.MessageGroupingById(messages) return render(request, 'diff_results.html', page_ctx)
def post(self, request, *args, **kwargs): page_ctx = {'page_title': 'PFIF Diff: Results'} file_1, filename_1 = self.get_file(1, return_filename=True) file_2, filename_2 = self.get_file(2, return_filename=True) if file_1 is None or file_2 is None: page_ctx['error'] = 'Missing Input File' return render(request, 'error.html', page_ctx) page_ctx['filenames'] = [ { 'filename': filename_1, 'shorthand_name': 'A' }, { 'filename': filename_2, 'shorthand_name': 'B' }, ] options = self.request.POST.getlist('options') ignore_fields = self.request.POST.get('ignore_fields', default='').split() messages = pfif_diff.pfif_file_diff( file_1, file_2, text_is_case_sensitive='text_is_case_sensitive' in options, ignore_fields=ignore_fields, omit_blank_fields='omit_blank_fields' in options) page_ctx['msgs'] = messages page_ctx['msgs_by_category'] = ( utils.MessagesOutput.group_messages_by_category(messages)) if 'group_messages_by_record' in options: page_ctx['group_messages'] = True messages = utils.MessagesOutput.truncate( messages, utils.MessagesOutput.GROUPED_TRUNCATE_THRESHOLD) page_ctx['msg_grouping'] = utils.MessageGroupingById(messages) return render(request, 'diff_results.html', page_ctx)
def post(self): file_1, filename_1 = self.get_file(1, return_filename=True) file_2, filename_2 = self.get_file(2, return_filename=True) self.write_header('PFIF Diff: Results') if file_1 is None or file_2 is None: self.write_missing_input_file() else: options = self.request.get_all('options') ignore_fields = self.request.get('ignore_fields').split() messages = pfif_diff.pfif_file_diff( file_1, file_2, text_is_case_sensitive='text_is_case_sensitive' in options, ignore_fields=ignore_fields, omit_blank_fields='omit_blank_fields' in options) self.response.out.write('<h1>Diff: ' + str(len(messages)) + ' Messages</h1>') self.response.out.write( utils.MessagesOutput.generate_message_summary(messages, is_html=True)) self.write_filenames(filename_1, filename_2) if 'group_messages_by_record' in options: self.response.out.write( utils.MessagesOutput.messages_to_str_by_id(messages, is_html=True)) else: self.response.out.write( utils.MessagesOutput.messages_to_str(messages, show_error_type=False, is_html=True)) self.write_footer()
def test_group_messages_by_record(self): """group_messages_by_record should return a map from record_id to message.""" messages = pfif_diff.pfif_file_diff( StringIO(PfifXml.XML_ADDED_DELETED_CHANGED_1), StringIO(PfifXml.XML_ADDED_DELETED_CHANGED_2)) grouped_messages = utils.MessagesOutput.group_messages_by_record(messages) self.assertTrue('example.org/person1' in grouped_messages) self.assertTrue('example.org/person2' in grouped_messages)
def test_group_messages_by_record(self): """group_messages_by_record should return a map from record_id to message.""" messages = pfif_diff.pfif_file_diff( StringIO(PfifXml.XML_ADDED_DELETED_CHANGED_1), StringIO(PfifXml.XML_ADDED_DELETED_CHANGED_2)) grouped_messages = utils.MessagesOutput.group_messages_by_record( messages) self.assertTrue('example.org/person1' in grouped_messages) self.assertTrue('example.org/person2' in grouped_messages)
def test_group_messages_by_category(self): """group_messages_by_category should return a map from category to message.""" messages = pfif_diff.pfif_file_diff( StringIO(PfifXml.XML_ADDED_DELETED_CHANGED_1), StringIO(PfifXml.XML_ADDED_DELETED_CHANGED_2)) grouped_messages = utils.MessagesOutput.group_messages_by_category(messages) self.assertTrue(utils.Categories.ADDED_RECORD in grouped_messages) self.assertTrue(utils.Categories.ADDED_FIELD in grouped_messages) self.assertTrue(utils.Categories.DELETED_RECORD in grouped_messages) self.assertTrue(utils.Categories.DELETED_FIELD in grouped_messages) self.assertTrue(utils.Categories.CHANGED_FIELD in grouped_messages)
def test_group_messages_by_category(self): """group_messages_by_category should return a map from category to message.""" messages = pfif_diff.pfif_file_diff( StringIO(PfifXml.XML_ADDED_DELETED_CHANGED_1), StringIO(PfifXml.XML_ADDED_DELETED_CHANGED_2)) grouped_messages = utils.MessagesOutput.group_messages_by_category( messages) self.assertTrue(utils.Categories.ADDED_RECORD in grouped_messages) self.assertTrue(utils.Categories.ADDED_FIELD in grouped_messages) self.assertTrue(utils.Categories.DELETED_RECORD in grouped_messages) self.assertTrue(utils.Categories.DELETED_FIELD in grouped_messages) self.assertTrue(utils.Categories.CHANGED_FIELD in grouped_messages)
def test_get_field_from_messages(self): """get_field_from_messages should return a list of all fields in the messages.""" messages = pfif_diff.pfif_file_diff( StringIO(PfifXml.XML_ADDED_DELETED_CHANGED_1), StringIO(PfifXml.XML_ADDED_DELETED_CHANGED_2)) # record_id should get person and note records record_ids = utils.MessagesOutput.get_field_from_messages(messages, 'record_id') self.assertTrue('example.org/person1' in record_ids) self.assertTrue('example.org/person2' in record_ids) # xml_tag should get all tags tags = utils.MessagesOutput.get_field_from_messages(messages, 'xml_tag') self.assertTrue('foo' in tags) self.assertTrue('bar' in tags) self.assertTrue('source_date' in tags)
def test_get_field_from_messages(self): """get_field_from_messages should return a list of all fields in the messages.""" messages = pfif_diff.pfif_file_diff( StringIO(PfifXml.XML_ADDED_DELETED_CHANGED_1), StringIO(PfifXml.XML_ADDED_DELETED_CHANGED_2)) # record_id should get person and note records record_ids = utils.MessagesOutput.get_field_from_messages( messages, 'record_id') self.assertTrue('example.org/person1' in record_ids) self.assertTrue('example.org/person2' in record_ids) # xml_tag should get all tags tags = utils.MessagesOutput.get_field_from_messages( messages, 'xml_tag') self.assertTrue('foo' in tags) self.assertTrue('bar' in tags) self.assertTrue('source_date' in tags)