예제 #1
0
    def test_allow_one_but_find_duplicate(self):
        with self.assertRaises(DataError) as cm:
            with allow_only(Extra('xxx')):
                raise DataError('example error', [Extra('xxx'), Extra('xxx')])

        result_string = str(cm.exception)
        self.assertEqual("example error:\n xExtra('xxx')", result_string)
예제 #2
0
    def test_allow_duplicate_but_find_only_one(self):
        with self.assertRaises(DataError) as cm:
            with allow_only([Extra('xxx'), Extra('xxx')]):
                raise DataError('example error', [Extra('xxx')])

        result_string = str(cm.exception)
        self.assertEqual("Allowed difference not found:\n Extra('xxx')", result_string)
예제 #3
0
    def test_allow_all(self):
        differences = [Missing('xxx'), Extra('yyy')]
        with allow_only(differences):
            raise DataError('example error', [Missing('xxx'), Extra('yyy')])

        # Order of differences should not matter!
        differences = [Extra('yyy'), Missing('xxx')]
        with allow_only(differences):
            raise DataError('example error', reversed(differences))
예제 #4
0
    def test_allow_some(self):
        differences = [Extra('xxx'), Missing('yyy')]

        with self.assertRaises(DataError) as cm:
            with allow_missing():
                raise DataError('example error', differences)

        rejected = list(cm.exception.differences)
        self.assertEqual(rejected, [Extra('xxx')])
예제 #5
0
    def test_allow_some(self):
        with self.assertRaises(DataError) as cm:
            with allow_only(Extra('xxx'), 'example allowance'):
                raise DataError('example error', [Extra('xxx'), Missing('yyy')])

        result_str = str(cm.exception)
        self.assertEqual("example allowance: example error:\n Missing('yyy')", result_str)

        result_diffs = list(cm.exception.differences)
        self.assertEqual([Missing('yyy')], result_diffs)
예제 #6
0
    def test_not_found(self):
        with self.assertRaises(DataError) as cm:
            with allow_only([Extra('xxx'), Missing('yyy')]):
                raise DataError('example error', [Extra('xxx')])

        result_str = str(cm.exception)
        self.assertTrue(result_str.startswith('Allowed difference not found'))

        result_diffs = list(cm.exception.differences)
        self.assertEqual([Missing('yyy')], result_diffs)
예제 #7
0
    def test_mapping_some_allowed(self):
        differences = {'foo': Extra('xxx'), 'bar': Missing('yyy')}
        allowed = {'foo': Extra('xxx')}

        with self.assertRaises(DataError) as cm:
            with allow_only(allowed):
                raise DataError('example error', differences)

        expected = {'bar': Missing('yyy')}
        actual = cm.exception.differences
        self.assertEqual(expected, actual)
예제 #8
0
    def test_single_diff_without_container(self):
        differences = [Extra('xxx'), Missing('yyy')]
        allowed = Extra('xxx')  # <- Single diff, not in list.

        with self.assertRaises(DataError) as cm:
            with allow_only(allowed):
                raise DataError('example error', differences)

        expected = [Missing('yyy')]
        actual = list(cm.exception.differences)
        self.assertEqual(expected, actual)
예제 #9
0
    def test_kwds_under_limit(self):
        differences = [Extra('xxx'), Missing('yyy'), Extra('zzz')]

        with self.assertRaises(DataError) as cm:
            is_extra = lambda x: isinstance(x, Extra)
            with allow_limit(4,
                             diffs=is_extra):  # <- Limit of 4 and is_extra().
                raise DataError('example error', differences)

        rejected = list(cm.exception.differences)
        self.assertEqual([Missing('yyy')], rejected)
예제 #10
0
    def test_some_allowed(self):
        differences = [Extra('xxx'), Missing('yyy')]
        allowed = [Extra('xxx')]

        with self.assertRaises(DataError) as cm:
            with allow_only(allowed):
                raise DataError('example error', differences)

        expected = [Missing('yyy')]
        actual = list(cm.exception.differences)
        self.assertEqual(expected, actual)
예제 #11
0
    def test_function_all_bad(self):
        function = lambda iterable: iterable  # <- Rejects everything.
        in_diffs = [
            Extra('foo'),
            Extra('bar'),
        ]
        with self.assertRaises(DataError) as cm:
            with allow_iter(function, 'example message'):
                raise DataError('example error', in_diffs)

        rejected = cm.exception.differences
        self.assertEqual(rejected, in_diffs)
예제 #12
0
    def test_kwds(self):
        in_diffs = [
            Extra('xxx', aaa='foo'),
            Extra('yyy', aaa='bar'),
            Missing('zzz', aaa='foo'),
        ]
        with self.assertRaises(DataError) as cm:
            with allow_any('example message', aaa='foo'):
                raise DataError('example error', in_diffs)

        rejected = list(cm.exception.differences)
        self.assertEqual(rejected, [Extra('yyy', aaa='bar')])
