def test_str_truncation(self): # Assert optional truncation behavior. err = ValidationError([ MinimalDifference('A'), MinimalDifference('B'), MinimalDifference('C'), ], 'invalid data') self.assertIsNone(err._should_truncate) self.assertIsNone(err._truncation_notice) no_truncation = """ invalid data (3 differences): [ MinimalDifference('A'), MinimalDifference('B'), MinimalDifference('C'), ] """ no_truncation = textwrap.dedent(no_truncation).strip() self.assertEqual(str(err), no_truncation) # Truncate without notice. err._should_truncate = lambda line_count, char_count: char_count > 35 err._truncation_notice = None truncation_witout_notice = """ invalid data (3 differences): [ MinimalDifference('A'), ... """ truncation_witout_notice = textwrap.dedent( truncation_witout_notice).strip() self.assertEqual(str(err), truncation_witout_notice) # Truncate and use truncation notice. err._should_truncate = lambda line_count, char_count: char_count > 35 err._truncation_notice = 'Message truncated.' truncation_plus_notice = """ invalid data (3 differences): [ MinimalDifference('A'), ... Message truncated. """ truncation_plus_notice = textwrap.dedent( truncation_plus_notice).strip() self.assertEqual(str(err), truncation_plus_notice)
def test_str_sorting(self): """Check that string shows differences sorted by arguments.""" self.maxDiff = None # Check sorting of non-mapping container. err = ValidationError([ MinimalDifference('Z', 'Z'), MinimalDifference('Z'), MinimalDifference(1, 'C'), MinimalDifference('B', 'C'), MinimalDifference('A'), MinimalDifference(1.5), MinimalDifference(True), MinimalDifference(0), MinimalDifference(None) ]) expected = """ 9 differences: [ MinimalDifference(None), MinimalDifference(0), MinimalDifference(True), MinimalDifference(1, 'C'), MinimalDifference(1.5), MinimalDifference('A'), MinimalDifference('B', 'C'), MinimalDifference('Z'), MinimalDifference('Z', 'Z'), ] """ expected = textwrap.dedent(expected).strip() self.assertEqual(str(err), expected) # Make sure that all differences are being sorted (not just # those being displayed). err._should_truncate = lambda lines, chars: lines > 4 expected = """ 9 differences: [ MinimalDifference(None), MinimalDifference(0), MinimalDifference(True), MinimalDifference(1, 'C'), ... """ expected = textwrap.dedent(expected).strip() self.assertEqual(str(err), expected) # Check sorting of non-mapping container. err = ValidationError( { ('C', 3): [MinimalDifference('Z', 3), MinimalDifference(1, 2)], ('A', 'C'): MinimalDifference('A'), 'A': [MinimalDifference('C'), MinimalDifference(1)], 2: [MinimalDifference('B'), MinimalDifference('A')], 1: MinimalDifference('A'), (None, 4): MinimalDifference('A'), }, 'description string') expected = """ description string (6 differences): { 1: MinimalDifference('A'), 2: [MinimalDifference('A'), MinimalDifference('B')], 'A': [MinimalDifference(1), MinimalDifference('C')], (None, 4): MinimalDifference('A'), ('A', 'C'): MinimalDifference('A'), ('C', 3): [MinimalDifference(1, 2), MinimalDifference('Z', 3)], } """ expected = textwrap.dedent(expected).strip() self.assertEqual(str(err), expected)