예제 #13
0
    def test_no_kwds(self):
        in_diffs = [
            Extra('xxx', aaa='foo'),
            Extra('yyy', aaa='bar'),
        ]
        with self.assertRaises(TypeError) as cm:
            with allow_any('example message'):  # <- Missing keyword argument!
                raise DataError('example error', in_diffs)

        result = cm.exception
        expected = 'requires 1 or more keyword arguments (0 given)'
        self.assertEqual(expected, str(result))
예제 #14
0
    def test_iterable_all_bad(self):
        """Given a non-mapping iterable in which all items are invalid,
        *function* should return a non-mapping iterable containing all
        items.
        """
        function = lambda iterable: iterable  # <- Rejects everything.
        in_diffs = [Extra('foo'), Extra('bar')]

        with self.assertRaises(DataError) as cm:
            with allow_iter(function):
                raise DataError('example error', in_diffs)

        out_diffs = cm.exception.differences
        self.assertEqual(out_diffs, in_diffs)
예제 #15
0
    def test_mapping(self):
        required = {'AAA': 'a', 'BBB': 'b', 'CCC': 'c'}

        data = {'AAA': 'a', 'BBB': 'b', 'CCC': 'c'}
        result = _compare_mapping(data, required)
        self.assertEqual(result, {})

        data = {'AAA': 'a', 'BBB': 'b', 'CCC': 'c', 'DDD': '3'}
        result = _compare_mapping(data, required)
        self.assertEqual(result, {'DDD': Extra('3')})

        data = {'AAA': 'a', 'CCC': 'c', 'DDD': '3'}
        result = _compare_mapping(data, required)
        self.assertEqual(result, {'BBB': Missing('b'), 'DDD': Extra('3')})
예제 #16
0
    def test_iterable(self):
        required = set(['a', 'b', 'c'])

        data = iter(['a', 'b', 'c'])
        result = _compare_set(data, required)
        self.assertEqual(result, [])

        data = iter(['a', 'b', 'c', '3'])
        result = _compare_set(data, required)
        self.assertEqual(result, [Extra('3')])

        data = iter(['a', 'c', '3'])
        result = _compare_set(data, required)
        result = set(result)
        self.assertEqual(result, set([Missing('b'), Extra('3')]))
예제 #17
0
    def test_mapping(self):
        required = set(['a', 'b', 'c'])

        data = {'AAA': 'a', 'BBB': 'b', 'CCC': 'c'}
        result = _compare_set(data, required)
        self.assertEqual(result, [])

        data = {'AAA': 'a', 'BBB': 'b', 'CCC': 'c', 'DDD': '3'}
        result = _compare_set(data, required)
        self.assertEqual(result, [Extra('3')])

        data = {'AAA': 'a', 'CCC': 'c', 'DDD': '3'}
        result = _compare_set(data, required)
        result = set(result)
        self.assertEqual(result, set([Missing('b'), Extra('3')]))
예제 #18
0
    def test_compareset_v_set_fail(self):
        with self.assertRaises(DataError) as cm:
            first = CompareSet([1, 2, 3, 4, 5, 6, 7])
            second = set([1, 2, 3, 4, 5, 6])
            self.assertEqual(first, second)

        differences = cm.exception.differences
        super(DataTestCase, self).assertEqual(differences, [Extra(7)])
예제 #19
0
    def test_required_set(self):
        """When *required* is a set, _compare_set() should be called."""
        with self.assertRaises(DataError) as cm:
            required = set([1, 2, 4])
            data = set([1, 2, 3])
            self.assertValid(data, required)

        differences = cm.exception.differences
        self.assertEqual(set(differences), set([Extra(3), Missing(4)]))
예제 #20
0
    def test_sequence(self):
        required = ['a', 'b', 'c']

        data = ['a', 'b', 'c']
        result = _compare_sequence(data, required)
        self.assertEqual(result, {})

        data = ['a', 'b', 'c', 'd']
        result = _compare_sequence(data, required)
        self.assertEqual(result, {3: Extra('d')})

        data = ['a', 'b']
        result = _compare_sequence(data, required)
        self.assertEqual(result, {2: Missing('c')})

        data = ['a', 'x', 'c', 'y']
        result = _compare_sequence(data, required)
        self.assertEqual(result, {1: Invalid('x', 'b'), 3: Extra('y')})
예제 #21
0
    def test_allow_some(self):
        differences = [Extra('xxx'), Missing('yyy')]

        with self.assertRaises(DataError) as cm:
            with allow_limit(1):  # <- Allows only 1 but there are 2!
                raise DataError('example error', differences)

        rejected = list(cm.exception.differences)
        self.assertEqual(differences, rejected)
예제 #22
0
    def test_dict_of_diffs_exceeds(self):
        differences = {'foo': Extra('xxx'), 'bar': Missing('yyy')}

        with self.assertRaises(DataError) as cm:
            with allow_limit(1):  # <- Allows only 1 but there are 2!
                raise DataError('example error', differences)

        rejected = cm.exception.differences
        self.assertEqual(differences, rejected)
예제 #23
0
    def test_keys_keyword(self):
        in_diffs = {
            'foo': Extra('xxx'),
            'bar': Extra('yyy'),
            'baz': Missing('zzz'),
        }
        with self.assertRaises(DataError) as cm:

            def additional_helper(x):
                return x in ('foo', 'baz')

            with allow_extra(keys=additional_helper):
                raise DataError('example error', in_diffs)

        rejected = cm.exception.differences
        self.assertEqual(rejected, {
            'bar': Extra('yyy'),
            'baz': Missing('zzz')
        })
예제 #24
0
    def test_dict_of_diffs_kwds_func_under_limit(self):
        differences = {'foo': Extra('xxx'), 'bar': Missing('yyy')}

        with self.assertRaises(DataError) as cm:
            is_extra = lambda x: isinstance(x, Extra)
            with allow_limit(2, diffs=is_extra):
                raise DataError('example error', differences)

        rejected = cm.exception.differences
        self.assertEqual({'bar': Missing('yyy')}, rejected)
예제 #25
0
    def test_required_mapping(self):
        """When *required* is a mapping, _compare_mapping() should be
        called."""
        with self.assertRaises(DataError) as cm:
            required = {'AAA': 'a', 'BBB': 'b', 'CCC': 'c'}
            data = {'AAA': 'a', 'BBB': 'b', 'DDD': 'd'}
            self.assertValid(data, required)

        differences = cm.exception.differences
        self.assertEqual(differences, {'CCC': Missing('c'), 'DDD': Extra('d')})
예제 #26
0
    def test_mapping_mismatched_types(self):
        # Dict of diffs vs list of allowed.
        differences = {'foo': Extra('xxx'), 'bar': Missing('yyy')}
        allowed = [Extra('xxx'), Missing('yyy')]

        regex = ("expects non-mapping differences but found 'dict' of "
                 "differences")
        with self.assertRaisesRegex(ValueError, regex):
            with allow_only(allowed):
                raise DataError('example error', differences)

        # List of diffs vs dict of allowed.
        differences = [Extra('xxx'), Missing('yyy')]
        allowed = {'foo': Extra('xxx'), 'bar': Missing('yyy')}

        regex = ("expects mapping of differences but found 'list' of "
                 "differences")
        with self.assertRaisesRegex(ValueError, regex):
            with allow_only(allowed):
                raise DataError('example error', differences)
예제 #27
0
    def test_extra(self):
        data = [('label1', 'label2', 'value'), ('a', 'x', '6'),
                ('b', 'y', '7')]
        self.subject = MinimalSource(data)

        with self.assertRaises(DataError) as cm:
            required_set = set(['label1', 'value'])
            self.assertSubjectColumns(required=required_set)  # <- test assert

        differences = cm.exception.differences
        self.assertEqual(set(differences), set([Extra('label2')]))
예제 #28
0
    def test_keyword_combinations(self):
        in_diffs = {
            ('AAA', 'XXX'): Missing('foo'),
            ('BBB', 'YYY'): Missing('foo'),
            ('CCC', 'XXX'): Extra('bar'),
            ('DDD', 'XXX'): Missing('foo')
        }

        def fn1(key1, key2):
            return key2 == 'XXX'

        def fn2(diff):
            return diff.value == 'foo'

        with self.assertRaises(DataError) as cm:
            with allow_any(keys=fn1, diffs=fn2):
                raise DataError('example error', in_diffs)

        rejected = cm.exception.differences
        self.assertEqual(rejected, {
            ('BBB', 'YYY'): Missing('foo'),
            ('CCC', 'XXX'): Extra('bar')
        })
예제 #29
0
    def test_extra(self):
        ref = [
            ('label1', 'label2'),
            ('a', 'x'),
            ('b', 'y'),
            #('c', 'z'), <- Intentionally omitted.
        ]
        self.reference = MinimalSource(ref)

        with self.assertRaises(DataError) as cm:
            self.assertSubjectSet('label1')

        differences = cm.exception.differences
        self.assertEqual(differences, [Extra('c')])
예제 #30
0
    def test_kwds(self):
        diff_set = set([
            Missing('xxx', aaa='foo'),
            Missing('yyy', aaa='bar'),
            Extra('zzz', aaa='foo'),
        ])

        with self.assertRaises(DataError) as cm:
            # Allows 2 with aaa='foo' and there are two (only aaa='bar' is rejected).
            with allow_limit(2, 'example message', aaa='foo'):
                raise DataError('example error', diff_set)
        rejected = set(cm.exception.differences)
        self.assertEqual(rejected, set([Missing('yyy', aaa='bar')]))

        with self.assertRaises(DataError) as cm:
            # Allows 1 with aaa='foo' but there are 2 (all are rejected)!
            with allow_limit(1, 'example message', aaa='foo'):
                raise DataError('example error', diff_set)
        rejected = set(cm.exception.differences)
        self.assertEqual(rejected, diff_set)